+/* For locking reasons cloudlog unrefs may sometimes need to be performed in
+ * the future. We launch a thread for handling these delayed unreference
+ * requests. */
+static gpointer cloudlog_unref_thread(gpointer q)
+{
+ GAsyncQueue *queue = (GAsyncQueue *)q;
+
+ while (TRUE) {
+ BlueSkyCloudLog *item = (BlueSkyCloudLog *)g_async_queue_pop(queue);
+ bluesky_cloudlog_unref(item);
+ }
+
+ return NULL;
+}
+
+void bluesky_cloudlog_unref_delayed(BlueSkyCloudLog *log)
+{
+ if (log != NULL)
+ g_async_queue_push(log->fs->unref_queue, log);
+}
+
+void bluesky_cloudlog_threads_init(BlueSkyFS *fs)
+{
+ fs->unref_queue = g_async_queue_new();
+ g_thread_create(cloudlog_unref_thread, fs->unref_queue, FALSE, NULL);
+}
+