diff --git a/src/libCom/error/Makefile b/src/libCom/error/Makefile index ce9ca659a..bf81074e8 100644 --- a/src/libCom/error/Makefile +++ b/src/libCom/error/Makefile @@ -24,6 +24,7 @@ Com_SRCS += errSymTbl.c ERR_S_FILES += $(LIBCOM)/osi/devLib.h ERR_S_FILES += $(LIBCOM)/as/asLib.h ERR_S_FILES += $(LIBCOM)/misc/epicsStdlib.h +ERR_S_FILES += $(LIBCOM)/pool/epicsThreadPool.h ERR_S_FILES += $(SRC)/ioc/db/dbAccessDefs.h ERR_S_FILES += $(SRC)/ioc/dbStatic/devSup.h ERR_S_FILES += $(SRC)/ioc/dbStatic/drvSup.h diff --git a/src/libCom/error/errMdef.h b/src/libCom/error/errMdef.h index 80483bca1..27b693d8c 100644 --- a/src/libCom/error/errMdef.h +++ b/src/libCom/error/errMdef.h @@ -49,6 +49,7 @@ extern "C" { #define M_bucket (525 <<16) /*Bucket Hash*/ #define M_gddFuncTbl (526 <<16) /*gdd jump table*/ #define M_stdlib (527 <<16) /*EPICS Standard library*/ +#define M_pool (528 <<16) /*Thread pool*/ epicsShareFunc void epicsShareAPI errSymLookup(long status, char *pBuf, unsigned bufLength); epicsShareFunc void epicsShareAPI errSymTest(unsigned short modnum, unsigned short begErrNum, unsigned short endErrNum); diff --git a/src/libCom/pool/epicsThreadPool.h b/src/libCom/pool/epicsThreadPool.h index e6b3f03c8..3416bb23a 100644 --- a/src/libCom/pool/epicsThreadPool.h +++ b/src/libCom/pool/epicsThreadPool.h @@ -14,6 +14,14 @@ #include #include "shareLib.h" +#include "errMdef.h" + +#define S_pool_jobBusy (M_pool| 1) /*Job already queued or running*/ +#define S_pool_jobIdle (M_pool| 2) /*Job was not queued or running*/ +#define S_pool_noPool (M_pool| 3) /*Job not associated with a pool*/ +#define S_pool_paused (M_pool| 4) /*Pool not currently accepting jobs*/ +#define S_pool_noThreads (M_pool| 5) /*Can't create worker thread*/ +#define S_pool_timeout (M_pool| 6) /*Pool still busy after timeout*/ #ifdef __cplusplus extern "C" { diff --git a/src/libCom/pool/poolJob.c b/src/libCom/pool/poolJob.c index 05645fea0..8e86fb768 100644 --- a/src/libCom/pool/poolJob.c +++ b/src/libCom/pool/poolJob.c @@ -125,7 +125,7 @@ int createPoolThread(epicsThreadPool *pool) &workerMain, pool); if (!tid) - return 1; + return S_pool_noThreads; pool->threadsRunning++; pool->threadsSleeping++; @@ -190,7 +190,7 @@ int epicsJobMove(epicsJob *job, epicsThreadPool *newpool) if (job->queued || job->running) { epicsMutexUnlock(pool->guard); - return EINVAL; + return S_pool_jobBusy; } ellDelete(&pool->owned, &job->jobnode); @@ -218,18 +218,18 @@ int epicsJobQueue(epicsJob *job) epicsThreadPool *pool = job->pool; if (!pool) - return EINVAL; + return S_pool_noPool; epicsMutexMustLock(pool->guard); assert(!job->dead); if (pool->pauseadd) { - ret = EPERM; + ret = S_pool_paused; goto done; } else if (job->freewhendone) { - ret = EINVAL; + ret = S_pool_jobBusy; goto done; } else if (job->queued) { @@ -279,7 +279,7 @@ int epicsJobQueue(epicsJob *job) /* oops, we couldn't lazy create our first worker * so this job would never run! */ - ret = EAGAIN; + ret = S_pool_noThreads; job->queued = 0; /* if threadsRunning==0 then no jobs can be running */ assert(!job->running); @@ -301,11 +301,11 @@ done: int epicsJobUnqueue(epicsJob *job) { - int ret = 1; + int ret = S_pool_jobIdle; epicsThreadPool *pool = job->pool; if (!pool) - return EINVAL; + return S_pool_noPool; epicsMutexMustLock(pool->guard); diff --git a/src/libCom/pool/threadPool.c b/src/libCom/pool/threadPool.c index 317f4786a..3cfd06606 100644 --- a/src/libCom/pool/threadPool.c +++ b/src/libCom/pool/threadPool.c @@ -102,7 +102,7 @@ cleanup: epicsMutexDestroy(pool->guard); free(pool); - return 0; + return NULL; } static @@ -175,7 +175,7 @@ int epicsThreadPoolWait(epicsThreadPool *pool, double timeout) cantProceed("epicsThreadPoolWait: failed to wait for Event"); break; case epicsEventWaitTimeout: - ret = ETIMEDOUT; + ret = S_pool_timeout; break; case epicsEventWaitOK: ret = 0; diff --git a/src/libCom/test/epicsThreadPoolTest.c b/src/libCom/test/epicsThreadPoolTest.c index f94b9eb5e..6a4f3f435 100644 --- a/src/libCom/test/epicsThreadPoolTest.c +++ b/src/libCom/test/epicsThreadPoolTest.c @@ -191,7 +191,7 @@ static void cleanupjob2(void* arg, epicsJobMode mode) if(mode==epicsJobModeCleanup) epicsJobDestroy(job); /* delete when threadpool is destroyed */ else if(mode==epicsJobModeRun) - testOk1(epicsJobUnqueue(job)==1); + testOk1(epicsJobUnqueue(job)==S_pool_jobIdle); } static epicsJobFunction cleanupjobs[3] = {&cleanupjob0,&cleanupjob1,&cleanupjob2}; @@ -341,23 +341,23 @@ void testcancel(void) /* freeze */ epicsThreadPoolControl(pool, epicsThreadPoolQueueRun, 0); - testOk1(epicsJobUnqueue(job[0])==1); /* not queued yet */ + testOk1(epicsJobUnqueue(job[0])==S_pool_jobIdle); /* not queued yet */ epicsJobQueue(job[0]); testOk1(epicsJobUnqueue(job[0])==0); - testOk1(epicsJobUnqueue(job[0])==1); + testOk1(epicsJobUnqueue(job[0])==S_pool_jobIdle); epicsThreadSleep(0.01); epicsJobQueue(job[0]); testOk1(epicsJobUnqueue(job[0])==0); - testOk1(epicsJobUnqueue(job[0])==1); + testOk1(epicsJobUnqueue(job[0])==S_pool_jobIdle); epicsThreadPoolControl(pool, epicsThreadPoolQueueRun, 1); epicsJobQueue(job[1]); /* actually let it run this time */ epicsEventMustWait(cancel[0]); - testOk1(epicsJobUnqueue(job[0])==1); + testOk1(epicsJobUnqueue(job[0])==S_pool_jobIdle); epicsEventSignal(cancel[1]); epicsThreadPoolDestroy(pool);