From 12698979988e69d5bb78cce85e0ff2567238ff75 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Wed, 24 Sep 2008 19:24:59 +0000 Subject: [PATCH] Fixed epicsEventWaitWithTimeout(id, 0.0), added test. --- src/libCom/osi/os/vxWorks/osdEvent.c | 45 +++++++++++++++------------- src/libCom/test/epicsEventTest.cpp | 20 ++++++++----- 2 files changed, 37 insertions(+), 28 deletions(-) diff --git a/src/libCom/osi/os/vxWorks/osdEvent.c b/src/libCom/osi/os/vxWorks/osdEvent.c index 4d52d9575..692d6f63f 100644 --- a/src/libCom/osi/os/vxWorks/osdEvent.c +++ b/src/libCom/osi/os/vxWorks/osdEvent.c @@ -18,21 +18,21 @@ #include #include -/* The following not defined in an vxWorks header */ +#include "epicsEvent.h" + +/* The following not defined in any vxWorks header */ int sysClkRateGet(void); -#include "epicsEvent.h" - epicsEventId epicsEventCreate(epicsEventInitialState initialState) { - return((epicsEventId)semBCreate( - SEM_Q_FIFO,((initialState==epicsEventEmpty) ? SEM_EMPTY : SEM_FULL))); + return (epicsEventId) semBCreate(SEM_Q_FIFO, + (initialState == epicsEventEmpty) ? SEM_EMPTY : SEM_FULL); } epicsEventId epicsEventMustCreate(epicsEventInitialState initialState) { - epicsEventId id = epicsEventCreate (initialState); - assert (id); + epicsEventId id = epicsEventCreate(initialState); + assert(id); return id; } @@ -41,8 +41,7 @@ void epicsEventDestroy(epicsEventId id) semDelete((SEM_ID)id); } -epicsEventWaitStatus epicsEventWaitWithTimeout( - epicsEventId id, double timeOut) +epicsEventWaitStatus epicsEventWaitWithTimeout(epicsEventId id, double timeOut) { int rate = sysClkRateGet(); int status; @@ -54,24 +53,30 @@ epicsEventWaitStatus epicsEventWaitWithTimeout( ticks = WAIT_FOREVER; } else { ticks = timeOut * rate; - if (ticks<=0) ticks = 1; + if (ticks <= 0) + ticks = 1; } - status = semTake((SEM_ID)id,ticks); - if(status==OK) return(epicsEventWaitOK); - if(errno==S_objLib_OBJ_TIMEOUT) return(epicsEventWaitTimeout); - return(epicsEventWaitError); + status = semTake((SEM_ID)id, ticks); + if (status == OK) + return epicsEventWaitOK; + if (errno == S_objLib_OBJ_TIMEOUT || + (errno == S_objLib_OBJ_UNAVAILABLE && ticks == 0)) + return epicsEventWaitTimeout; + return epicsEventWaitError; } epicsEventWaitStatus epicsEventTryWait(epicsEventId id) { - int status; - status = semTake((SEM_ID)id,NO_WAIT); - if(status==OK) return(epicsEventWaitOK); - if(errno==S_objLib_OBJ_UNAVAILABLE) return(epicsEventWaitTimeout); - return(epicsEventWaitError); + int status = semTake((SEM_ID)id, NO_WAIT); + + if (status == OK) + return epicsEventWaitOK; + if (errno == S_objLib_OBJ_UNAVAILABLE) + return epicsEventWaitTimeout; + return epicsEventWaitError; } -void epicsEventShow(epicsEventId id,unsigned int level) +void epicsEventShow(epicsEventId id, unsigned int level) { semShow((SEM_ID)id,level); } diff --git a/src/libCom/test/epicsEventTest.cpp b/src/libCom/test/epicsEventTest.cpp index 55e60872c..71d423ae6 100644 --- a/src/libCom/test/epicsEventTest.cpp +++ b/src/libCom/test/epicsEventTest.cpp @@ -144,31 +144,35 @@ MAIN(epicsEventTest) epicsEventId event; int status; - testPlan(10); + testPlan(11); event = epicsEventMustCreate(epicsEventEmpty); - status = epicsEventWaitWithTimeout(event, 2.0); + status = epicsEventWaitWithTimeout(event, 0.0); testOk(status == epicsEventWaitTimeout, - "epicsEventWaitWithTimeout(event, 2.0) = %d", status); + "epicsEventWaitWithTimeout(event, 0.0) = %d", status); + + status = epicsEventWaitWithTimeout(event, 1.0); + testOk(status == epicsEventWaitTimeout, + "epicsEventWaitWithTimeout(event, 1.0) = %d", status); status = epicsEventTryWait(event); testOk(status == epicsEventWaitTimeout, "epicsEventTryWait(event) = %d", status); epicsEventSignal(event); - status = epicsEventWaitWithTimeout(event,2.0); - testOk(status == 0, - "epicsEventWaitWithTimeout(event, 2.0) = %d", status); + status = epicsEventWaitWithTimeout(event, 1.0); + testOk(status == epicsEventWaitOK, + "epicsEventWaitWithTimeout(event, 1.0) = %d", status); epicsEventSignal(event); status = epicsEventWaitWithTimeout(event,DBL_MAX); - testOk(status == 0, + testOk(status == epicsEventWaitOK, "epicsEventWaitWithTimeout(event, DBL_MAX) = %d", status); epicsEventSignal(event); status = epicsEventTryWait(event); - testOk(status == 0, + testOk(status == epicsEventWaitOK, "epicsEventTryWait(event) = %d", status); info *pinfo = (info *)calloc(1,sizeof(info));