X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Fstore.c;h=b60bd053c7911a256dc4fe47c0b1173cf60dd84e;hb=4273ee04bdd5d6920d3ff0e5db488b8a2ddab249;hp=13a080ffbec151c5956ed4310af059c644e2d1f4;hpb=c513d64c6a1f7c2ff2bad97db69e2f40ef642167;p=bluesky.git diff --git a/bluesky/store.c b/bluesky/store.c index 13a080f..b60bd05 100644 --- a/bluesky/store.c +++ b/bluesky/store.c @@ -62,6 +62,7 @@ BlueSkyStoreAsync *bluesky_store_async_new(BlueSkyStore *store) async->store = store; async->lock = g_mutex_new(); async->completion_cond = g_cond_new(); + async->refcount = 1; async->status = ASYNC_NEW; async->op = STORE_OP_NONE; async->key = NULL; @@ -72,6 +73,30 @@ BlueSkyStoreAsync *bluesky_store_async_new(BlueSkyStore *store) return async; } +void bluesky_store_async_ref(BlueSkyStoreAsync *async) +{ + if (async == NULL) + return; + + g_atomic_int_inc(&async->refcount); +} + +void bluesky_store_async_unref(BlueSkyStoreAsync *async) +{ + if (async == NULL) + return; + + if (g_atomic_int_dec_and_test(&async->refcount)) { + async->store->impl->cleanup(async->store->handle, async); + g_mutex_free(async->lock); + g_cond_free(async->completion_cond); + g_free(async->key); + bluesky_string_unref(async->data); + g_free(async); + g_print("Freed async\n"); + } +} + /* Block until the given operation has completed. */ void bluesky_store_async_wait(BlueSkyStoreAsync *async) { @@ -87,6 +112,8 @@ void bluesky_store_async_wait(BlueSkyStoreAsync *async) while (async->status != ASYNC_COMPLETE) { g_cond_wait(async->completion_cond, async->lock); } + + g_mutex_unlock(async->lock); } /* Mark an asynchronous operation as complete. This should only be called by @@ -98,18 +125,26 @@ void bluesky_store_async_mark_complete(BlueSkyStoreAsync *async) g_cond_broadcast(async->completion_cond); } +void bluesky_store_async_submit(BlueSkyStoreAsync *async) +{ + BlueSkyStore *store = async->store; + + store->impl->submit(store->handle, async); +} + /* Convenience wrappers that perform a single operation synchronously. */ BlueSkyRCStr *bluesky_store_get(BlueSkyStore *store, const gchar *key) { BlueSkyStoreAsync *async = bluesky_store_async_new(store); async->op = STORE_OP_GET; async->key = g_strdup(key); - store->impl->submit(store->handle, async); + bluesky_store_async_submit(async); bluesky_store_async_wait(async); BlueSkyRCStr *data = async->data; bluesky_string_ref(data); + bluesky_store_async_unref(async); return data; } @@ -121,9 +156,10 @@ void bluesky_store_put(BlueSkyStore *store, async->key = g_strdup(key); bluesky_string_ref(val); async->data = val; - store->impl->submit(store->handle, async); + bluesky_store_async_submit(async); bluesky_store_async_wait(async); + bluesky_store_async_unref(async); } #if 0