diff options
author | Cedric BAIL <cedric.bail@free.fr> | 2011-12-30 13:38:53 +0000 |
---|---|---|
committer | Cedric BAIL <cedric.bail@free.fr> | 2011-12-30 13:38:53 +0000 |
commit | 1c7fab6e94648c1e33ed1c7a210ddf8b47c957c5 (patch) | |
tree | a64f4015fb9e0ba0fc8f9a5f5ac5d67b41c3bd89 | |
parent | 60c9982509239f0eb2885010423c1b8e1fbb1c00 (diff) | |
download | eina-1c7fab6e94648c1e33ed1c7a210ddf8b47c957c5.tar.gz |
eina: add Eina_Semaphore API.
Patch by Vincent Torri.
SVN revision: 66693
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | src/include/eina_inline_lock_posix.x | 48 | ||||
-rw-r--r-- | src/include/eina_inline_lock_void.x | 26 | ||||
-rw-r--r-- | src/include/eina_inline_lock_win32.x | 46 | ||||
-rw-r--r-- | src/include/eina_inline_lock_wince.x | 34 | ||||
-rw-r--r-- | src/include/eina_lock.h | 4 |
7 files changed, 163 insertions, 0 deletions
@@ -173,3 +173,7 @@ 2011-12-28 Cedric Bail * Fix NONNULL argument for eina_hash_find. + +2011-12-30 Vincent Torri + + * Add Eina_Semaphore abstraction API. @@ -6,6 +6,7 @@ Changes since Eina 1.1.0: Additions: * eina_mempool_calloc + * Eina_Semaphore abstraction API Eina 1.1.0 diff --git a/src/include/eina_inline_lock_posix.x b/src/include/eina_inline_lock_posix.x index 1dc59aa..64e049a 100644 --- a/src/include/eina_inline_lock_posix.x +++ b/src/include/eina_inline_lock_posix.x @@ -19,6 +19,15 @@ #ifndef EINA_INLINE_LOCK_POSIX_X_ #define EINA_INLINE_LOCK_POSIX_X_ +#ifdef EINA_UNUSED +# undef EINA_UNUSED +#endif +#ifdef __GNUC__ +# define EINA_UNUSED __attribute__((unused)) +#else +# define EINA_UNUSED +#endif + #include <errno.h> #ifndef __USE_UNIX98 # define __USE_UNIX98 @@ -28,6 +37,8 @@ # include <pthread.h> #endif +#include <semaphore.h> + #include <sys/time.h> #include <stdio.h> @@ -46,6 +57,7 @@ typedef struct _Eina_Lock Eina_Lock; typedef struct _Eina_RWLock Eina_RWLock; typedef struct _Eina_Condition Eina_Condition; typedef pthread_key_t Eina_TLS; +typedef sem_t Eina_Semaphore; struct _Eina_Lock { @@ -505,4 +517,40 @@ eina_tls_set(Eina_TLS key, const void *data) return EINA_TRUE; } +static inline Eina_Bool +eina_semaphore_new(Eina_Semaphore *sem, int count_init) +{ + if (!sem || (count_init <= 0)) + return EINA_FALSE; + + return (sem_init(sem, count_init, 1) == 0) ? EINA_TRUE : EINA_FALSE; +} + +static inline Eina_Bool +eina_semaphore_free(Eina_Semaphore *sem) +{ + if (!sem) + return EINA_FALSE; + + return (sem_destroy(sem) == 0) ? EINA_TRUE : EINA_FALSE; +} + +static inline Eina_Bool +eina_semaphore_lock(Eina_Semaphore *sem) +{ + if (!sem) + return EINA_FALSE; + + return (sem_wait(sem) == 0) ? EINA_TRUE : EINA_FALSE; +} + +static inline Eina_Bool +eina_semaphore_release(Eina_Semaphore *sem, int count_release EINA_UNUSED) +{ + if (!sem) + return EINA_FALSE; + + return (sem_post(sem) == 0) ? EINA_TRUE : EINA_FALSE; +} + #endif diff --git a/src/include/eina_inline_lock_void.x b/src/include/eina_inline_lock_void.x index 8cb9a49..64adcf7 100644 --- a/src/include/eina_inline_lock_void.x +++ b/src/include/eina_inline_lock_void.x @@ -47,6 +47,7 @@ typedef void *Eina_Lock; typedef void *Eina_RWLock; typedef void *Eina_Condition; typedef void *Eina_TLS; +typedef void *Eina_Semaphore; /** * @brief Create a new #Eina_Lock. @@ -239,6 +240,31 @@ eina_tls_set(Eina_TLS key EINA_UNUSED, const void *data EINA_UNUSED) return EINA_FALSE; } +static inline Eina_Bool +eina_semaphore_new(Eina_Semaphore *sem EINA_UNUSED, + int count_init EINA_UNUSED) +{ + return EINA_FALSE; +} + +static inline Eina_Bool +eina_semaphore_free(Eina_Semaphore *sem EINA_UNUSED) +{ + return EINA_FALSE; +} + +static inline Eina_Bool +eina_semaphore_lock(Eina_Semaphore *sem EINA_UNUSED) +{ + return EINA_FALSE; +} + +static inline Eina_Bool +eina_semaphore_release(Eina_Semaphore *sem EINA_UNUSED, + int count_release EINA_UNUSED) +{ + return EINA_FALSE; +} /** * @} diff --git a/src/include/eina_inline_lock_win32.x b/src/include/eina_inline_lock_win32.x index 072095c..7677260 100644 --- a/src/include/eina_inline_lock_win32.x +++ b/src/include/eina_inline_lock_win32.x @@ -58,6 +58,8 @@ struct _Eina_Win32_RWLock typedef DWORD Eina_TLS; +typedef HANDLE Eina_Semaphore; + EAPI extern Eina_Bool _eina_threads_activated; static inline Eina_Bool @@ -463,4 +465,48 @@ eina_tls_set(Eina_TLS key, const void *data) return EINA_TRUE; } +static inline Eina_Bool +eina_semaphore_new(Eina_Semaphore *sem, int count_init) +{ + if (!sem || (count_init <= 0)) + return EINA_FALSE; + + *sem = CreateSemaphore(NULL, count_init, 32767, NULL); + if (!*sem) + return EINA_FALSE; +} + +static inline Eina_Bool +eina_semaphore_free(Eina_Semaphore *sem) +{ + if (!sem) + return EINA_FALSE; + + CloseHandle(*sem); +} + +static inline Eina_Bool +eina_semaphore_lock(Eina_Semaphore *sem) +{ + DWORD res; + + if (!sem) + return EINA_FALSE; + + res = WaitForSingleObject(ev->shared->lock, 0L); + if (res == WAIT_OBJECT_0) + return EINA_TRUE; + + return EINA_FALSE; +} + +static inline Eina_Bool +eina_semaphore_release(Eina_Semaphore *sem, int count_release) +{ + if (!sem) + return EINA_FALSE; + + return ReleaseSemaphore(*sem, count_release, NULL) ? EINA_TRUE : EINA_FALSE; +} + #endif diff --git a/src/include/eina_inline_lock_wince.x b/src/include/eina_inline_lock_wince.x index 965d475..1af1aac 100644 --- a/src/include/eina_inline_lock_wince.x +++ b/src/include/eina_inline_lock_wince.x @@ -19,6 +19,15 @@ #ifndef EINA_INLINE_LOCK_WIN32_X_ #define EINA_INLINE_LOCK_WIN32_X_ +#ifdef EINA_UNUSED +# undef EINA_UNUSED +#endif +#ifdef __GNUC__ +# define EINA_UNUSED __attribute__((unused)) +#else +# define EINA_UNUSED +#endif + #include <windows.h> EAPI extern Eina_Bool _threads_activated; @@ -26,6 +35,7 @@ EAPI extern Eina_Bool _threads_activated; typedef HANDLE Eina_Lock; typedef Eina_Lock Eina_RWLock; typedef DWORD Eina_TLS; +typedef void * Eina_Semaphore; static inline Eina_Bool eina_lock_new(Eina_Lock *mutex) @@ -173,6 +183,30 @@ eina_tls_set(Eina_TLS key, const void *data) return EINA_TRUE; } +static inline Eina_Bool +eina_semaphore_new(Eina_Semaphore *sem EINA_UNUSED, + int count_init EINA_UNUSED) +{ + return EINA_FALSE; +} +static inline Eina_Bool +eina_semaphore_free(Eina_Semaphore *sem EINA_UNUSED) +{ + return EINA_FALSE; +} + +static inline Eina_Bool +eina_semaphore_lock(Eina_Semaphore *sem EINA_UNUSED) +{ + return EINA_FALSE; +} + +static inline Eina_Bool +eina_semaphore_release(Eina_Semaphore *sem EINA_UNUSED, + int count_release EINA_UNUSED) +{ + return EINA_FALSE; +} #endif diff --git a/src/include/eina_lock.h b/src/include/eina_lock.h index 7c26dc0..16f4314 100644 --- a/src/include/eina_lock.h +++ b/src/include/eina_lock.h @@ -81,6 +81,10 @@ static inline void eina_tls_free(Eina_TLS key); static inline void *eina_tls_get(Eina_TLS key); static inline Eina_Bool eina_tls_set(Eina_TLS key, const void *data); +static inline Eina_Bool eina_semaphore_new(Eina_Semaphore *sem, int count_init); +static inline Eina_Bool eina_semaphore_free(Eina_Semaphore *sem); +static inline Eina_Bool eina_semaphore_lock(Eina_Semaphore *sem); +static inline Eina_Bool eina_semaphore_release(Eina_Semaphore *sem, int count_release); #ifdef EINA_HAVE_DEBUG_THREADS # define EINA_MAIN_LOOP_CHECK_RETURN_VAL(val) \ |