X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;ds=sidebyside;f=bluesky%2Fstore.c;h=7c8123c0aef117faec650ab8dc7dbf53c2721a8c;hb=ccd8dcd110e04b43ae1d04a3b1ab058cc1761d8b;hp=ec72ec2d0510fd84dd4230277febd7b90f10bfa8;hpb=c6d5eb1086d5da2a2e7548c5ce3b5efa9ba76f0c;p=bluesky.git diff --git a/bluesky/store.c b/bluesky/store.c index ec72ec2..7c8123c 100644 --- a/bluesky/store.c +++ b/bluesky/store.c @@ -20,6 +20,10 @@ struct _BlueSkyStore { const BlueSkyStoreImplementation *impl; gpointer handle; + + GMutex *lock; + GCond *cond_idle; + int pending; /* Count of operations not yet complete. */ }; GHashTable *store_implementations; @@ -45,6 +49,9 @@ BlueSkyStore *bluesky_store_new(const gchar *type) BlueSkyStore *store = g_new(BlueSkyStore, 1); store->impl = impl; store->handle = handle; + store->lock = g_mutex_new(); + store->cond_idle = g_cond_new(); + store->pending = 0; return store; } @@ -121,6 +128,14 @@ void bluesky_store_async_wait(BlueSkyStoreAsync *async) * function. */ void bluesky_store_async_mark_complete(BlueSkyStoreAsync *async) { + if (async->status != ASYNC_COMPLETE) { + g_mutex_lock(async->store->lock); + async->store->pending--; + if (async->store->pending == 0) + g_cond_broadcast(async->store->cond_idle); + g_mutex_unlock(async->store->lock); + } + async->status = ASYNC_COMPLETE; g_cond_broadcast(async->completion_cond); } @@ -129,7 +144,25 @@ void bluesky_store_async_submit(BlueSkyStoreAsync *async) { BlueSkyStore *store = async->store; + g_mutex_lock(async->store->lock); + async->store->pending++; + g_mutex_unlock(async->store->lock); + store->impl->submit(store->handle, async); + + if (bluesky_options.synchronous_stores) + bluesky_store_async_wait(async); +} + +void bluesky_store_sync(BlueSkyStore *store) +{ + g_mutex_lock(store->lock); + g_print("Waiting for pending store operations to complete...\n"); + while (store->pending > 0) { + g_cond_wait(store->cond_idle, store->lock); + } + g_mutex_unlock(store->lock); + g_print("Operations are complete.\n"); } /* Convenience wrappers that perform a single operation synchronously. */ @@ -138,7 +171,7 @@ 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); @@ -156,7 +189,7 @@ 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);