+/* Helper function for updating memory usage statistics for a filesystem (the
+ * cache_log_* variables). This will increment (type=1) or decrement (type=-1)
+ * the counter associated with the current state of the cloud log item. The
+ * item should be locked or otherwise protected from concurrent access. */
+void bluesky_cloudlog_stats_update(BlueSkyCloudLog *log, int type)
+{
+ BlueSkyFS *fs = log->fs;
+
+ if (log->location_flags & CLOUDLOG_CLOUD) {
+ g_atomic_int_add(&fs->cache_log_cloud, type);
+ } else if (log->location_flags & CLOUDLOG_JOURNAL) {
+ g_atomic_int_add(&fs->cache_log_journal, type);
+ } else if (log->pending_write & CLOUDLOG_JOURNAL) {
+ g_atomic_int_add(&fs->cache_log_journal, type);
+ } else if (log->data != NULL) {
+ g_atomic_int_add(&fs->cache_log_dirty, type);
+ }
+}
+
+/* The reference held by the hash table does not count towards the reference
+ * count. When a new object is created, it initially has a reference count of
+ * 1 for the creator, and similarly fetching an item from the hash table will
+ * also create a reference. If the reference count drops to zero,
+ * bluesky_cloudlog_unref attempts to remove the object from the hash
+ * table--but there is a potential race since another thread might read the
+ * object from the hash table at the same time. So an object with a reference
+ * count of zero may still be resurrected, in which case we need to abort the
+ * destruction. Once the object is gone from the hash table, and if the
+ * reference count is still zero, it can actually be deleted. */