From 4c758549545a91b2088678d8ba6ba5cf3e92d6ac Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Wed, 26 Nov 2008 19:31:26 +0300 Subject: [PATCH] * Add simple locking interface to mem_pool library --- src/mem_pool.c | 31 ++++++++++++++++++++++++++++--- src/mem_pool.h | 5 ++++- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/mem_pool.c b/src/mem_pool.c index f116fff73..a074de62a 100644 --- a/src/mem_pool.c +++ b/src/mem_pool.c @@ -240,9 +240,9 @@ memory_pool_find_pool (memory_pool_t *pool, void *pointer) } static void -memory_pool_spin (struct _pool_chain_shared *chain) +memory_pool_spin (gint *mutex) { - while (!g_atomic_int_compare_and_exchange (&chain->lock, 0, 1)) { + while (!g_atomic_int_compare_and_exchange (mutex, 0, 1)) { /* lock was aqquired */ #ifdef HAVE_NANOSLEEP struct timespec ts; @@ -271,7 +271,7 @@ memory_pool_lock_shared (memory_pool_t *pool, void *pointer) return; } - memory_pool_spin (chain); + memory_pool_spin (&chain->lock); } void memory_pool_unlock_shared (memory_pool_t *pool, void *pointer) @@ -355,6 +355,31 @@ memory_pool_get_size () #endif } +gint* +memory_pool_get_mutex (memory_pool_t *pool) +{ + gint *res; + if (pool != NULL) { + res = memory_pool_alloc_shared (pool, sizeof (gint)); + /* Initialize unlocked */ + *res = 0; + return res; + } + return NULL; +} + +void +memory_pool_lock_mutex (gint *mutex) +{ + memory_pool_spin (mutex); +} + +void +memory_pool_unlock_mutex (gint *mutex) +{ + (void)g_atomic_int_dec_and_test (mutex); +} + /* * vi:ts=4 */ diff --git a/src/mem_pool.h b/src/mem_pool.h index 4027b5de2..22388df70 100644 --- a/src/mem_pool.h +++ b/src/mem_pool.h @@ -49,7 +49,10 @@ void memory_pool_add_destructor (memory_pool_t *pool, pool_destruct_func func, v void* memory_pool_alloc_shared (memory_pool_t *pool, size_t size); void memory_pool_lock_shared (memory_pool_t *pool, void *pointer); void memory_pool_unlock_shared (memory_pool_t *pool, void *pointer); -void memory_pool_delete (memory_pool_t* pool); +void memory_pool_delete (memory_pool_t *pool); +gint* memory_pool_get_mutex (memory_pool_t *pool); +void memory_pool_lock_mutex (gint *mutex); +void memory_pool_unlock_mutex (gint *mutex); void memory_pool_stat (memory_pool_stat_t *st); -- 2.39.5