diff --git a/lib/isc/condition.c b/lib/isc/condition.c index de412ec5ab..0573c37e2f 100644 --- a/lib/isc/condition.c +++ b/lib/isc/condition.c @@ -22,7 +22,7 @@ #include isc_result_t -isc_condition_waituntil(isc_condition_t *c, isc_mutex_t *m, isc_time_t *t) { +isc__condition_waituntil(pthread_cond_t *c, pthread_mutex_t *m, isc_time_t *t) { int presult; isc_result_t result; struct timespec ts; @@ -52,15 +52,7 @@ isc_condition_waituntil(isc_condition_t *c, isc_mutex_t *m, isc_time_t *t) { ts.tv_nsec = (long)isc_time_nanoseconds(t); do { - pthread_mutex_t *mutex; - -#ifdef ISC_TRACK_PTHREADS_OBJECTS - mutex = *m; -#else /* ISC_TRACK_PTHREADS_OBJECTS */ - mutex = m; -#endif /* ISC_TRACK_PTHREADS_OBJECTS */ - - presult = pthread_cond_timedwait(c, mutex, &ts); + presult = pthread_cond_timedwait(c, m, &ts); if (presult == 0) { return (ISC_R_SUCCESS); } diff --git a/lib/isc/include/isc/condition.h b/lib/isc/include/isc/condition.h index 36fc128735..63d0f98343 100644 --- a/lib/isc/include/isc/condition.h +++ b/lib/isc/include/isc/condition.h @@ -16,6 +16,7 @@ /*! \file */ #include +#include #include #include @@ -25,33 +26,58 @@ #include #include +ISC_LANG_BEGINDECLS + +#ifdef ISC_TRACK_PTHREADS_OBJECTS + +typedef pthread_cond_t *isc_condition_t; + +#define isc_condition_init(cp) \ + { \ + *cp = malloc(sizeof(**cp)); \ + isc__condition_init(*cp); \ + } +#define isc_condition_wait(cp, mp) isc__condition_wait(*cp, *mp) +#define isc_condition_waituntil(cp, mp, t) isc__condition_waituntil(*cp, *mp, t) +#define isc_condition_signal(cp) isc__condition_signal(*cp) +#define isc_condition_broadcast(cp) isc__condition_broadcast(*cp) +#define isc_condition_destroy(cp) \ + { \ + isc__condition_destroy(*cp); \ + free(*cp); \ + } + +#else /* ISC_TRACK_PTHREADS_OBJECTS */ + typedef pthread_cond_t isc_condition_t; -#define isc_condition_init(cond) \ +#define isc_condition_init(cond) isc__condition_init(cond) +#define isc_condition_wait(cp, mp) isc__condition_wait(cp, mp) +#define isc_condition_waituntil(cp, mp, t) isc__condition_waituntil(cp, mp, t) +#define isc_condition_signal(cp) isc__condition_signal(cp) +#define isc_condition_broadcast(cp) isc__condition_broadcast(cp) +#define isc_condition_destroy(cp) isc__condition_destroy(cp) + +#endif /* ISC_TRACK_PTHREADS_OBJECTS */ + +#define isc__condition_init(cond) \ { \ int _ret = pthread_cond_init(cond, NULL); \ ERRNO_CHECK(pthread_cond_init, _ret); \ } -#ifdef ISC_TRACK_PTHREADS_OBJECTS -#define isc_condition_wait(cp, mp) isc__condition_wait(cp, *mp) -#else /* ISC_TRACK_PTHREADS_OBJECTS */ -#define isc_condition_wait(cp, mp) isc__condition_wait(cp, mp) -#endif /* ISC_TRACK_PTHREADS_OBJECTS */ - #define isc__condition_wait(cp, mp) \ RUNTIME_CHECK(pthread_cond_wait((cp), (mp)) == 0) -#define isc_condition_signal(cp) RUNTIME_CHECK(pthread_cond_signal((cp)) == 0) +#define isc__condition_signal(cp) RUNTIME_CHECK(pthread_cond_signal((cp)) == 0) -#define isc_condition_broadcast(cp) \ +#define isc__condition_broadcast(cp) \ RUNTIME_CHECK(pthread_cond_broadcast((cp)) == 0) -#define isc_condition_destroy(cp) RUNTIME_CHECK(pthread_cond_destroy((cp)) == 0) - -ISC_LANG_BEGINDECLS +#define isc__condition_destroy(cp) \ + RUNTIME_CHECK(pthread_cond_destroy((cp)) == 0) isc_result_t -isc_condition_waituntil(isc_condition_t *, isc_mutex_t *, isc_time_t *); +isc__condition_waituntil(pthread_cond_t *, pthread_mutex_t *, isc_time_t *); ISC_LANG_ENDDECLS