]> arthur.barton.de Git - netatalk.git/blobdiff - libatalk/adouble/ad_lock.h
Redesign ad_open API to only use one arg for all flags, fix locking for adouble:v2
[netatalk.git] / libatalk / adouble / ad_lock.h
index 8e7860d2a2c3c3e372ef2c305ba50f04064f352b..7552f241ada095cf71ed327aeb24bb1bc06173d0 100644 (file)
@@ -3,13 +3,25 @@
 
 #include <atalk/adouble.h>
 
-/* this is so that we can keep lists of fds referencing the same file
- * around. that way, we can honor locks created by the same process
+/* this is so that we can keep lists of fds referencing the same file                                                                                                                                                                                                         
+ * around. that way, we can honor locks created by the same process                                                                                                                                                                                                           
  * with the same file. */
 
-#define adf_lock_free(a)                                      \
-    do {                                                      \
-        ;                                                     \
+#define adf_lock_init(a) do { \
+        (a)->adf_lockmax = (a)->adf_lockcount = 0; \
+        (a)->adf_excl = 0;(a)->adf_lock = NULL; \
+    } while (0)
+
+#define adf_lock_free(a) do { \
+        int i;\
+        if (!(a)->adf_lock) \
+            break; \
+        for (i = 0; i < (a)->adf_lockcount; i++) {\
+            adf_lock_t *lock = (a)->adf_lock + i;\
+            if (--(*lock->refcount) < 1)free(lock->refcount); \
+        }\
+        free((a)->adf_lock); \
+        adf_lock_init(a); \
     } while (0)
 
 #endif /* libatalk/adouble/ad_private.h */