#include <isc/util.h>
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;
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);
}
/*! \file */
#include <errno.h>
+#include <stdlib.h>
#include <isc/error.h>
#include <isc/lang.h>
#include <isc/types.h>
#include <isc/util.h>
+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