#ifndef ISC_UTIL_H
#define ISC_UTIL_H 1
#define UNUSED(x) (void)(x)
#define ISC_MAX(a, b) ((a) > (b) ? (a) : (b))
#define ISC_MIN(a, b) ((a) < (b) ? (a) : (b))
#define DE_CONST(konst, var) \
do { \
union { const void *k; void *v; } _u; \
_u.k = konst; \
var = _u.v; \
} while (0)
#define EMPTY_TRANSLATION_UNIT static void isc__empty(void) { isc__empty(); }
#ifdef ISC_UTIL_TRACEON
#define ISC_UTIL_TRACE(a) a
#include <stdio.h>
#include <isc/msgs.h>
#else
#define ISC_UTIL_TRACE(a)
#endif
#include <isc/result.h>
#define LOCK(lp) do { \
ISC_UTIL_TRACE(fprintf(stderr, "%s %p %s %d\n", \
isc_msgcat_get(isc_msgcat, ISC_MSGSET_UTIL, \
ISC_MSG_LOCKING, "LOCKING"), \
(lp), __FILE__, __LINE__)); \
RUNTIME_CHECK(isc_mutex_lock((lp)) == ISC_R_SUCCESS); \
ISC_UTIL_TRACE(fprintf(stderr, "%s %p %s %d\n", \
isc_msgcat_get(isc_msgcat, ISC_MSGSET_UTIL, \
ISC_MSG_LOCKED, "LOCKED"), \
(lp), __FILE__, __LINE__)); \
} while (0)
#define UNLOCK(lp) do { \
RUNTIME_CHECK(isc_mutex_unlock((lp)) == ISC_R_SUCCESS); \
ISC_UTIL_TRACE(fprintf(stderr, "%s %p %s %d\n", \
isc_msgcat_get(isc_msgcat, ISC_MSGSET_UTIL, \
ISC_MSG_UNLOCKED, "UNLOCKED"), \
(lp), __FILE__, __LINE__)); \
} while (0)
#define ISLOCKED(lp) (1)
#define DESTROYLOCK(lp) \
RUNTIME_CHECK(isc_mutex_destroy((lp)) == ISC_R_SUCCESS)
#define BROADCAST(cvp) do { \
ISC_UTIL_TRACE(fprintf(stderr, "%s %p %s %d\n", \
isc_msgcat_get(isc_msgcat, ISC_MSGSET_UTIL, \
ISC_MSG_BROADCAST, "BROADCAST"),\
(cvp), __FILE__, __LINE__)); \
RUNTIME_CHECK(isc_condition_broadcast((cvp)) == ISC_R_SUCCESS); \
} while (0)
#define SIGNAL(cvp) do { \
ISC_UTIL_TRACE(fprintf(stderr, "%s %p %s %d\n", \
isc_msgcat_get(isc_msgcat, ISC_MSGSET_UTIL, \
ISC_MSG_SIGNAL, "SIGNAL"), \
(cvp), __FILE__, __LINE__)); \
RUNTIME_CHECK(isc_condition_signal((cvp)) == ISC_R_SUCCESS); \
} while (0)
#define WAIT(cvp, lp) do { \
ISC_UTIL_TRACE(fprintf(stderr, "%s %p %s %p %s %d\n", \
isc_msgcat_get(isc_msgcat, ISC_MSGSET_UTIL, \
ISC_MSG_UTILWAIT, "WAIT"), \
(cvp), \
isc_msgcat_get(isc_msgcat, ISC_MSGSET_UTIL, \
ISC_MSG_LOCK, "LOCK"), \
(lp), __FILE__, __LINE__)); \
RUNTIME_CHECK(isc_condition_wait((cvp), (lp)) == ISC_R_SUCCESS); \
ISC_UTIL_TRACE(fprintf(stderr, "%s %p %s %p %s %d\n", \
isc_msgcat_get(isc_msgcat, ISC_MSGSET_UTIL, \
ISC_MSG_WAITED, "WAITED"), \
(cvp), \
isc_msgcat_get(isc_msgcat, ISC_MSGSET_UTIL, \
ISC_MSG_LOCKED, "LOCKED"), \
(lp), __FILE__, __LINE__)); \
} while (0)
#define WAITUNTIL(cvp, lp, tp) \
isc_condition_waituntil((cvp), (lp), (tp))
#define RWLOCK(lp, t) do { \
ISC_UTIL_TRACE(fprintf(stderr, "%s %p, %d %s %d\n", \
isc_msgcat_get(isc_msgcat, ISC_MSGSET_UTIL, \
ISC_MSG_RWLOCK, "RWLOCK"), \
(lp), (t), __FILE__, __LINE__)); \
RUNTIME_CHECK(isc_rwlock_lock((lp), (t)) == ISC_R_SUCCESS); \
ISC_UTIL_TRACE(fprintf(stderr, "%s %p, %d %s %d\n", \
isc_msgcat_get(isc_msgcat, ISC_MSGSET_UTIL, \
ISC_MSG_RWLOCKED, "RWLOCKED"), \
(lp), (t), __FILE__, __LINE__)); \
} while (0)
#define RWUNLOCK(lp, t) do { \
ISC_UTIL_TRACE(fprintf(stderr, "%s %p, %d %s %d\n", \
isc_msgcat_get(isc_msgcat, ISC_MSGSET_UTIL, \
ISC_MSG_RWUNLOCK, "RWUNLOCK"), \
(lp), (t), __FILE__, __LINE__)); \
RUNTIME_CHECK(isc_rwlock_unlock((lp), (t)) == ISC_R_SUCCESS); \
} while (0)
#define DESTROYMUTEXBLOCK(bp, n) \
RUNTIME_CHECK(isc_mutexblock_destroy((bp), (n)) == ISC_R_SUCCESS)
#include <isc/list.h>
#define LIST(type) ISC_LIST(type)
#define INIT_LIST(type) ISC_LIST_INIT(type)
#define LINK(type) ISC_LINK(type)
#define INIT_LINK(elt, link) ISC_LINK_INIT(elt, link)
#define HEAD(list) ISC_LIST_HEAD(list)
#define TAIL(list) ISC_LIST_TAIL(list)
#define EMPTY(list) ISC_LIST_EMPTY(list)
#define PREV(elt, link) ISC_LIST_PREV(elt, link)
#define NEXT(elt, link) ISC_LIST_NEXT(elt, link)
#define APPEND(list, elt, link) ISC_LIST_APPEND(list, elt, link)
#define PREPEND(list, elt, link) ISC_LIST_PREPEND(list, elt, link)
#define UNLINK(list, elt, link) ISC_LIST_UNLINK(list, elt, link)
#define ENQUEUE(list, elt, link) ISC_LIST_APPEND(list, elt, link)
#define DEQUEUE(list, elt, link) ISC_LIST_UNLINK(list, elt, link)
#define INSERTBEFORE(li, b, e, ln) ISC_LIST_INSERTBEFORE(li, b, e, ln)
#define INSERTAFTER(li, a, e, ln) ISC_LIST_INSERTAFTER(li, a, e, ln)
#define APPENDLIST(list1, list2, link) ISC_LIST_APPENDLIST(list1, list2, link)
#include <isc/assertions.h>
#define REQUIRE(e) ISC_REQUIRE(e)
#define ENSURE(e) ISC_ENSURE(e)
#define INSIST(e) ISC_INSIST(e)
#define INVARIANT(e) ISC_INVARIANT(e)
#include <isc/error.h>
#define UNEXPECTED_ERROR isc_error_unexpected
#define FATAL_ERROR isc_error_fatal
#define RUNTIME_CHECK(cond) ISC_ERROR_RUNTIMECHECK(cond)
#define TIME_NOW(tp) RUNTIME_CHECK(isc_time_now((tp)) == ISC_R_SUCCESS)
#endif