X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Fstore.c;h=7a63b04acc8a31e612491e610755292a0874a44a;hb=6abd55eff09d83999c7a84e0ee63bdc3100f7666;hp=03d4c4a6425880c478a467e12b25032c25d78abb;hpb=a8339d9810e470f59dffb3e186dd693b751ae04a;p=bluesky.git diff --git a/bluesky/store.c b/bluesky/store.c index 03d4c4a..7a63b04 100644 --- a/bluesky/store.c +++ b/bluesky/store.c @@ -110,9 +110,6 @@ void bluesky_store_async_unref(BlueSkyStoreAsync *async) g_free(async->key); bluesky_string_unref(async->data); g_free(async); - g_log("bluesky/store", G_LOG_LEVEL_DEBUG, - "freeing async"); - g_print("Freed async\n"); } } @@ -159,6 +156,8 @@ void bluesky_store_async_mark_complete(BlueSkyStoreAsync *async) { g_return_if_fail(async->status != ASYNC_COMPLETE); + bluesky_time_hires elapsed = bluesky_now_hires() - async->start_time; + g_mutex_lock(async->store->lock); async->store->pending--; if (async->store->pending == 0) @@ -173,17 +172,26 @@ void bluesky_store_async_mark_complete(BlueSkyStoreAsync *async) async->notifiers = nl->next; g_thread_pool_push(notifier_thread_pool, nl, NULL); } -} -static void test_notifier(gpointer a, gpointer u) -{ - g_print("Notifier called!\n"); + g_log("bluesky/store", G_LOG_LEVEL_DEBUG, + "[%p] complete: elapsed = %"PRIi64" ns", + async, elapsed); } void bluesky_store_async_submit(BlueSkyStoreAsync *async) { BlueSkyStore *store = async->store; + async->start_time = bluesky_now_hires(); + + g_log("bluesky/store", G_LOG_LEVEL_DEBUG, "[%p] submit: %s %s", + async, + async->op == STORE_OP_GET ? "GET" + : async->op == STORE_OP_PUT ? "PUT" + : async->op == STORE_OP_DELETE ? "DELETE" + : async->op == STORE_OP_BARRIER ? "BARRIER" : "???", + async->key); + /* Barriers are handled specially, and not handed down the storage * implementation layer. */ if (async->op == STORE_OP_BARRIER) { @@ -193,17 +201,10 @@ void bluesky_store_async_submit(BlueSkyStoreAsync *async) return; } - g_log("bluesky/store", G_LOG_LEVEL_DEBUG, "submit: %s %s", - async->op == STORE_OP_GET ? "GET" - : async->op == STORE_OP_PUT ? "PUT" - : async->op == STORE_OP_DELETE ? "DELETE" : "???", - async->key); - g_mutex_lock(async->store->lock); async->store->pending++; g_mutex_unlock(async->store->lock); - bluesky_store_async_add_notifier(async, test_notifier, NULL); store->impl->submit(store->handle, async); if (bluesky_options.synchronous_stores) @@ -212,7 +213,6 @@ void bluesky_store_async_submit(BlueSkyStoreAsync *async) static void op_complete(gpointer a, gpointer b) { - BlueSkyStoreAsync *async = (BlueSkyStoreAsync *)a; BlueSkyStoreAsync *barrier = (BlueSkyStoreAsync *)b; g_mutex_lock(barrier->lock); @@ -286,7 +286,6 @@ void bluesky_store_put(BlueSkyStore *store, bluesky_store_async_unref(async); } -#if 0 /* Simple in-memory data store for test purposes. */ typedef struct { GMutex *lock; @@ -327,11 +326,37 @@ static void memstore_put(gpointer s, const gchar *key, BlueSkyRCStr *val) g_hash_table_insert(store->store, g_strdup(key), val); } +static void memstore_submit(gpointer s, BlueSkyStoreAsync *async) +{ + g_return_if_fail(async->status == ASYNC_NEW); + g_return_if_fail(async->op != STORE_OP_NONE); + + switch (async->op) { + case STORE_OP_GET: + async->data = memstore_get(s, async->key); + break; + + case STORE_OP_PUT: + memstore_put(s, async->key, async->data); + break; + + default: + g_warning("Uknown operation type for MemStore: %d\n", async->op); + return; + } + + bluesky_store_async_mark_complete(async); +} + +static void memstore_cleanup(gpointer store, BlueSkyStoreAsync *async) +{ +} + static BlueSkyStoreImplementation memstore_impl = { .create = memstore_create, .destroy = memstore_destroy, - .get = memstore_get, - .put = memstore_put, + .submit = memstore_submit, + .cleanup = memstore_cleanup, }; /* Store implementation which writes data as files to disk. */ @@ -344,7 +369,7 @@ static void filestore_destroy() { } -static BlueSkyRCStr *filestore_get(gpointer s, const gchar *key) +static BlueSkyRCStr *filestore_get(const gchar *key) { gchar *contents = NULL; gsize length; @@ -357,24 +382,49 @@ static BlueSkyRCStr *filestore_get(gpointer s, const gchar *key) return bluesky_string_new(contents, length); } -static void filestore_put(gpointer s, const gchar *key, BlueSkyRCStr *val) +static void filestore_put(const gchar *key, BlueSkyRCStr *val) { g_file_set_contents(key, val->data, val->len, NULL); } +static void filestore_submit(gpointer s, BlueSkyStoreAsync *async) +{ + g_return_if_fail(async->status == ASYNC_NEW); + g_return_if_fail(async->op != STORE_OP_NONE); + + switch (async->op) { + case STORE_OP_GET: + async->data = filestore_get(async->key); + break; + + case STORE_OP_PUT: + filestore_put(async->key, async->data); + break; + + default: + g_warning("Uknown operation type for FileStore: %d\n", async->op); + return; + } + + bluesky_store_async_mark_complete(async); +} + +static void filestore_cleanup(gpointer store, BlueSkyStoreAsync *async) +{ +} + static BlueSkyStoreImplementation filestore_impl = { .create = filestore_create, .destroy = filestore_destroy, - .get = filestore_get, - .put = filestore_put, + .submit = filestore_submit, + .cleanup = filestore_cleanup, }; -#endif void bluesky_store_init() { store_implementations = g_hash_table_new(g_str_hash, g_str_equal); notifier_thread_pool = g_thread_pool_new(notifier_task, NULL, -1, FALSE, NULL); - //bluesky_store_register(&memstore_impl, "mem"); - //bluesky_store_register(&filestore_impl, "file"); + bluesky_store_register(&memstore_impl, "mem"); + bluesky_store_register(&filestore_impl, "file"); }