pyzmq/zmq/utils/mutex.h

83 lines
1.6 KiB
C

/*
* simplified from mutex.c from Foundation Library, in the Public Domain
* https://github.com/rampantpixels/foundation_lib/blob/master/foundation/mutex.c
*
* This file is Copyright (C) PyZMQ Developers
* Distributed under the terms of the Modified BSD License.
*
*/
#pragma once
#if defined(_WIN32)
# include <windows.h>
#else
# include <pthread.h>
#endif
typedef struct {
#if defined(_WIN32)
CRITICAL_SECTION csection;
#else
pthread_mutex_t mutex;
#endif
} mutex_t;
static void
_mutex_initialize(mutex_t* mutex) {
#if defined(_WIN32)
InitializeCriticalSectionAndSpinCount(&mutex->csection, 4000);
#else
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&mutex->mutex, &attr);
pthread_mutexattr_destroy(&attr);
#endif
}
static void
_mutex_finalize(mutex_t* mutex) {
#if defined(_WIN32)
DeleteCriticalSection(&mutex->csection);
#else
pthread_mutex_destroy(&mutex->mutex);
#endif
}
mutex_t*
mutex_allocate(void) {
mutex_t* mutex = (mutex_t*)malloc(sizeof(mutex_t));
_mutex_initialize(mutex);
return mutex;
}
void
mutex_deallocate(mutex_t* mutex) {
if (!mutex)
return;
_mutex_finalize(mutex);
free(mutex);
}
int
mutex_lock(mutex_t* mutex) {
#if defined(_WIN32)
EnterCriticalSection(&mutex->csection);
return 0;
#else
return pthread_mutex_lock(&mutex->mutex);
#endif
}
int
mutex_unlock(mutex_t* mutex) {
#if defined(_WIN32)
LeaveCriticalSection(&mutex->csection);
return 0;
#else
return pthread_mutex_unlock(&mutex->mutex);
#endif
}