Rewrite NFS RPC dispatching.
[bluesky.git] / bluesky / bluesky-private.h
index 0dd6446..d5e5d4f 100644 (file)
@@ -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,6 +46,7 @@ typedef enum {
     ASYNC_COMPLETE,         // Operation finished, results available
 } BlueSkyAsyncStatus;
 
+struct BlueSkyNotifierList;
 typedef struct {
     BlueSkyStore *store;
 
@@ -60,10 +62,22 @@ typedef struct {
     BlueSkyRCStr *data;         /* Data read/to write */
 
     int result;                 /* Result code; 0 for success. */
+    struct BlueSkyNotifierList *notifiers;
 
     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. */
@@ -87,8 +101,20 @@ BlueSkyStoreAsync *bluesky_store_async_new(BlueSkyStore *store);
 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_flush(BlueSkyFS *fs, BlueSkyBlock *block,
+                         BlueSkyStoreAsync *barrier);
+void bluesky_file_flush(BlueSkyInode *inode, BlueSkyStoreAsync *barrier);
 
 #ifdef __cplusplus
 }