Fix some memory leaks.
[bluesky.git] / bluesky / cloudlog.c
index 0d91e0d..49099e1 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;
@@ -132,9 +132,15 @@ void bluesky_cloudlog_unref(BlueSkyCloudLog *log)
         g_hash_table_remove(fs->locations, &log->id);
         g_mutex_unlock(fs->lock);
 
+        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);
     }
@@ -179,22 +185,11 @@ BlueSkyCloudPointer bluesky_cloudlog_serialize(BlueSkyCloudLog *log,
         return log->location;
     }
 
-    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
-        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);
@@ -247,6 +242,7 @@ void bluesky_cloudlog_write_log(BlueSkyFS *fs)
     while (state->inode_list != NULL) {
         BlueSkyCloudLog *log = (BlueSkyCloudLog *)state->inode_list->data;
         bluesky_cloudlog_serialize(log, state);
+        bluesky_cloudlog_unref(log);
         state->inode_list = g_list_delete_link(state->inode_list,
                                                state->inode_list);
     }
@@ -266,6 +262,8 @@ void bluesky_cloudlog_write_log(BlueSkyFS *fs)
 
         state->location.sequence++;
         state->location.offset = 0;
+    } else {
+        g_string_free(state->data, TRUE);
     }
 
     state->data = NULL;