diff options
author | Suren A. Chilingaryan <csa@dside.dyndns.org> | 2005-08-03 01:48:35 +0000 |
---|---|---|
committer | Suren A. Chilingaryan <csa@dside.dyndns.org> | 2005-08-03 01:48:35 +0000 |
commit | dcd966ba50fa18853c5ae06125a5b08b0ee6b10d (patch) | |
tree | 8147928dbe65fc6b4d83e5cc15d1b3ac5993e0eb /src/rccmutex.c | |
parent | 8b75f9bb6a09d54d634ff661655659951378aa2c (diff) | |
download | librcc-dcd966ba50fa18853c5ae06125a5b08b0ee6b10d.tar.gz librcc-dcd966ba50fa18853c5ae06125a5b08b0ee6b10d.tar.bz2 librcc-dcd966ba50fa18853c5ae06125a5b08b0ee6b10d.tar.xz librcc-dcd966ba50fa18853c5ae06125a5b08b0ee6b10d.zip |
Language Fixes and Improvements
- rccmutex
- Language autodetection fixes and improvements
- Language translation fixes and improvements
- The current state is near to be usable
Diffstat (limited to 'src/rccmutex.c')
-rw-r--r-- | src/rccmutex.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/rccmutex.c b/src/rccmutex.c new file mode 100644 index 0000000..e2690fa --- /dev/null +++ b/src/rccmutex.c @@ -0,0 +1,73 @@ +#include <stdlib.h> +#include <time.h> + +#include "rccmutex.h" + +#define RCC_MUTEX_SLEEP 500 + +rcc_mutex rccMutexCreate() { + rcc_mutex mutex; + + mutex = (rcc_mutex)malloc(sizeof(rcc_mutex_s)); + if (mutex) { +#ifdef HAVE_PTHREAD + pthread_mutex_init(&mutex->mutex, NULL); +#else + mutex->mutex = 0; +#endif /* HAVE_PTHREAD */ + } + return mutex; +} + +void rccMutexFree(rcc_mutex mutex) { + if (mutex) { +#ifdef HAVE_PTHREAD + pthread_mutex_destroy(&mutex->mutex); +#endif /* HAVE_PTHREAD */ + free(mutex); + } +} + +int rccMutexLock(rcc_mutex mutex) { +#ifndef HAVE_PTHREAD + struct timespec ts; +#endif /* !HAVE_PTHREAD */ + + if (!mutex) return -1; + +#ifdef HAVE_PTHREAD + return pthread_mutex_lock(&mutex->mutex); +#else + while (mutex->mutex) { + ts.tv_sec = RCC_MUTEX_SLEEP / 1000000; + ts.tv_nsec = (RCC_MUTEX_SLEEP % 1000000)*1000; + nanosleep(&ts, NULL); + } + mutex->mutex = 1; + + return 0; +#endif /* HAVE_PTHREAD */ +} + +int rccMutexTryLock(rcc_mutex mutex) { + if (!mutex) return -1; + +#ifdef HAVE_PTHREAD + return pthread_mutex_trylock(&mutex->mutex); +#else + if (mutex->mutex) return -1; + mutex->mutex = 1; + return 0; +#endif /* HAVE_PTHREAD */ +} + +void rccMutexUnLock(rcc_mutex mutex) { + if (!mutex) return; +#ifdef HAVE_PTHREAD + pthread_mutex_unlock(&mutex->mutex); +#else + mutex->mutex = 0; +#endif /* HAVE_PTHREAD */ +} + + |