Do not signal barrier until all notifiers have run.
[bluesky.git] / bluesky / bluesky-private.h
index 0dd6446..852b04e 100644 (file)
@@ -27,7 +27,7 @@ BlueSkyFS *bluesky_new_fs(gchar *name);
 void bluesky_serialize_superblock(GString *out, BlueSkyFS *fs);
 BlueSkyFS *bluesky_deserialize_superblock(const gchar *buf);
 void bluesky_serialize_inode(GString *out, BlueSkyInode *inode);
-BlueSkyInode *bluesky_deserialize_inode(BlueSkyFS *fs, const gchar *buf);
+gboolean bluesky_deserialize_inode(BlueSkyInode *inode, const gchar *buf);
 
 /* Storage layer.  Requests can be performed asynchronously, so these objects
  * help keep track of operations in progress. */
@@ -36,6 +36,7 @@ typedef enum {
     STORE_OP_GET,
     STORE_OP_PUT,
     STORE_OP_DELETE,
+    STORE_OP_BARRIER,       // Waits for other selected operations to complete
 } BlueSkyStoreOp;
 
 typedef enum {
@@ -45,7 +46,9 @@ typedef enum {
     ASYNC_COMPLETE,         // Operation finished, results available
 } BlueSkyAsyncStatus;
 
-typedef struct {
+struct BlueSkyNotifierList;
+typedef struct _BlueSkyStoreAsync BlueSkyStoreAsync;
+struct _BlueSkyStoreAsync {
     BlueSkyStore *store;
 
     GMutex *lock;
@@ -60,14 +63,34 @@ typedef struct {
     BlueSkyRCStr *data;         /* Data read/to write */
 
     int result;                 /* Result code; 0 for success. */
+    struct BlueSkyNotifierList *notifiers;
+    gint notifier_count;
+
+    /* The barrier waiting on this operation.  Support for more than one
+     * barrier for a single async is not well-supported and should be avoided
+     * if possible. */
+    BlueSkyStoreAsync *barrier;
+
+    bluesky_time_hires start_time;  /* Time operation was submitted. */
 
     gpointer store_private;     /* For use by the storage implementation */
-} BlueSkyStoreAsync;
+};
+
+/* Support for notification lists.  These are lists of one-shot functions which
+ * can be called when certain events--primarily, competed storage
+ * events--occur.  Multiple notifiers can be added, but no particular order is
+ * guaranteed for the notification functions to be called. */
+struct BlueSkyNotifierList {
+    struct BlueSkyNotifierList *next;
+    GFunc func;
+    BlueSkyStoreAsync *async;
+    gpointer user_data;     // Passed to the function when called
+};
 
 /* The abstraction layer for storage, allowing multiple implementations. */
 typedef struct {
     /* Create a new store instance and return a handle to it. */
-    gpointer (*create)();
+    gpointer (*create)(const gchar *path);
 
     /* Clean up any resources used by this store. */
     void (*destroy)(gpointer store);
@@ -84,11 +107,28 @@ void bluesky_store_register(const BlueSkyStoreImplementation *impl,
                             const gchar *name);
 
 BlueSkyStoreAsync *bluesky_store_async_new(BlueSkyStore *store);
+gpointer bluesky_store_async_get_handle(BlueSkyStoreAsync *async);
 void bluesky_store_async_ref(BlueSkyStoreAsync *async);
 void bluesky_store_async_unref(BlueSkyStoreAsync *async);
 void bluesky_store_async_wait(BlueSkyStoreAsync *async);
+void bluesky_store_async_add_notifier(BlueSkyStoreAsync *async,
+                                      GFunc func, gpointer user_data);
 void bluesky_store_async_mark_complete(BlueSkyStoreAsync *async);
 void bluesky_store_async_submit(BlueSkyStoreAsync *async);
+void bluesky_store_sync(BlueSkyStore *store);
+
+void bluesky_store_add_barrier(BlueSkyStoreAsync *barrier,
+                               BlueSkyStoreAsync *async);
+
+void bluesky_inode_start_sync(BlueSkyInode *inode, BlueSkyStoreAsync *barrier);
+
+void bluesky_block_touch(BlueSkyInode *inode, uint64_t i);
+void bluesky_block_fetch(BlueSkyFS *fs, BlueSkyBlock *block,
+                         BlueSkyStoreAsync *barrier);
+void bluesky_block_flush(BlueSkyFS *fs, BlueSkyBlock *block,
+                         BlueSkyStoreAsync *barrier);
+void bluesky_file_flush(BlueSkyInode *inode, BlueSkyStoreAsync *barrier);
+void bluesky_file_drop_cached(BlueSkyInode *inode);
 
 #ifdef __cplusplus
 }