* persistent storage. */
void bluesky_serialize_superblock(GString *out, BlueSkyFS *fs);
BlueSkyFS *bluesky_deserialize_superblock(const gchar *buf);
-void bluesky_serialize_inode(GString *out, BlueSkyInode *inode);
+BlueSkyCloudLog *bluesky_serialize_inode(BlueSkyInode *inode);
gboolean bluesky_deserialize_inode(BlueSkyInode *inode, const gchar *buf);
/* Storage layer. Requests can be performed asynchronously, so these objects
} BlueSkyCloudPointer;
typedef enum {
+ LOGTYPE_INVALID = -1,
LOGTYPE_UNKNOWN = 0,
LOGTYPE_DATA = 1,
LOGTYPE_INODE = 2,
// TODO: Location in journal/cache
int log_seq, log_offset, log_size;
- // Pointers to other objects
- GArray *pointers;
+ // Pointers to other objects. Each link counts towards the reference count
+ // of the pointed-to object. To avoid memory leaks there should be no
+ // cycles in the reference graph.
+ GArray *links;
- // Serialized data, if available in memory (otherwise NULL).
+ // Serialized data, if available in memory (otherwise NULL), and a lock
+ // count which tracks if there are users that require the data to be kept
+ // around.
BlueSkyRCStr *data;
+ int data_lock_count;
};
/* Serialize objects into a log segment to be written to the cloud. */