mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-31 22:45:39 +00:00
clean up debugging, add magic
This commit is contained in:
@@ -1,4 +1,6 @@
|
|||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <isc/assertions.h>
|
#include <isc/assertions.h>
|
||||||
#include <isc/unexpect.h>
|
#include <isc/unexpect.h>
|
||||||
#include <isc/boolean.h>
|
#include <isc/boolean.h>
|
||||||
@@ -15,21 +17,23 @@
|
|||||||
#define WAIT(cvp, lp) \
|
#define WAIT(cvp, lp) \
|
||||||
INSIST(isc_condition_wait((cvp), (lp)) == ISC_R_SUCCESS);
|
INSIST(isc_condition_wait((cvp), (lp)) == ISC_R_SUCCESS);
|
||||||
|
|
||||||
#include <stdio.h>
|
#define RWLOCK_MAGIC 0x52574C6BU /* RWLk. */
|
||||||
|
#define VALID_RWLOCK(rwl) ((rwl) != NULL && \
|
||||||
|
(rwl)->magic == RWLOCK_MAGIC)
|
||||||
|
|
||||||
|
#ifdef ISC_RWLOCK_TRACE
|
||||||
static void
|
static void
|
||||||
print_lock(char *operation, isc_rwlock_t *rwl, isc_rwlocktype_t type) {
|
print_lock(char *operation, isc_rwlock_t *rwl, isc_rwlocktype_t type) {
|
||||||
printf("%s(%s): ", operation,
|
printf("%s(%s): ", operation,
|
||||||
(type == isc_rwlocktype_read ? "read" : "write"));
|
(type == isc_rwlocktype_read ? "read" : "write"));
|
||||||
printf("%s, %u active",
|
printf("%s, %u active, %u granted",
|
||||||
(rwl->type == isc_rwlocktype_read ? "reading" : "writing"),
|
(rwl->type == isc_rwlocktype_read ? "reading" : "writing"),
|
||||||
rwl->active);
|
rwl->active, rwl->granted);
|
||||||
if (rwl->type == isc_rwlocktype_read)
|
|
||||||
printf(", %u granted", rwl->granted);
|
|
||||||
printf(", %u rwaiting, %u wwaiting\n",
|
printf(", %u rwaiting, %u wwaiting\n",
|
||||||
rwl->readers_waiting,
|
rwl->readers_waiting,
|
||||||
rwl->writers_waiting);
|
rwl->writers_waiting);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
isc_result_t
|
isc_result_t
|
||||||
isc_rwlock_init(isc_rwlock_t *rwl,
|
isc_rwlock_init(isc_rwlock_t *rwl,
|
||||||
@@ -40,6 +44,12 @@ isc_rwlock_init(isc_rwlock_t *rwl,
|
|||||||
|
|
||||||
REQUIRE(rwl != NULL);
|
REQUIRE(rwl != NULL);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In case there's trouble initializing, we zero magic now. If all
|
||||||
|
* goes well, we'll set it to RWLOCK_MAGIC.
|
||||||
|
*/
|
||||||
|
rwl->magic = 0;
|
||||||
|
|
||||||
rwl->type = isc_rwlocktype_read;
|
rwl->type = isc_rwlocktype_read;
|
||||||
rwl->active = 0;
|
rwl->active = 0;
|
||||||
rwl->granted = 0;
|
rwl->granted = 0;
|
||||||
@@ -73,6 +83,8 @@ isc_rwlock_init(isc_rwlock_t *rwl,
|
|||||||
return (ISC_R_UNEXPECTED);
|
return (ISC_R_UNEXPECTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rwl->magic = RWLOCK_MAGIC;
|
||||||
|
|
||||||
return (ISC_R_SUCCESS);
|
return (ISC_R_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,9 +93,11 @@ isc_rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
|
|||||||
isc_boolean_t skip = ISC_FALSE;
|
isc_boolean_t skip = ISC_FALSE;
|
||||||
isc_boolean_t done = ISC_FALSE;
|
isc_boolean_t done = ISC_FALSE;
|
||||||
|
|
||||||
|
REQUIRE(VALID_RWLOCK(rwl));
|
||||||
|
|
||||||
LOCK(&rwl->lock);
|
LOCK(&rwl->lock);
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef ISC_RWLOCK_TRACE
|
||||||
print_lock("prelock", rwl, type);
|
print_lock("prelock", rwl, type);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -124,7 +138,7 @@ isc_rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef ISC_RWLOCK_TRACE
|
||||||
print_lock("postlock", rwl, type);
|
print_lock("postlock", rwl, type);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -135,10 +149,12 @@ isc_rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
|
|||||||
|
|
||||||
isc_result_t
|
isc_result_t
|
||||||
isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
|
isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
|
||||||
|
|
||||||
|
REQUIRE(VALID_RWLOCK(rwl));
|
||||||
LOCK(&rwl->lock);
|
LOCK(&rwl->lock);
|
||||||
REQUIRE(rwl->type == type);
|
REQUIRE(rwl->type == type);
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef ISC_RWLOCK_TRACE
|
||||||
print_lock("preunlock", rwl, type);
|
print_lock("preunlock", rwl, type);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -166,6 +182,8 @@ isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
|
|||||||
} else if (rwl->writers_waiting > 0) {
|
} else if (rwl->writers_waiting > 0) {
|
||||||
rwl->granted = 0;
|
rwl->granted = 0;
|
||||||
SIGNAL(&rwl->writeable);
|
SIGNAL(&rwl->writeable);
|
||||||
|
} else {
|
||||||
|
rwl->granted = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -178,7 +196,7 @@ isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef ISC_RWLOCK_TRACE
|
||||||
print_lock("postunlock", rwl, type);
|
print_lock("postunlock", rwl, type);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -189,11 +207,15 @@ isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
|
|||||||
|
|
||||||
void
|
void
|
||||||
isc_rwlock_destroy(isc_rwlock_t *rwl) {
|
isc_rwlock_destroy(isc_rwlock_t *rwl) {
|
||||||
|
|
||||||
|
REQUIRE(VALID_RWLOCK(rwl));
|
||||||
LOCK(&rwl->lock);
|
LOCK(&rwl->lock);
|
||||||
REQUIRE(rwl->active == 0 &&
|
REQUIRE(rwl->active == 0 &&
|
||||||
rwl->readers_waiting == 0 &&
|
rwl->readers_waiting == 0 &&
|
||||||
rwl->writers_waiting == 0);
|
rwl->writers_waiting == 0);
|
||||||
UNLOCK(&rwl->lock);
|
UNLOCK(&rwl->lock);
|
||||||
|
|
||||||
|
rwl->magic = 0;
|
||||||
(void)isc_condition_destroy(&rwl->readable);
|
(void)isc_condition_destroy(&rwl->readable);
|
||||||
(void)isc_condition_destroy(&rwl->writeable);
|
(void)isc_condition_destroy(&rwl->writeable);
|
||||||
(void)isc_mutex_destroy(&rwl->lock);
|
(void)isc_mutex_destroy(&rwl->lock);
|
||||||
|
Reference in New Issue
Block a user