|  | @@ -1159,10 +1159,13 @@ static int pthread_cond_init(pthread_cond_t *cv, const void *unused)
 | 
											
												
													
														|  |      return (cv->waitingthreadhdls!=NULL) ? 0 : -1;
 |  |      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);
 |  |      struct mg_workerTLS * tls = (struct mg_workerTLS *)TlsGetValue(sTlsKey);
 | 
											
												
													
														|  |      int ok;
 |  |      int ok;
 | 
											
												
													
														|  | 
 |  | +    struct timespec tsnow;
 | 
											
												
													
														|  | 
 |  | +    int64_t nsnow, nswaitabs, nswaitrel;
 | 
											
												
													
														|  | 
 |  | +    DWORD mswaitrel;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      EnterCriticalSection(&cv->threadIdSec);
 |  |      EnterCriticalSection(&cv->threadIdSec);
 | 
											
												
													
														|  |      assert(cv->waitingthreadcount < MAX_WORKER_THREADS);
 |  |      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++;
 |  |      cv->waitingthreadcount++;
 | 
											
												
													
														|  |      LeaveCriticalSection(&cv->threadIdSec);
 |  |      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);
 |  |      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);
 |  |      pthread_mutex_lock(mutex);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      return ok ? 0 : -1;
 |  |      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)
 |  |  static int pthread_cond_signal(pthread_cond_t *cv)
 | 
											
												
													
														|  |  {
 |  |  {
 | 
											
												
													
														|  |      int i;
 |  |      int i;
 |