-adding missing break statements
[oweals/gnunet.git] / src / include / gnunet_lockmanager_service.h
index f2952a7420ad1102ed0d9bda9f12be9c6b8dd978..ecc2a8d501086bcaf19d2a12907835b98b08834f 100644 (file)
@@ -4,7 +4,7 @@
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 2, or (at your
+     by the Free Software Foundation; either version 3, or (at your
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
@@ -35,6 +35,8 @@ extern "C"
 #endif
 #endif
 
+#include "gnunet_configuration_lib.h"
+
 /**
  * Opaque handle for the lockmanager service
  */
@@ -46,15 +48,10 @@ struct GNUNET_LOCKMANAGER_Handle;
  *
  * @param cfg the configuration to use
  *
- * @param domain_name the name of the locking domain. If the locking domain
- *          isn't existing in the service it will be created. Clients who want
- *          to share locks must use the same name for the locking domain
- *
  * @return upon success the handle to the service; NULL upon error
  */
 struct GNUNET_LOCKMANAGER_Handle *
-GNUNET_LOCKMANAGER_connect (const struct GNUNET_CONFIGURATION_Handle *cfg,
-                            const char *domain_name);
+GNUNET_LOCKMANAGER_connect (const struct GNUNET_CONFIGURATION_Handle *cfg);
 
 
 /**
@@ -67,15 +64,43 @@ GNUNET_LOCKMANAGER_disconnect (struct GNUNET_LOCKMANAGER_Handle *handle);
 
 
 /**
- * This callback will be called after a locking operation has been
- * attempted. This callback will not be called when the LockingRequest has been
- * cancelled.
+ * Enumeration for status
+ */
+enum GNUNET_LOCKMANAGER_Status
+  {
+    /**
+     * Signifies a successful operation
+     */
+    GNUNET_LOCKMANAGER_SUCCESS = 1,
+
+    /**
+     * Used to signal that a lock is no longer valid. It must then be released
+     */
+    GNUNET_LOCKMANAGER_RELEASE
+  };
+
+
+/**
+ * This callback will be called when a lock has been successfully acquired or
+ * when an acquired lock has been lost (happens when the lockmanager service
+ * crashes/restarts).
  *
  * @param cls the closure from GNUNET_LOCKMANAGER_lock call
- * @param lock the lock for which has been locked successfully
+ *
+ * @param domain_name the locking domain of the lock
+ *
+ * @param lock the lock for which this status is relevant
+ *
+ * @param status GNUNET_LOCKMANAGER_SUCCESS if the lock has been successfully
+ *          acquired; GNUNET_LOCKMANAGER_RELEASE when the acquired lock is
+ *          lost.
  */
-typedef void (*GNUNET_LOCKMANAGER_CompletionCallback) (void *cls,
-                                                       unsigned int lock);
+typedef void
+(*GNUNET_LOCKMANAGER_StatusCallback) (void *cls,
+                                      const char *domain_name,
+                                      uint32_t lock,
+                                      enum GNUNET_LOCKMANAGER_Status
+                                      status);
 
 
 /**
@@ -85,28 +110,42 @@ struct GNUNET_LOCKMANAGER_LockingRequest;
 
 
 /**
- * Tries to lock the given lock
+ * Tries to acquire the given lock(even if the lock has been lost) until the
+ * request is called. If the lock is available the status_cb will be
+ * called. If the lock is busy then the request is queued and status_cb
+ * will be called when the lock has been made available and acquired by us.
  *
  * @param handle the handle to the lockmanager service
+ *
+ * @param domain_name name of the locking domain. Clients who want to share
+ *          locks must use the same name for the locking domain. Also the
+ *          domain_name should be selected with the prefix
+ *          "GNUNET_<PROGRAM_NAME>_" to avoid domain name collisions.
+ *
+ *
  * @param lock which lock to lock
- * @param completion_cb the callback to be called when locking is successful
- * @param completion_cb_cls the closure to the above callback
  *
- * @return the locking request handle for this request. It will be invalidated
- *           when completion_cb is called.
+ * @param status_cb the callback for signalling when the lock is acquired and
+ *          when it is lost
+ *
+ * @param status_cb_cls the closure to the above callback
+ *
+ * @return the locking request handle for this request
  */
 struct GNUNET_LOCKMANAGER_LockingRequest *
-GNUNET_LOCKMANAGER_try_lock (struct GNUNET_LOCKMANAGER_Handle *handle,
-                             unsigned int lock,
-                             GNUNET_LOCKMANAGER_CompletionCallback
-                             completion_cb,
-                             void *completion_cb_cls);
+GNUNET_LOCKMANAGER_acquire_lock (struct GNUNET_LOCKMANAGER_Handle *handle,
+                                 const char *domain_name,
+                                 uint32_t lock,
+                                 GNUNET_LOCKMANAGER_StatusCallback
+                                 status_cb,
+                                 void *status_cb_cls);
 
 
 /**
  * Function to cancel the locking request generated by
- * GNUNET_LOCKMANAGER_try_lock. This should be used on a LockingRequest before
- * the completion_cb for the associated lock is called.
+ * GNUNET_LOCKMANAGER_acquire_lock. If the lock is acquired by us then the lock
+ * is released. GNUNET_LOCKMANAGER_StatusCallback will not be called upon any
+ * status changes resulting due to this call.
  *
  * @param request the LockingRequest to cancel
  */
@@ -115,18 +154,6 @@ GNUNET_LOCKMANAGER_cancel_request (struct GNUNET_LOCKMANAGER_LockingRequest
                                    *request);
 
 
-/**
- * Unlocks a lock which was locked by us. It does nothing when called on a lock
- * which wasn't locked or was locked by someone else.
- *
- * @param handle the handle to the lockmanager service
- * @param lock which lock to unlock
- */
-void
-GNUNET_LOCKMANAGER_unlock (const struct GNUNET_LOCKMANAGER_Handle *handle,
-                           unsigned int lock);
-
-
 #if 0                           /* keep Emacsens' auto-indent happy */
 {
 #endif