382
382
#endif /* THREAD && SAFE_MUTEX */
384
#if defined(MY_PTHREAD_FASTMUTEX) && !defined(SAFE_MUTEX)
386
#include "mysys_priv.h"
387
#include "my_static.h"
388
#include <m_string.h>
391
#include <myisampack.h>
392
#include <mysys_err.h>
395
#undef pthread_mutex_t
396
#undef pthread_mutex_init
397
#undef pthread_mutex_lock
398
#undef pthread_mutex_trylock
399
#undef pthread_mutex_unlock
400
#undef pthread_mutex_destroy
401
#undef pthread_cond_wait
402
#undef pthread_cond_timedwait
404
uint32_t mutex_delay(uint32_t delayloops)
411
for (i = 0; i < delayloops * 50; i++)
417
#define MY_PTHREAD_FASTMUTEX_SPINS 8
418
#define MY_PTHREAD_FASTMUTEX_DELAY 4
420
static int cpu_count= 0;
422
int my_pthread_fastmutex_init(my_pthread_fastmutex_t *mp,
423
const pthread_mutexattr_t *attr)
425
if ((cpu_count > 1) && (attr == MY_MUTEX_INIT_FAST))
426
mp->spins= MY_PTHREAD_FASTMUTEX_SPINS;
429
return pthread_mutex_init(&mp->mutex, attr);
432
int my_pthread_fastmutex_lock(my_pthread_fastmutex_t *mp)
436
uint32_t maxdelay= MY_PTHREAD_FASTMUTEX_DELAY;
438
for (i= 0; i < mp->spins; i++)
440
res= pthread_mutex_trylock(&mp->mutex);
448
mutex_delay(maxdelay);
449
maxdelay += ((double) random() / (double) RAND_MAX) *
450
MY_PTHREAD_FASTMUTEX_DELAY + 1;
452
return pthread_mutex_lock(&mp->mutex);
456
void fastmutex_global_init(void)
458
#ifdef _SC_NPROCESSORS_CONF
459
cpu_count= sysconf(_SC_NPROCESSORS_CONF);
463
#endif /* defined(MY_PTHREAD_FASTMUTEX) && !defined(SAFE_MUTEX) */