* Apply and clear locks at the event level in global task.
* Can I get rid of these using shutdown events? XXX
*/
-#define LOCK_LOOKUP \
- { \
- debug("lock_lookup %s:%d", __FILE__, __LINE__); \
- check_result(isc_mutex_lock((&lookup_lock)), "isc_mutex_" \
- "lock"); \
- debug("success"); \
- }
-#define UNLOCK_LOOKUP \
- { \
- debug("unlock_lookup %s:%d", __FILE__, __LINE__); \
- check_result(isc_mutex_unlock((&lookup_lock)), "isc_mutex_" \
- "unlock"); \
+#define LOCK_LOOKUP \
+ { \
+ debug("lock_lookup %s:%d", __FILE__, __LINE__); \
+ isc_mutex_lock((&lookup_lock)); \
+ debug("success"); \
+ }
+#define UNLOCK_LOOKUP \
+ { \
+ debug("unlock_lookup %s:%d", __FILE__, __LINE__); \
+ isc_mutex_unlock((&lookup_lock)); \
}
static void
ERRNO_CHECK(pthread_cond_init, _ret); \
}
-#define isc_condition_wait(cp, mp) \
- ((pthread_cond_wait((cp), (mp)) == 0) ? ISC_R_SUCCESS \
- : ISC_R_UNEXPECTED)
+#define isc_condition_wait(cp, mp) \
+ RUNTIME_CHECK(pthread_cond_wait((cp), (mp)) == 0)
-#define isc_condition_signal(cp) \
- ((pthread_cond_signal((cp)) == 0) ? ISC_R_SUCCESS : ISC_R_UNEXPECTED)
+#define isc_condition_signal(cp) RUNTIME_CHECK(pthread_cond_signal((cp)) == 0)
#define isc_condition_broadcast(cp) \
- ((pthread_cond_broadcast((cp)) == 0) ? ISC_R_SUCCESS : ISC_R_UNEXPECTED)
+ RUNTIME_CHECK(pthread_cond_broadcast((cp)) == 0)
-#define isc_condition_destroy(cp) \
- ((pthread_cond_destroy((cp)) == 0) ? ISC_R_SUCCESS : ISC_R_UNEXPECTED)
+#define isc_condition_destroy(cp) RUNTIME_CHECK(pthread_cond_destroy((cp)) == 0)
ISC_LANG_BEGINDECLS
#define isc_mutex_init(mp) isc__mutex_init((mp))
-#define isc_mutex_lock(mp) \
- ((pthread_mutex_lock((mp)) == 0) ? ISC_R_SUCCESS : ISC_R_UNEXPECTED)
+#define isc_mutex_lock(mp) RUNTIME_CHECK(pthread_mutex_lock((mp)) == 0)
-#define isc_mutex_unlock(mp) \
- ((pthread_mutex_unlock((mp)) == 0) ? ISC_R_SUCCESS : ISC_R_UNEXPECTED)
+#define isc_mutex_unlock(mp) RUNTIME_CHECK(pthread_mutex_unlock((mp)) == 0)
#define isc_mutex_trylock(mp) \
((pthread_mutex_trylock((mp)) == 0) ? ISC_R_SUCCESS : ISC_R_LOCKBUSY)
isc_rwlock_init(isc_rwlock_t *rwl, unsigned int read_quota,
unsigned int write_quota);
-isc_result_t
+void
isc_rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type);
isc_result_t
isc_rwlock_trylock(isc_rwlock_t *rwl, isc_rwlocktype_t type);
-isc_result_t
+void
isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type);
isc_result_t
/*%
* We use macros instead of calling the routines directly because
* the capital letters make the locking stand out.
- * We RUNTIME_CHECK for success since in general there's no way
- * for us to continue if they fail.
*/
#ifdef ISC_UTIL_TRACEON
#include <isc/result.h> /* Contractual promise. */
#define LOCK(lp) \
- do { \
+ { \
ISC_UTIL_TRACE(fprintf(stderr, "LOCKING %p %s %d\n", (lp), \
__FILE__, __LINE__)); \
- RUNTIME_CHECK(isc_mutex_lock((lp)) == ISC_R_SUCCESS); \
+ isc_mutex_lock((lp)); \
ISC_UTIL_TRACE(fprintf(stderr, "LOCKED %p %s %d\n", (lp), \
__FILE__, __LINE__)); \
- } while (0)
+ }
#define UNLOCK(lp) \
- do { \
- RUNTIME_CHECK(isc_mutex_unlock((lp)) == ISC_R_SUCCESS); \
+ { \
+ isc_mutex_unlock((lp)); \
ISC_UTIL_TRACE(fprintf(stderr, "UNLOCKED %p %s %d\n", (lp), \
__FILE__, __LINE__)); \
- } while (0)
+ }
#define BROADCAST(cvp) \
- do { \
+ { \
ISC_UTIL_TRACE(fprintf(stderr, "BROADCAST %p %s %d\n", (cvp), \
__FILE__, __LINE__)); \
- RUNTIME_CHECK(isc_condition_broadcast((cvp)) == \
- ISC_R_SUCCESS); \
- } while (0)
-#define SIGNAL(cvp) \
- do { \
- ISC_UTIL_TRACE(fprintf(stderr, "SIGNAL %p %s %d\n", (cvp), \
- __FILE__, __LINE__)); \
- RUNTIME_CHECK(isc_condition_signal((cvp)) == ISC_R_SUCCESS); \
- } while (0)
+ isc_condition_broadcast((cvp)); \
+ }
+#define SIGNAL(cvp) \
+ { \
+ ISC_UTIL_TRACE(fprintf(stderr, "SIGNAL %p %s %d\n", (cvp), \
+ __FILE__, __LINE__)); \
+ isc_condition_signal((cvp)); \
+ }
#define WAIT(cvp, lp) \
- do { \
+ { \
ISC_UTIL_TRACE(fprintf(stderr, "WAIT %p LOCK %p %s %d\n", \
(cvp), (lp), __FILE__, __LINE__)); \
- RUNTIME_CHECK(isc_condition_wait((cvp), (lp)) == \
- ISC_R_SUCCESS); \
+ isc_condition_wait((cvp), (lp)); \
ISC_UTIL_TRACE(fprintf(stderr, "WAITED %p LOCKED %p %s %d\n", \
(cvp), (lp), __FILE__, __LINE__)); \
- } while (0)
+ }
/*
* isc_condition_waituntil can return ISC_R_TIMEDOUT, so we
#define WAITUNTIL(cvp, lp, tp) isc_condition_waituntil((cvp), (lp), (tp))
#define RWLOCK(lp, t) \
- do { \
+ { \
ISC_UTIL_TRACE(fprintf(stderr, "RWLOCK %p, %d %s %d\n", (lp), \
(t), __FILE__, __LINE__)); \
- RUNTIME_CHECK(isc_rwlock_lock((lp), (t)) == ISC_R_SUCCESS); \
+ isc_rwlock_lock((lp), (t)); \
ISC_UTIL_TRACE(fprintf(stderr, "RWLOCKED %p, %d %s %d\n", \
(lp), (t), __FILE__, __LINE__)); \
- } while (0)
-#define RWUNLOCK(lp, t) \
- do { \
- ISC_UTIL_TRACE(fprintf(stderr, "RWUNLOCK %p, %d %s %d\n", \
- (lp), (t), __FILE__, __LINE__)); \
- RUNTIME_CHECK(isc_rwlock_unlock((lp), (t)) == ISC_R_SUCCESS); \
- } while (0)
+ }
+#define RWUNLOCK(lp, t) \
+ { \
+ ISC_UTIL_TRACE(fprintf(stderr, "RWUNLOCK %p, %d %s %d\n", \
+ (lp), (t), __FILE__, __LINE__)); \
+ isc_rwlock_unlock((lp), (t)); \
+ }
/*
* List Macros.
atomic_init(&rwl->downgrade, false);
}
-isc_result_t
+void
isc_rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
switch (type) {
case isc_rwlocktype_read:
- REQUIRE(pthread_rwlock_rdlock(&rwl->rwlock) == 0);
+ RUNTIME_CHECK(pthread_rwlock_rdlock(&rwl->rwlock) == 0);
break;
case isc_rwlocktype_write:
while (true) {
- REQUIRE(pthread_rwlock_wrlock(&rwl->rwlock) == 0);
+ RUNTIME_CHECK(pthread_rwlock_wrlock(&rwl->rwlock) == 0);
/* Unlock if in middle of downgrade operation */
if (atomic_load_acquire(&rwl->downgrade)) {
- REQUIRE(pthread_rwlock_unlock(&rwl->rwlock) ==
- 0);
+ RUNTIME_CHECK(pthread_rwlock_unlock(
+ &rwl->rwlock) == 0);
while (atomic_load_acquire(&rwl->downgrade)) {
}
continue;
default:
UNREACHABLE();
}
- return (ISC_R_SUCCESS);
}
isc_result_t
case isc_rwlocktype_write:
ret = pthread_rwlock_trywrlock(&rwl->rwlock);
if ((ret == 0) && atomic_load_acquire(&rwl->downgrade)) {
- isc_rwlock_unlock(rwl, type);
+ RUNTIME_CHECK(pthread_rwlock_unlock(&rwl->rwlock) == 0);
return (ISC_R_LOCKBUSY);
}
break;
}
}
-isc_result_t
+void
isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
UNUSED(type);
- REQUIRE(pthread_rwlock_unlock(&rwl->rwlock) == 0);
- return (ISC_R_SUCCESS);
+ RUNTIME_CHECK(pthread_rwlock_unlock(&rwl->rwlock) == 0);
}
isc_result_t
void
isc_rwlock_downgrade(isc_rwlock_t *rwl) {
- isc_result_t result;
atomic_store_release(&rwl->downgrade, true);
- result = isc_rwlock_unlock(rwl, isc_rwlocktype_write);
- RUNTIME_CHECK(result == ISC_R_SUCCESS);
- result = isc_rwlock_lock(rwl, isc_rwlocktype_read);
- RUNTIME_CHECK(result == ISC_R_SUCCESS);
+ RUNTIME_CHECK(pthread_rwlock_unlock(&rwl->rwlock) == 0);
+ RUNTIME_CHECK(pthread_rwlock_rdlock(&rwl->rwlock) == 0);
atomic_store_release(&rwl->downgrade, false);
}
#define isc_rwlock_pause()
#endif /* if defined(_MSC_VER) */
-static isc_result_t
+static void
isc__rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type);
#ifdef ISC_RWLOCK_TRACE
rwl->readers_waiting == 0);
rwl->magic = 0;
- (void)isc_condition_destroy(&rwl->readable);
- (void)isc_condition_destroy(&rwl->writeable);
+ isc_condition_destroy(&rwl->readable);
+ isc_condition_destroy(&rwl->writeable);
isc_mutex_destroy(&rwl->lock);
}
#define WRITER_ACTIVE 0x1
#define READER_INCR 0x2
-static isc_result_t
+static void
isc__rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
int32_t cntflag;
#ifdef ISC_RWLOCK_TRACE
print_lock("postlock", rwl, type);
#endif /* ifdef ISC_RWLOCK_TRACE */
-
- return (ISC_R_SUCCESS);
}
-isc_result_t
+void
isc_rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
int32_t cnt = 0;
int32_t spins = atomic_load_acquire(&rwl->spins) * 2 + 10;
int32_t max_cnt = ISC_MAX(spins, RWLOCK_MAX_ADAPTIVE_COUNT);
- isc_result_t result = ISC_R_SUCCESS;
do {
if (cnt++ >= max_cnt) {
- result = isc__rwlock_lock(rwl, type);
+ isc__rwlock_lock(rwl, type);
break;
}
isc_rwlock_pause();
} while (isc_rwlock_trylock(rwl, type) != ISC_R_SUCCESS);
atomic_fetch_add_release(&rwl->spins, (cnt - spins) / 8);
-
- return (result);
}
isc_result_t
UNLOCK(&rwl->lock);
}
-isc_result_t
+void
isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
int32_t prev_cnt;
#ifdef ISC_RWLOCK_TRACE
print_lock("postunlock", rwl, type);
#endif /* ifdef ISC_RWLOCK_TRACE */
-
- return (ISC_R_SUCCESS);
}
#endif /* USE_PTHREAD_RWLOCK */
/*
* Clean up.
*/
- (void)isc_condition_destroy(&manager->wakeup);
+ isc_condition_destroy(&manager->wakeup);
isc_mutex_destroy(&manager->lock);
isc_heap_destroy(&manager->heap);
manager->magic = 0;
static void
test_shutdown(void) {
- isc_result_t result;
-
/*
* Signal shutdown processing complete.
*/
- result = isc_mutex_lock(&mx);
- assert_int_equal(result, ISC_R_SUCCESS);
-
- result = isc_condition_signal(&cv);
- assert_int_equal(result, ISC_R_SUCCESS);
-
- result = isc_mutex_unlock(&mx);
- assert_int_equal(result, ISC_R_SUCCESS);
+ LOCK(&mx);
+ SIGNAL(&cv);
+ UNLOCK(&mx);
}
static void
result = isc_task_create(taskmgr, 0, &task, 0);
assert_int_equal(result, ISC_R_SUCCESS);
- isc_mutex_lock(&lasttime_mx);
+ LOCK(&lasttime_mx);
result = isc_time_now(&lasttime);
- isc_mutex_unlock(&lasttime_mx);
+ UNLOCK(&lasttime_mx);
assert_int_equal(result, ISC_R_SUCCESS);
isc_timer_create(timermgr, task, action, (void *)timertype, &timer);
* Wait for shutdown processing to complete.
*/
while (atomic_load(&eventcnt) != nevents) {
- result = isc_condition_wait(&cv, &mx);
+ WAIT(&cv, &mx);
assert_int_equal(result, ISC_R_SUCCESS);
}
isc_task_detach(&task);
isc_mutex_destroy(&mx);
- (void)isc_condition_destroy(&cv);
+ isc_condition_destroy(&cv);
}
static void