Make kvstore backend in BlueSky asynchronous.
[bluesky.git] / bluesky / store.c
index f8b3a6d..8cf9f0e 100644 (file)
@@ -88,6 +88,11 @@ BlueSkyStoreAsync *bluesky_store_async_new(BlueSkyStore *store)
     return async;
 }
 
+gpointer bluesky_store_async_get_handle(BlueSkyStoreAsync *async)
+{
+    return async->store->handle;
+}
+
 void bluesky_store_async_ref(BlueSkyStoreAsync *async)
 {
     if (async == NULL)
@@ -156,6 +161,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)
@@ -170,12 +177,26 @@ void bluesky_store_async_mark_complete(BlueSkyStoreAsync *async)
         async->notifiers = nl->next;
         g_thread_pool_push(notifier_thread_pool, nl, NULL);
     }
+
+    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) {
@@ -185,12 +206,6 @@ 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);
@@ -205,6 +220,7 @@ static void op_complete(gpointer a, gpointer b)
 {
     BlueSkyStoreAsync *barrier = (BlueSkyStoreAsync *)b;
 
+    bluesky_store_async_ref(barrier);
     g_mutex_lock(barrier->lock);
     barrier->store_private
         = GINT_TO_POINTER(GPOINTER_TO_INT(barrier->store_private) - 1);
@@ -213,6 +229,7 @@ static void op_complete(gpointer a, gpointer b)
         bluesky_store_async_mark_complete(barrier);
     }
     g_mutex_unlock(barrier->lock);
+    bluesky_store_async_unref(barrier);
 }
 
 /* Add the given operation to the barrier.  The barrier will not complete until
@@ -385,10 +402,12 @@ static void filestore_submit(gpointer s, BlueSkyStoreAsync *async)
     switch (async->op) {
     case STORE_OP_GET:
         async->data = filestore_get(async->key);
+        async->result = 0;
         break;
 
     case STORE_OP_PUT:
         filestore_put(async->key, async->data);
+        async->result = 0;
         break;
 
     default: