}
static inline void
-eina_lock_free(Eina_Lock mutex)
+eina_lock_free(Eina_Lock *mutex)
{
- pthread_mutex_destroy(&mutex);
+ pthread_mutex_destroy(mutex);
}
static inline Eina_Bool
-eina_lock_take(Eina_Lock mutex)
+eina_lock_take(Eina_Lock *mutex)
{
if (_threads_activated)
- return (pthread_mutex_lock(&mutex) == 0) ? EINA_TRUE : EINA_FALSE;
+ return (pthread_mutex_lock(mutex) == 0) ? EINA_TRUE : EINA_FALSE;
return EINA_FALSE;
}
static inline Eina_Bool
-eina_lock_take_try(Eina_Lock mutex)
+eina_lock_take_try(Eina_Lock *mutex)
{
if (_threads_activated)
- return (pthread_mutex_trylock(&mutex) == 0) ? EINA_TRUE : EINA_FALSE;
+ return (pthread_mutex_trylock(mutex) == 0) ? EINA_TRUE : EINA_FALSE;
return EINA_FALSE;
}
static inline Eina_Bool
-eina_lock_release(Eina_Lock mutex)
+eina_lock_release(Eina_Lock *mutex)
{
if (_threads_activated)
- return (pthread_mutex_unlock(&mutex) == 0) ? EINA_TRUE : EINA_FALSE;
+ return (pthread_mutex_unlock(mutex) == 0) ? EINA_TRUE : EINA_FALSE;
return EINA_FALSE;
}
}
static inline void
-eina_lock_free(Eina_Lock mutex)
+eina_lock_free(Eina_Lock *mutex)
{
- DeleteCriticalSection(&mutex);
+ DeleteCriticalSection(mutex);
}
static inline Eina_Bool
-eina_lock_take(Eina_Lock mutex)
+eina_lock_take(Eina_Lock *mutex)
{
if (!_threads_activated) return EINA_FALSE;
- EnterCriticalSection(&mutex);
+ EnterCriticalSection(mutex);
return EINA_TRUE;
}
static inline Eina_Bool
-eina_lock_take_try(Eina_Lock mutex)
+eina_lock_take_try(Eina_Lock *mutex)
{
if (!_threads_activated) return EINA_FALSE;
- return TryEnterCriticalSection(&mutex) == 0 ? EINA_FALSE : EINA_TRUE;
+ return TryEnterCriticalSection(mutex) == 0 ? EINA_FALSE : EINA_TRUE;
}
static inline Eina_Bool
-eina_lock_release(Eina_Lock mutex)
+eina_lock_release(Eina_Lock *mutex)
{
if (!_threads_activated) return EINA_FALSE;
- LeaveCriticalSection(&mutex);
+ LeaveCriticalSection(mutex);
return EINA_TRUE;
}
}
static inline void
-eina_lock_free(Eina_Lock mutex)
+eina_lock_free(Eina_Lock *mutex)
{
- CloseHandle(mutex);
+ CloseHandle(*mutex);
}
static inline Eina_Bool
-eina_lock_take(Eina_Lock mutex)
+eina_lock_take(Eina_Lock *mutex)
{
DWORD res;
if (!_threads_activated) return EINA_FALSE;
- res = WaitForSingleObject(mutex, INFINITE);
+ res = WaitForSingleObject(*mutex, INFINITE);
if ((res == WAIT_ABANDONED) || (res == WAIT_FAILED))
return EINA_FALSE;
}
static inline Eina_Bool
-eina_lock_take_try(Eina_Lock mutex)
+eina_lock_take_try(Eina_Lock *mutex)
{
- return eina_lock_take(mutex);
+ return eina_lock_take(*mutex);
}
static inline Eina_Bool
-eina_lock_release(Eina_Lock mutex)
+eina_lock_release(Eina_Lock *mutex)
{
if (!_threads_activated) return EINA_FALSE;
- return ReleaseMutex(mutex);
+ return ReleaseMutex(*mutex);
}
#endif
static inline Eina_Bool eina_lock_new(Eina_Lock *mutex);
-static inline void eina_lock_free(Eina_Lock mutex);
-static inline Eina_Bool eina_lock_take(Eina_Lock mutex);
-static inline Eina_Bool eina_lock_take_try(Eina_Lock mutex);
-static inline Eina_Bool eina_lock_release(Eina_Lock mutex);
+static inline void eina_lock_free(Eina_Lock *mutex);
+static inline Eina_Bool eina_lock_take(Eina_Lock *mutex);
+static inline Eina_Bool eina_lock_take_try(Eina_Lock *mutex);
+static inline Eina_Bool eina_lock_release(Eina_Lock *mutex);
/**
* @}
{
_eina_shutdown_from_desc(_eina_desc_setup + _eina_desc_setup_len);
- eina_lock_free(_mutex);
+ eina_lock_free(&_mutex);
}
return _eina_main_count;
int ret;
- eina_lock_take(_mutex);
+ eina_lock_take(&_mutex);
++_eina_main_thread_count;
ret = _eina_main_thread_count;
if(_eina_main_thread_count > 1)
{
- eina_lock_release(_mutex);
+ eina_lock_release(&_mutex);
return ret;
}
eina_log_threads_init();
_threads_activated = EINA_TRUE;
- eina_lock_release(_mutex);
+ eina_lock_release(&_mutex);
return ret;
#else
#ifdef EFL_HAVE_THREADS
int ret;
- eina_lock_take(_mutex);
+ eina_lock_take(&_mutex);
ret = --_eina_main_thread_count;
if(_eina_main_thread_count > 0)
{
- eina_lock_release(_mutex);
+ eina_lock_release(&_mutex);
return ret;
}
eina_share_common_threads_shutdown();
eina_log_threads_shutdown();
- eina_lock_release(_mutex);
+ eina_lock_release(&_mutex);
_threads_activated = EINA_FALSE;
#include "eina_rbtree.h"
#include "eina_error.h"
#include "eina_log.h"
+#include "eina_lock.h"
/* undefs EINA_ARG_NONULL() so NULL checks are not compiled out! */
#include "eina_safety_checks.h"
Eina_Share_Common_Node builtin_node;
};
-#ifdef EFL_HAVE_THREADS
Eina_Bool _share_common_threads_activated = EINA_FALSE;
-# ifdef EFL_HAVE_POSIX_THREADS
-static pthread_mutex_t _mutex_big = PTHREAD_MUTEX_INITIALIZER;
-# define SHARE_COMMON_LOCK_BIG() if(_share_common_threads_activated) \
- pthread_mutex_lock(&_mutex_big)
-# define SHARE_COMMON_UNLOCK_BIG() if(_share_common_threads_activated) \
- pthread_mutex_unlock(&_mutex_big)
-# else /* EFL_HAVE_WIN32_THREADS */
-static HANDLE _mutex_big = NULL;
-# define SHARE_COMMON_LOCK_BIG() if(_share_common_threads_activated) \
- WaitForSingleObject(_mutex_big, INFINITE)
-# define SHARE_COMMON_UNLOCK_BIG() if(_share_common_threads_activated) \
- ReleaseMutex(_mutex_big)
-
-# endif /* EFL_HAVE_WIN32_THREADS */
-#else /* EFL_HAVE_THREADS */
-# define SHARE_COMMON_LOCK_BIG() do {} while (0)
-# define SHARE_COMMON_UNLOCK_BIG() do {} while (0)
-#endif
+static Eina_Lock _mutex_big;
#ifdef EINA_SHARE_COMMON_USAGE
struct _Eina_Share_Common_Population
void
eina_share_common_population_add(Eina_Share *share, int slen)
{
- SHARE_COMMON_LOCK_BIG();
+ eina_lock_take(&_mutex_big);
share->population.count++;
if (share->population.count > share->population.max)
share->population_group[slen].count;
}
- SHARE_COMMON_UNLOCK_BIG();
+ eina_lock_release(&_mutex_big);
}
void
eina_share_common_population_del(Eina_Share *share, int slen)
{
- SHARE_COMMON_LOCK_BIG();
+ eina_lock_take(&_mutex_big);
share->population.count--;
if (slen < 4)
share->population_group[slen].count--;
- SHARE_COMMON_UNLOCK_BIG();
+ eina_lock_release(&_mutex_big);
}
static void
{
Eina_Share_Common_Node *node;
- SHARE_COMMON_LOCK_BIG();
+ eina_lock_take(&_mutex_big);
fdata->used += sizeof(Eina_Share_Common_Head);
for (node = head->head; node; node = node->next)
fdata->unique++;
}
- SHARE_COMMON_UNLOCK_BIG();
+ eina_lock_release(&_mutex_big);
return EINA_TRUE;
}
EINA_MAGIC_SET(share->share, EINA_MAGIC_SHARE);
_eina_share_common_population_init(share);
+
+ eina_lock_new(&_mutex_big);
return EINA_TRUE;
}
unsigned int i;
Eina_Share *share = *_share;
- SHARE_COMMON_LOCK_BIG();
+ eina_lock_take(&_mutex_big);
_eina_share_common_population_stats(share);
_eina_share_common_log_dom = -1;
}
- SHARE_COMMON_UNLOCK_BIG();
+ eina_lock_release(&_mutex_big);
+
+ eina_lock_free(&_mutex_big);
free(*_share);
*_share = NULL;
hash_num = hash & 0xFF;
hash = (hash >> 8) & EINA_SHARE_COMMON_MASK;
- SHARE_COMMON_LOCK_BIG();
+ eina_lock_take(&_mutex_big);
p_bucket = share->share->buckets + hash_num;
ed = _eina_share_common_find_hash(*p_bucket, hash);
str,
slen,
null_size);
- SHARE_COMMON_UNLOCK_BIG();
+ eina_lock_release(&_mutex_big);
return s;
}
- EINA_MAGIC_CHECK_SHARE_COMMON_HEAD(ed, SHARE_COMMON_UNLOCK_BIG(), NULL);
+ EINA_MAGIC_CHECK_SHARE_COMMON_HEAD(ed, eina_lock_release(&_mutex_big), NULL);
el = _eina_share_common_head_find(ed, str, slen);
if (el)
{
EINA_MAGIC_CHECK_SHARE_COMMON_NODE(el,
share->node_magic,
- SHARE_COMMON_UNLOCK_BIG());
+ eina_lock_release(&_mutex_big));
el->references++;
- SHARE_COMMON_UNLOCK_BIG();
+ eina_lock_release(&_mutex_big);
return el->str;
}
el = _eina_share_common_node_alloc(slen, null_size);
if (!el)
{
- SHARE_COMMON_UNLOCK_BIG();
+ eina_lock_release(&_mutex_big);
return NULL;
}
ed->head = el;
_eina_share_common_population_head_add(share, ed);
- SHARE_COMMON_UNLOCK_BIG();
+ eina_lock_release(&_mutex_big);
return el->str;
}
if (!str)
return NULL;
- SHARE_COMMON_LOCK_BIG();
+ eina_lock_take(&_mutex_big);
node = _eina_share_common_node_from_str(str, share->node_magic);
if (!node) return str;
node->references++;
DBG("str=%p refs=%u", str, node->references);
- SHARE_COMMON_UNLOCK_BIG();
+ eina_lock_release(&_mutex_big);
eina_share_common_population_add(share, node->length);
if (!str)
return;
- SHARE_COMMON_LOCK_BIG();
+ eina_lock_take(&_mutex_big);
node = _eina_share_common_node_from_str(str, share->node_magic);
if (!node)
{
node->references--;
DBG("str=%p refs=%u", str, node->references);
- SHARE_COMMON_UNLOCK_BIG();
+ eina_lock_release(&_mutex_big);
return;
}
if (!ed)
goto on_error;
- EINA_MAGIC_CHECK_SHARE_COMMON_HEAD(ed, SHARE_COMMON_UNLOCK_BIG());
+ EINA_MAGIC_CHECK_SHARE_COMMON_HEAD(ed, eina_lock_release(&_mutex_big));
if (!_eina_share_common_head_remove_node(ed, node))
goto on_error;
else
_eina_share_common_population_head_del(share, ed);
- SHARE_COMMON_UNLOCK_BIG();
+ eina_lock_release(&_mutex_big);
return;
on_error:
- SHARE_COMMON_UNLOCK_BIG();
+ eina_lock_release(&_mutex_big);
/* possible segfault happened before here, but... */
CRITICAL("EEEK trying to del non-shared share_common \"%s\"", str);
}
printf("DDD: len ref string\n");
printf("DDD:-------------------\n");
- SHARE_COMMON_LOCK_BIG();
+ eina_lock_take(&_mutex_big);
for (i = 0; i < EINA_SHARE_COMMON_BUCKETS; i++)
{
if (!share->share->buckets[i])
share->population_group[i].max);
#endif
- SHARE_COMMON_UNLOCK_BIG();
+ eina_lock_release(&_mutex_big);
}
/**
#include <stdio.h>
#include <string.h>
-#ifdef EFL_HAVE_POSIX_THREADS
-# include <pthread.h>
-#endif
-
#ifdef HAVE_EVIL
# include <Evil.h>
#endif
#include "eina_error.h"
#include "eina_log.h"
#include "eina_stringshare.h"
+#include "eina_lock.h"
/* undefs EINA_ARG_NONULL() so NULL checks are not compiled out! */
#include "eina_safety_checks.h"
static Eina_Share *stringshare_share;
static const char EINA_MAGIC_STRINGSHARE_NODE_STR[] = "Eina Stringshare Node";
-#ifdef EFL_HAVE_THREADS
extern Eina_Bool _share_common_threads_activated;
-
-# ifdef EFL_HAVE_POSIX_THREADS
-static pthread_mutex_t _mutex_small = PTHREAD_MUTEX_INITIALIZER;
-# define STRINGSHARE_LOCK_SMALL() if(_share_common_threads_activated) \
- pthread_mutex_lock(&_mutex_small)
-# define STRINGSHARE_UNLOCK_SMALL() if(_share_common_threads_activated) \
- pthread_mutex_unlock(&_mutex_small)
-# else /* EFL_HAVE_WIN32_THREADS */
-static HANDLE _mutex_small = NULL;
-# define STRINGSHARE_LOCK_SMALL() if(_share_common_threads_activated) \
- WaitForSingleObject(_mutex_small, INFINITE)
-# define STRINGSHARE_UNLOCK_SMALL() if(_share_common_threads_activated) \
- ReleaseMutex(_mutex_small)
-
-# endif /* EFL_HAVE_WIN32_THREADS */
-#else /* EFL_HAVE_THREADS */
-# define STRINGSHARE_LOCK_SMALL() do {} while (0)
-# define STRINGSHARE_UNLOCK_SMALL() do {} while (0)
-#endif
+static Eina_Lock _mutex_small;
/* Stringshare optimizations */
static const unsigned char _eina_stringshare_single[512] = {
static void
_eina_stringshare_small_init(void)
{
+ eina_lock_new(&_mutex_small);
memset(&_eina_small_share, 0, sizeof(_eina_small_share));
}
free(bucket);
*p_bucket = NULL;
}
+
+ eina_lock_free(&_mutex_small);
}
static void
else if (slen < 4)
{
eina_share_common_population_del(stringshare_share, slen);
- STRINGSHARE_LOCK_SMALL();
+ eina_lock_take(&_mutex_small);
_eina_stringshare_small_del(str, slen);
- STRINGSHARE_UNLOCK_SMALL();
+ eina_lock_release(&_mutex_small);
return;
}
{
const char *s;
- STRINGSHARE_LOCK_SMALL();
+ eina_lock_take(&_mutex_small);
s = _eina_stringshare_small_add(str, slen);
- STRINGSHARE_UNLOCK_SMALL();
+ eina_lock_release(&_mutex_small);
return s;
}
const char *s;
eina_share_common_population_add(stringshare_share, slen);
- STRINGSHARE_LOCK_SMALL();
+ eina_lock_take(&_mutex_small);
s = _eina_stringshare_small_add(str, slen);
- STRINGSHARE_UNLOCK_SMALL();
+ eina_lock_release(&_mutex_small);
return s;
}
Chained_Pool *p = NULL;
void *mem;
- if (!eina_lock_take(pool->mutex))
+ if (!eina_lock_take(&pool->mutex))
{
#ifdef EFL_DEBUG_THREADS
assert(pthread_equal(pool->self, pthread_self()));
p = _eina_chained_mp_pool_new(pool);
if (!p)
{
- eina_lock_release(pool->mutex);
+ eina_lock_release(&pool->mutex);
return NULL;
}
mem = _eina_chained_mempool_alloc_in(pool, p);
- eina_lock_release(pool->mutex);
+ eina_lock_release(&pool->mutex);
return mem;
}
Chained_Pool *p;
// look 4 pool
- if (!eina_lock_take(pool->mutex))
+ if (!eina_lock_take(&pool->mutex))
{
#ifdef EFL_DEBUG_THREADS
assert(pthread_equal(pool->self, pthread_self()));
}
#endif
- eina_lock_release(pool->mutex);
+ eina_lock_release(&pool->mutex);
return;
}
Chained_Pool *tail;
/* FIXME: Improvement - per Chained_Pool lock */
- if (!eina_lock_take(pool->mutex))
+ if (!eina_lock_take(&pool->mutex))
{
#ifdef EFL_DEBUG_THREADS
assert(pthread_equal(pool->self, pthread_self()));
}
/* FIXME: improvement - reorder pool so that the most used one get in front */
- eina_lock_release(pool->mutex);
+ eina_lock_release(&pool->mutex);
}
static void *
VALGRIND_DESTROY_MEMPOOL(mp);
#endif
- eina_lock_free(mp->mutex);
+ eina_lock_free(&mp->mutex);
#ifdef EFL_DEBUG_THREADS
assert(pthread_equal(mp->self, pthread_self()));
#include "eina_trash.h"
#include "eina_inlist.h"
#include "eina_log.h"
+#include "eina_lock.h"
#ifndef NVALGRIND
# include <valgrind/memcheck.h>
Eina_Trash *empty;
Eina_Inlist *over_list;
-#ifdef EFL_HAVE_THREADS
-# ifdef EFL_HAVE_POSIX_THREADS
-# ifdef EFL_DEBUG_THREADS
+#ifdef EFL_DEBUG_THREADS
pthread_t self;
-# endif
- pthread_mutex_t mutex;
-# else
- HANDLE mutex;
-# endif
#endif
+ Eina_Lock mutex;
};
static void *
One_Big *pool = data;
unsigned char *mem = NULL;
-#ifdef EFL_HAVE_THREADS
- if (_threads_activated)
+ if (!eina_lock_take(&pool->mutex))
{
-# ifdef EFL_HAVE_POSIX_THREADS
- pthread_mutex_lock(&pool->mutex);
-# else
- WaitForSingleObject(pool->mutex, INFINITE);
-# endif
- }
-# ifdef EFL_HAVE_POSIX_THREADS
-# ifdef EFL_DEBUG_THREADS
- else
- assert(pthread_equal(pool->self, pthread_self()));
-# endif
-# endif
+#ifdef EFL_DEBUG_THREADS
+ assert(pthread_equal(pool->self, pthread_self()));
#endif
+ }
if (pool->empty)
{
#endif
on_exit:
-#ifdef EFL_HAVE_THREADS
- if (_threads_activated)
- {
-# ifdef EFL_HAVE_POSIX_THREADS
- pthread_mutex_unlock(&pool->mutex);
-# else
- ReleaseMutex(pool->mutex);
-# endif
- }
-#endif
+ eina_lock_release(&pool->mutex);
#ifndef NVALGRIND
VALGRIND_MEMPOOL_ALLOC(pool, mem, pool->item_size);
{
One_Big *pool = data;
-#ifdef EFL_HAVE_THREADS
- if (_threads_activated)
+ if (!eina_lock_take(&pool->mutex))
{
-# ifdef EFL_HAVE_POSIX_THREADS
- pthread_mutex_lock(&pool->mutex);
-# else
- WaitForSingleObject(pool->mutex, INFINITE);
-# endif
- }
-# ifdef EFL_HAVE_POSIX_THREADS
-# ifdef EFL_DEBUG_THREADS
- else
- assert(pthread_equal(pool->self, pthread_self()));
-# endif
-# endif
+#ifdef EFL_DEBUG_THREADS
+ assert(pthread_equal(pool->self, pthread_self()));
#endif
+ }
if ((void *)pool->base <= ptr
&& ptr < (void *)(pool->base + (pool->max * pool->item_size)))
VALGRIND_MEMPOOL_FREE(pool, ptr);
#endif
-#ifdef EFL_HAVE_THREADS
- if (_threads_activated)
- {
-# ifdef EFL_HAVE_POSIX_THREADS
- pthread_mutex_unlock(&pool->mutex);
-# else
- ReleaseMutex(pool->mutex);
-# endif
- }
-#endif
+ eina_lock_release(&pool->mutex);
}
static void *
memcpy((char *)pool->name, context, length);
}
-#ifdef EFL_HAVE_THREADS
-# ifdef EFL_HAVE_POSIX_THREADS
-# ifdef EFL_DEBUG_THREADS
+#ifdef EFL_DEBUG_THREADS
pool->self = pthread_self();
-# endif
- pthread_mutex_init(&pool->mutex, NULL);
-# else
- pool->mutex = CreateMutex(NULL, FALSE, NULL);
-# endif
#endif
+ eina_lock_new(&pool->mutex);
#ifndef NVALGRIND
VALGRIND_CREATE_MEMPOOL(pool, 0, 1);
One_Big *pool = data;
if (!pool) return;
-#ifdef EFL_HAVE_THREADS
- if (_threads_activated)
+ if (!eina_lock_take(&pool->mutex))
{
-# ifdef EFL_HAVE_POSIX_THREADS
- pthread_mutex_lock(&pool->mutex);
-# else
- WaitForSingleObject(pool->mutex, INFINITE);
-# endif
- }
-# ifdef EFL_HAVE_POSIX_THREADS
-# ifdef EFL_DEBUG_THREADS
- else
- assert(pthread_equal(pool->self, pthread_self()));
-# endif
-# endif
+#ifdef EFL_DEBUG_THREADS
+ assert(pthread_equal(pool->self, pthread_self()));
#endif
+ }
if (pool->over > 0)
{
if (pool->base) free(pool->base);
-#ifdef EFL_HAVE_THREADS
- if (_threads_activated)
- {
-# ifdef EFL_HAVE_POSIX_THREADS
- pthread_mutex_unlock(&pool->mutex);
- pthread_mutex_destroy(&pool->mutex);
-# else
- ReleaseMutex(pool->mutex);
- CloseHandle(pool->mutex);
-# endif
- }
-#endif
+ eina_lock_release(&pool->mutex);
+ eina_lock_free(&pool->mutex);
free(pool);
}