X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Fcloudlog.c;h=49099e1a66f7934014304b80035d2b33a8d877a0;hb=8ae6b69c5d727704d4414e370c165dd71668031c;hp=6b802331da4dc8c6db9c47ace825e64cb5614f35;hpb=f2586554fd55cd3cc1be65ac33d1122d00372133;p=bluesky.git diff --git a/bluesky/cloudlog.c b/bluesky/cloudlog.c index 6b80233..49099e1 100644 --- a/bluesky/cloudlog.c +++ b/bluesky/cloudlog.c @@ -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); } @@ -180,23 +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 - 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); @@ -269,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;