}
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;
return;
}
- memory_pool_spin (chain);
+ memory_pool_spin (&chain->lock);
}
void memory_pool_unlock_shared (memory_pool_t *pool, void *pointer)
#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
*/
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);