X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libatalk%2Fadouble%2Fad_lock.h;h=2d15da908bbab2d0673edebcfbb1f258750263f3;hb=d3dff4ba4b8db3131a16641d35a6554be5fb5160;hp=8e7860d2a2c3c3e372ef2c305ba50f04064f352b;hpb=03d38064d07cde04b85a2049281186f1f814c583;p=netatalk.git diff --git a/libatalk/adouble/ad_lock.h b/libatalk/adouble/ad_lock.h index 8e7860d2..2d15da90 100644 --- a/libatalk/adouble/ad_lock.h +++ b/libatalk/adouble/ad_lock.h @@ -7,9 +7,23 @@ * 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 = 0; \ + (a)->adf_lockcount = 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 */