Make links between cloud log entries direct.
[bluesky.git] / bluesky / cloudlog.c
index 6b80233..30c2db0 100644 (file)
@@ -91,7 +91,7 @@ BlueSkyCloudLog *bluesky_cloudlog_new(BlueSkyFS *fs)
     log->fs = fs;
     log->type = LOGTYPE_UNKNOWN;
     log->id = bluesky_cloudlog_new_id();
-    log->pointers = g_array_new(FALSE, TRUE, sizeof(BlueSkyCloudID));
+    log->links = g_array_new(FALSE, TRUE, sizeof(BlueSkyCloudLog *));
     g_atomic_int_set(&log->refcount, 1);
 
     return log;
@@ -135,7 +135,12 @@ void bluesky_cloudlog_unref(BlueSkyCloudLog *log)
         log->type = LOGTYPE_INVALID;
         g_mutex_free(log->lock);
         g_cond_free(log->cond);
-        g_array_unref(log->pointers);
+        for (int i = 0; i < log->links->len; i++) {
+            BlueSkyCloudLog *c = g_array_index(log->links,
+                                               BlueSkyCloudLog *, i);
+            bluesky_cloudlog_unref(c);
+        }
+        g_array_unref(log->links);
         bluesky_string_unref(log->data);
         g_free(log);
     }
@@ -183,20 +188,11 @@ BlueSkyCloudPointer bluesky_cloudlog_serialize(BlueSkyCloudLog *log,
     g_print("Flushing object %s to cloud...\n",
             bluesky_cloudlog_id_to_string(log->id));
 
-    for (int i = 0; i < log->pointers->len; i++) {
-        BlueSkyCloudID id = g_array_index(log->pointers, BlueSkyCloudID, i);
-        g_print("  ...checking reference %s...\n",
-                bluesky_cloudlog_id_to_string(id));
-        g_mutex_lock(log->fs->lock);
-        BlueSkyCloudLog *log2
-            = (BlueSkyCloudLog *)g_hash_table_lookup(log->fs->locations, &id);
-        // TODO: refcount
-        bluesky_cloudlog_fetch(log2);
-        g_assert(log2 != NULL);
-        bluesky_cloudlog_ref(log2);
-        g_mutex_unlock(log->fs->lock);
-        bluesky_cloudlog_serialize(log2, state);
-        bluesky_cloudlog_unref(log2);
+    for (int i = 0; i < log->links->len; i++) {
+        BlueSkyCloudLog *ref = g_array_index(log->links,
+                                             BlueSkyCloudLog *, i);
+        if (ref != NULL)
+            bluesky_cloudlog_serialize(ref, state);
     }
 
     g_mutex_lock(log->lock);