#include <yaz/nmem.h>
#include <yaz/log.h>
#include <yaz/mutex.h>
-
+#include <yaz/gettimeofday.h>
#ifdef WIN32
#include <windows.h>
+#include <sys/timeb.h>
#endif
+#include <time.h>
#if HAVE_SYS_TIME_H
#include <sys/time.h>
struct yaz_cond {
#ifdef WIN32
-
+ CONDITION_VARIABLE cond;
#elif YAZ_POSIX_THREADS
pthread_cond_t cond;
#endif
{
*p = (YAZ_COND) malloc(sizeof(**p));
#ifdef WIN32
+ InitializeConditionVariable(&(*p)->cond);
#elif YAZ_POSIX_THREADS
pthread_cond_init(&(*p)->cond, 0);
#endif
}
}
-int yaz_cond_wait(YAZ_COND p, YAZ_MUTEX m, const struct timespec *abstime)
+int yaz_cond_wait(YAZ_COND p, YAZ_MUTEX m, const struct timeval *abstime)
{
#ifdef WIN32
- return -1;
+ if (abstime)
+ {
+ struct timeval tval_now;
+ int sec, msec;
+
+ yaz_gettimeofday(&tval_now);
+
+ sec = abstime->tv_sec - tval_now.tv_sec;
+ msec = (abstime->tv_usec - tval_now.tv_usec) / 1000;
+ return SleepConditionVariableCS(&p->cond, &m->handle, sec*1000 + msec);
+ }
+ else
+ return SleepConditionVariableCS(&p->cond, &m->handle, INFINITE);
#elif YAZ_POSIX_THREADS
if (abstime)
- return pthread_cond_timedwait(&p->cond, &m->handle, abstime);
+ {
+ struct timespec s;
+ s.tv_sec = abstime->tv_sec;
+ s.tv_nsec = abstime->tv_usec * 1000;
+ return pthread_cond_timedwait(&p->cond, &m->handle, &s);
+ }
else
return pthread_cond_wait(&p->cond, &m->handle);
#else
int yaz_cond_signal(YAZ_COND p)
{
#ifdef WIN32
- return -1;
+ WakeConditionVariable(&p->cond);
+ return 0;
#elif YAZ_POSIX_THREADS
return pthread_cond_signal(&p->cond);
#else
int yaz_cond_broadcast(YAZ_COND p)
{
#ifdef WIN32
- return -1;
+ WakeAllConditionVariable(&p->cond);
+ return 0;
#elif YAZ_POSIX_THREADS
return pthread_cond_broadcast(&p->cond);
#else