Przeglądaj źródła

pthread_cond_timedwait for Windows

bel 11 lat temu
rodzic
commit
54b890cdfc
1 zmienionych plików z 21 dodań i 2 usunięć
  1. 21 2
      src/civetweb.c

+ 21 - 2
src/civetweb.c

@@ -1159,10 +1159,13 @@ static int pthread_cond_init(pthread_cond_t *cv, const void *unused)
     return (cv->waitingthreadhdls!=NULL) ? 0 : -1;
 }
 
-static int pthread_cond_wait(pthread_cond_t *cv, pthread_mutex_t *mutex)
+static int pthread_cond_timedwait(pthread_cond_t *cv, pthread_mutex_t *mutex, const struct timespec * abstime)
 {
     struct mg_workerTLS * tls = (struct mg_workerTLS *)TlsGetValue(sTlsKey);
     int ok;
+    struct timespec tsnow;
+    int64_t nsnow, nswaitabs, nswaitrel;
+    DWORD mswaitrel;
 
     EnterCriticalSection(&cv->threadIdSec);
     assert(cv->waitingthreadcount < MAX_WORKER_THREADS);
@@ -1170,13 +1173,29 @@ static int pthread_cond_wait(pthread_cond_t *cv, pthread_mutex_t *mutex)
     cv->waitingthreadcount++;
     LeaveCriticalSection(&cv->threadIdSec);
 
+    if (abstime) {
+        clock_gettime(CLOCK_REALTIME, &tsnow);
+        nsnow = (((uint64_t)tsnow.tv_sec)<<32) + tsnow.tv_nsec;
+        nswaitabs = (((uint64_t)abstime->tv_sec)<<32) + abstime->tv_nsec;
+        nswaitrel = nswaitabs - nsnow;
+        if (nswaitrel<0) nswaitrel=0;
+        mswaitrel = (DWORD)(nswaitrel / 1000000);
+    } else {
+        mswaitrel = INFINITE;
+    }
+
     pthread_mutex_unlock(mutex);
-    ok = (WAIT_OBJECT_0 == WaitForSingleObject(tls->pthread_cond_helper_mutex, INFINITE));
+    ok = (WAIT_OBJECT_0 == WaitForSingleObject(tls->pthread_cond_helper_mutex, mswaitrel));
     pthread_mutex_lock(mutex);
 
     return ok ? 0 : -1;
 }
 
+static int pthread_cond_wait(pthread_cond_t *cv, pthread_mutex_t *mutex)
+{
+    return pthread_cond_timedwait(cv, mutex, NULL);
+}
+
 static int pthread_cond_signal(pthread_cond_t *cv)
 {
     int i;