2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-31 14:35:26 +00:00

clean up debugging, add magic

This commit is contained in:
Bob Halley
1998-11-12 23:30:46 +00:00
parent 274043cd54
commit 4bba0ce1d3

View File

@@ -1,4 +1,6 @@
#include <stdio.h>
#include <isc/assertions.h>
#include <isc/unexpect.h>
#include <isc/boolean.h>
@@ -15,21 +17,23 @@
#define WAIT(cvp, lp) \
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
print_lock(char *operation, isc_rwlock_t *rwl, isc_rwlocktype_t type) {
printf("%s(%s): ", operation,
(type == isc_rwlocktype_read ? "read" : "write"));
printf("%s, %u active",
printf("%s, %u active, %u granted",
(rwl->type == isc_rwlocktype_read ? "reading" : "writing"),
rwl->active);
if (rwl->type == isc_rwlocktype_read)
printf(", %u granted", rwl->granted);
rwl->active, rwl->granted);
printf(", %u rwaiting, %u wwaiting\n",
rwl->readers_waiting,
rwl->writers_waiting);
}
#endif
isc_result_t
isc_rwlock_init(isc_rwlock_t *rwl,
@@ -40,6 +44,12 @@ isc_rwlock_init(isc_rwlock_t *rwl,
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->active = 0;
rwl->granted = 0;
@@ -73,6 +83,8 @@ isc_rwlock_init(isc_rwlock_t *rwl,
return (ISC_R_UNEXPECTED);
}
rwl->magic = RWLOCK_MAGIC;
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 done = ISC_FALSE;
REQUIRE(VALID_RWLOCK(rwl));
LOCK(&rwl->lock);
#ifdef DEBUG
#ifdef ISC_RWLOCK_TRACE
print_lock("prelock", rwl, type);
#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);
#endif
@@ -135,10 +149,12 @@ isc_rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
isc_result_t
isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
REQUIRE(VALID_RWLOCK(rwl));
LOCK(&rwl->lock);
REQUIRE(rwl->type == type);
#ifdef DEBUG
#ifdef ISC_RWLOCK_TRACE
print_lock("preunlock", rwl, type);
#endif
@@ -166,6 +182,8 @@ isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
} else if (rwl->writers_waiting > 0) {
rwl->granted = 0;
SIGNAL(&rwl->writeable);
} else {
rwl->granted = 0;
}
}
} 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);
#endif
@@ -189,11 +207,15 @@ isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
void
isc_rwlock_destroy(isc_rwlock_t *rwl) {
REQUIRE(VALID_RWLOCK(rwl));
LOCK(&rwl->lock);
REQUIRE(rwl->active == 0 &&
rwl->readers_waiting == 0 &&
rwl->writers_waiting == 0);
UNLOCK(&rwl->lock);
rwl->magic = 0;
(void)isc_condition_destroy(&rwl->readable);
(void)isc_condition_destroy(&rwl->writeable);
(void)isc_mutex_destroy(&rwl->lock);