--- sbbs/src/xpdev/xpevent.c 2018/04/24 16:41:24 1.1.1.1 +++ sbbs/src/xpdev/xpevent.c 2018/04/24 16:45:37 1.1.1.2 @@ -2,7 +2,7 @@ /* *nix emulation of Win32 *Event API */ -/* $Id: xpevent.c,v 1.1.1.1 2018/04/24 16:41:24 root Exp $ */ +/* $Id: xpevent.c,v 1.1.1.2 2018/04/24 16:45:37 root Exp $ */ /**************************************************************************** * @format.tab-size 4 (Plain Text/Source Code File Header) * @@ -50,6 +50,7 @@ CreateEvent(void *sec, BOOL bManualReset errno = ENOSPC; return(NULL); } + memset(event,0,sizeof(struct xpevent)); /* * Initialize @@ -162,24 +163,35 @@ WaitForEvent(xpevent_t event, DWORD ms) if(ms && ms!=INFINITE) { gettimeofday(&currtime,NULL); - abstime.tv_sec=currtime.tv_sec + (currtime.tv_usec/1000 + ms)/1000; + abstime.tv_sec=currtime.tv_sec + ((currtime.tv_usec/1000 + ms)/1000); abstime.tv_nsec=(currtime.tv_usec*1000 + ms*1000000)%1000000000; } - + pthread_mutex_lock(&event->lock); - while (!(event->value)) { + if(event->value) + retval=WAIT_OBJECT_0; + + while ((!(event->value)) || (event->verify!=NULL && !event->verify(event->cbdata))) { + retval=WAIT_FAILED; event->nwaiters++; switch(ms) { case 0: if(event->value) - retval=0; + retval=WAIT_OBJECT_0; else retval=WAIT_TIMEOUT; + event->nwaiters--; goto DONE; break; case INFINITE: retval=pthread_cond_wait(&event->gtzero, &event->lock); + if(retval) { + errno=retval; + retval=WAIT_FAILED; + event->nwaiters--; + goto DONE; + } break; default: retval=pthread_cond_timedwait(&event->gtzero, &event->lock, &abstime); @@ -190,6 +202,7 @@ WaitForEvent(xpevent_t event, DWORD ms) errno=retval; retval=WAIT_FAILED; } + event->nwaiters--; goto DONE; } } @@ -198,8 +211,7 @@ WaitForEvent(xpevent_t event, DWORD ms) DONE: - if(retval==0) { - retval=WAIT_OBJECT_0; + if(retval==WAIT_OBJECT_0) { if(!event->mreset) event->value=FALSE; }