diff --git a/src/as/asCa.c b/src/as/asCa.c index 992be6e9e..4e599368f 100644 --- a/src/as/asCa.c +++ b/src/as/asCa.c @@ -26,7 +26,7 @@ of this distribution. #include "dbDefs.h" #include "ellLib.h" -#include "osiThread.h" +#include "epicsThread.h" #include "epicsMutex.h" #include "epicsEvent.h" #include "cantProceed.h" @@ -46,7 +46,7 @@ of this distribution. epicsShareDef int asCaDebug = 0; LOCAL int firstTime = TRUE; -LOCAL threadId threadid=0; +LOCAL epicsThreadId threadid=0; LOCAL int caInitializing=FALSE; LOCAL epicsMutexId asCaTaskLock; /*lock access to task */ LOCAL epicsEventId asCaTaskWait; /*Wait for task to respond*/ @@ -72,6 +72,7 @@ static void exceptionCallback(struct exception_handler_args args) int readAccess; int writeAccess; +printf("as exceptionCallback\n"); channel = (chid ? ca_name(chid) : unknown); context = (args.ctx ? args.ctx : unknown); nativeType = dbr_type_to_text((chid ? ca_field_type(chid) : -1)); @@ -99,6 +100,7 @@ LOCAL void connectCallback(struct connection_handler_args arg) ASGINP *pasginp = (ASGINP *)ca_puser(chid); ASG *pasg = pasginp->pasg; +printf("as connectCallback %s\n",ca_name(chid)); if(ca_state(chid)!=cs_conn) { if(!(pasg->inpBad & (1<inpIndex))) { /*was good so lets make it bad*/ @@ -119,6 +121,7 @@ LOCAL void eventCallback(struct event_handler_args arg) CAPVT *pcapvt; READONLY struct dbr_sts_double *pdata; +printf("as eventCallback %s\n",ca_name(chid)); if(caStatus!=ECA_NORMAL) { if(chid) { epicsPrintf("asCa: eventCallback error %s channel %s\n", @@ -168,13 +171,15 @@ LOCAL void eventCallback(struct event_handler_args arg) LOCAL void asCaTask(void) { + static const int enablePreemption = 1u; ASG *pasg; ASGINP *pasginp; CAPVT *pcapvt; int status; - taskwdInsert(threadGetIdSelf(),NULL,NULL); - SEVCHK(ca_task_initialize(),"ca_task_initialize"); + taskwdInsert(epicsThreadGetIdSelf(),NULL,NULL); + SEVCHK(ca_context_create(enablePreemption), + "asCaTask calling ca_context_create"); SEVCHK(ca_add_exception_event(exceptionCallback,NULL), "ca_add_exception_event"); while(TRUE) { @@ -194,6 +199,7 @@ LOCAL void asCaTask(void) ca_message(status)); } /*Note calls eventCallback immediately for local Pvs*/ +printf("as ca_add_event %s\n",pasginp->inp); status = ca_add_event(DBR_STS_DOUBLE,pcapvt->chid, eventCallback,pasginp,0); if(status!=ECA_NORMAL) { @@ -204,14 +210,14 @@ LOCAL void asCaTask(void) } pasg = (ASG *)ellNext((ELLNODE *)pasg); } +printf("as calling ca_flush_io\n"); + SEVCHK(ca_flush_io(),"asCaTask"); +epicsThreadSleep(2.0); asComputeAllAsg(); caInitializing = FALSE; if(asCaDebug) printf("asCaTask initialized\n"); epicsEventSignal(asCaTaskWait); - while(TRUE) { - if(epicsEventTryWait(asCaTaskClearChannels)==epicsEventWaitOK) break; - ca_pend_event(2.0); - } + epicsEventMustWait(asCaTaskClearChannels); pasg = (ASG *)ellFirst(&pasbase->asgList); while(pasg) { pasginp = (ASGINP *)ellFirst(&pasg->inpList); @@ -242,10 +248,10 @@ void epicsShareAPI asCaStart(void) asCaTaskWait=epicsEventMustCreate(epicsEventEmpty); asCaTaskAddChannels=epicsEventMustCreate(epicsEventEmpty); asCaTaskClearChannels=epicsEventMustCreate(epicsEventEmpty); - threadid = threadCreate("asCaTask", - (threadPriorityScanLow - 3), - threadGetStackSize(threadStackBig), - (THREADFUNC)asCaTask,0); + threadid = epicsThreadCreate("asCaTask", + (epicsThreadPriorityScanLow - 3), + epicsThreadGetStackSize(epicsThreadStackBig), + (EPICSTHREADFUNC)asCaTask,0); if(threadid==0) { errMessage(0,"asCaStart: taskSpawn Failure\n"); } diff --git a/src/as/asDbLib.c b/src/as/asDbLib.c index 554523c27..9199d682f 100644 --- a/src/as/asDbLib.c +++ b/src/as/asDbLib.c @@ -25,7 +25,7 @@ of this distribution. #include "dbDefs.h" #include "cantProceed.h" -#include "osiThread.h" +#include "epicsThread.h" #include "errlog.h" #include "taskwd.h" #include "alarm.h" @@ -46,7 +46,7 @@ of this distribution. static char *pacf=NULL; static char *psubstitutions=NULL; -static threadId asInitTheadId=0; +static epicsThreadId asInitTheadId=0; static int firstTime = TRUE; static long asDbAddRecords(void) @@ -123,10 +123,10 @@ static long asInitCommon(void) long status; int asWasActive = asActive; int wasFirstTime = firstTime; - static threadOnceId asInitCommonOnceFlag = OSITHREAD_ONCE_INIT; + static epicsThreadOnceId asInitCommonOnceFlag = EPICS_THREAD_ONCE_INIT; - threadOnce(&asInitCommonOnceFlag,asInitCommonOnce,(void *)&firstTime); + epicsThreadOnce(&asInitCommonOnceFlag,asInitCommonOnce,(void *)&firstTime); if(wasFirstTime) { if(!pacf) return(0); /*access security will NEVER be turned on*/ } else { @@ -167,9 +167,9 @@ static void asInitTask(ASDBCALLBACK *pcallback) { long status; - taskwdInsert(threadGetIdSelf(),(TASKWDFUNCPRR)wdCallback,(void *)pcallback); + taskwdInsert(epicsThreadGetIdSelf(),(TASKWDFUNCPRR)wdCallback,(void *)pcallback); status = asInitCommon(); - taskwdRemove(threadGetIdSelf()); + taskwdRemove(epicsThreadGetIdSelf()); asInitTheadId = 0; if(pcallback) { pcallback->status = status; @@ -188,12 +188,12 @@ int epicsShareAPI asInitAsyn(ASDBCALLBACK *pcallback) } return(-1); } - asInitTheadId = threadCreate("asInitTask", - (threadPriorityChannelAccessServer + 9), - threadGetStackSize(threadStackBig), - (THREADFUNC)asInitTask,(void *)pcallback); + asInitTheadId = epicsThreadCreate("asInitTask", + (epicsThreadPriorityChannelAccessServer + 9), + epicsThreadGetStackSize(epicsThreadStackBig), + (EPICSTHREADFUNC)asInitTask,(void *)pcallback); if(asInitTheadId==0) { - errMessage(0,"asInit: threadCreate Error"); + errMessage(0,"asInit: epicsThreadCreate Error"); if(pcallback) { pcallback->status = S_asLib_InitFailed; callbackRequest(&pcallback->callback); diff --git a/src/as/asLibRoutines.c b/src/as/asLibRoutines.c index 0c1923963..d77bc8e33 100644 --- a/src/as/asLibRoutines.c +++ b/src/as/asLibRoutines.c @@ -25,7 +25,7 @@ of this distribution. #include #include "dbDefs.h" -#include "osiThread.h" +#include "epicsThread.h" #include "ellLib.h" #include "cantProceed.h" #include "epicsMutex.h" @@ -100,9 +100,9 @@ long epicsShareAPI asInitialize(ASINPUTFUNCPTR inputfunction) UAGNAME *puagname; HAG *phag; HAGNAME *phagname; - static threadOnceId asInitializeOnceFlag = OSITHREAD_ONCE_INIT; + static epicsThreadOnceId asInitializeOnceFlag = EPICS_THREAD_ONCE_INIT; - threadOnce(&asInitializeOnceFlag,asInitializeOnce,(void *)0); + epicsThreadOnce(&asInitializeOnceFlag,asInitializeOnce,(void *)0); LOCK; pasbasenew = asCalloc(1,sizeof(ASBASE)); if(!freeListPvt) freeListInitPvt(&freeListPvt,sizeof(ASGCLIENT),20); diff --git a/src/ca/CASG.cpp b/src/ca/CASG.cpp index 838ed45f3..ce765ad60 100644 --- a/src/ca/CASG.cpp +++ b/src/ca/CASG.cpp @@ -85,12 +85,12 @@ int CASG::block ( double timeout ) /* * dont allow recursion */ - void *p = threadPrivateGet (cacRecursionLock); + void *p = epicsThreadPrivateGet (cacRecursionLock); if ( p ) { return ECA_EVDISALLOW; } - threadPrivateSet (cacRecursionLock, &cacRecursionLock); + epicsThreadPrivateSet (cacRecursionLock, &cacRecursionLock); cur_time = osiTime::getCurrent (); @@ -140,7 +140,7 @@ int CASG::block ( double timeout ) this->client.disableCallbackPreemption (); - threadPrivateSet (cacRecursionLock, NULL); + epicsThreadPrivateSet (cacRecursionLock, NULL); return status; } diff --git a/src/ca/access.cpp b/src/ca/access.cpp index 18e239079..f9b1752ce 100644 --- a/src/ca/access.cpp +++ b/src/ca/access.cpp @@ -27,16 +27,16 @@ #include "oldAccess.h" #include "cac_IL.h" -threadPrivateId caClientContextId; +epicsThreadPrivateId caClientContextId; -threadPrivateId cacRecursionLock; +epicsThreadPrivateId cacRecursionLock; -static threadOnceId caClientContextIdOnce = OSITHREAD_ONCE_INIT; +static epicsThreadOnceId caClientContextIdOnce = EPICS_THREAD_ONCE_INIT; extern "C" void ca_client_exit_handler () { if ( caClientContextId ) { - threadPrivateDelete ( caClientContextId ); + epicsThreadPrivateDelete ( caClientContextId ); caClientContextId = 0; } } @@ -44,7 +44,7 @@ extern "C" void ca_client_exit_handler () // runs once only for each process extern "C" void ca_init_client_context ( void * ) { - caClientContextId = threadPrivateCreate (); + caClientContextId = epicsThreadPrivateCreate (); if ( caClientContextId ) { atexit ( ca_client_exit_handler ); } @@ -58,20 +58,20 @@ int fetchClientContext ( cac **ppcac ) int status; if ( caClientContextId == 0 ) { - threadOnce ( &caClientContextIdOnce, ca_init_client_context, 0 ); + epicsThreadOnce ( &caClientContextIdOnce, ca_init_client_context, 0 ); if ( caClientContextId == 0 ) { return ECA_ALLOCMEM; } } - *ppcac = ( cac * ) threadPrivateGet ( caClientContextId ); + *ppcac = ( cac * ) epicsThreadPrivateGet ( caClientContextId ); if ( *ppcac ) { status = ECA_NORMAL; } else { status = ca_task_initialize (); if ( status == ECA_NORMAL ) { - *ppcac = (cac *) threadPrivateGet ( caClientContextId ); + *ppcac = (cac *) epicsThreadPrivateGet ( caClientContextId ); if ( ! *ppcac ) { status = ECA_INTERNAL; } @@ -119,13 +119,13 @@ extern "C" epicsShareFunc int epicsShareAPI ca_context_create ( int preemptiveCa { cac *pcac; - threadOnce ( &caClientContextIdOnce, ca_init_client_context, 0); + epicsThreadOnce ( &caClientContextIdOnce, ca_init_client_context, 0); if ( caClientContextId == 0 ) { return ECA_ALLOCMEM; } - pcac = (cac *) threadPrivateGet ( caClientContextId ); + pcac = (cac *) epicsThreadPrivateGet ( caClientContextId ); if ( pcac ) { return ECA_NORMAL; } @@ -135,7 +135,7 @@ extern "C" epicsShareFunc int epicsShareAPI ca_context_create ( int preemptiveCa return ECA_ALLOCMEM; } - threadPrivateSet ( caClientContextId, (void *) pcac ); + epicsThreadPrivateSet ( caClientContextId, (void *) pcac ); return ECA_NORMAL; } @@ -185,10 +185,10 @@ extern "C" epicsShareFunc int epicsShareAPI ca_context_destroy () cac *pcac; if ( caClientContextId != NULL ) { - pcac = (cac *) threadPrivateGet ( caClientContextId ); + pcac = (cac *) epicsThreadPrivateGet ( caClientContextId ); if ( pcac ) { delete pcac; - threadPrivateSet ( caClientContextId, 0 ); + epicsThreadPrivateSet ( caClientContextId, 0 ); } } @@ -553,7 +553,7 @@ extern "C" void epicsShareAPI ca_signal_formated ( long ca_status, const char *p }; if ( caClientContextId ) { - pcac = (cac *) threadPrivateGet ( caClientContextId ); + pcac = (cac *) epicsThreadPrivateGet ( caClientContextId ); } else { pcac = NULL; @@ -688,7 +688,7 @@ int ca_printf ( const char *pformat, ... ) int ca_vPrintf ( const char *pformat, va_list args ) { if ( caClientContextId ) { - cac *pcac = (cac *) threadPrivateGet ( caClientContextId ); + cac *pcac = (cac *) epicsThreadPrivateGet ( caClientContextId ); if ( pcac ) { return pcac->vPrintf ( pformat, args ); } @@ -790,7 +790,7 @@ extern "C" unsigned epicsShareAPI ca_get_ioc_connection_count () return pcac->connectionCount (); } -extern "C" epicsShareFunc int epicsShareAPI ca_channel_status ( threadId /* tid */ ) +extern "C" epicsShareFunc int epicsShareAPI ca_channel_status ( epicsThreadId /* tid */ ) { printf ("new OSI API does not allow peeking at thread private storage of another thread\n"); printf ("please call \"ca_client_status ( unsigned level )\" from the subsystem specific diagnostic code.\n"); @@ -820,7 +820,7 @@ extern "C" epicsShareFunc int epicsShareAPI ca_client_status ( unsigned level ) extern "C" epicsShareFunc int epicsShareAPI ca_current_context (caClientCtx *pCurrentContext) { if ( caClientContextId ) { - void *pCtx = threadPrivateGet ( caClientContextId ); + void *pCtx = epicsThreadPrivateGet ( caClientContextId ); if (pCtx) { *pCurrentContext = pCtx; return ECA_NORMAL; @@ -844,11 +844,11 @@ extern "C" epicsShareFunc int epicsShareAPI ca_attach_context (caClientCtx conte { cac *pcac; - pcac = (cac *) threadPrivateGet ( caClientContextId ); + pcac = (cac *) epicsThreadPrivateGet ( caClientContextId ); if ( pcac && context != 0 ) { return ECA_ISATTACHED; } - threadPrivateSet ( caClientContextId, context ); + epicsThreadPrivateSet ( caClientContextId, context ); return ECA_NORMAL; } diff --git a/src/ca/cac.cpp b/src/ca/cac.cpp index eb9b3dc58..7f2e090fd 100644 --- a/src/ca/cac.cpp +++ b/src/ca/cac.cpp @@ -24,14 +24,14 @@ extern "C" void cacRecursionLockExitHandler () { if ( cacRecursionLock ) { - threadPrivateDelete ( cacRecursionLock ); + epicsThreadPrivateDelete ( cacRecursionLock ); cacRecursionLock = 0; } } extern "C" void cacInitRecursionLock ( void * ) { - cacRecursionLock = threadPrivateCreate (); + cacRecursionLock = epicsThreadPrivateCreate (); if ( cacRecursionLock ) { atexit ( cacRecursionLockExitHandler ); } @@ -50,14 +50,14 @@ cac::cac ( bool enablePreemptiveCallbackIn ) : pudpiiu ( 0 ), pSearchTmr ( 0 ), pRepeaterSubscribeTmr ( 0 ), - initializingThreadsPriority ( threadGetPrioritySelf () ), + initializingThreadsPriority ( epicsThreadGetPrioritySelf () ), enablePreemptiveCallback ( enablePreemptiveCallbackIn ) { long status; - static threadOnceId once = OSITHREAD_ONCE_INIT; + static epicsThreadOnceId once = EPICS_THREAD_ONCE_INIT; unsigned abovePriority; - threadOnce ( &once, cacInitRecursionLock, 0 ); + epicsThreadOnce ( &once, cacInitRecursionLock, 0 ); if ( cacRecursionLock == 0 ) { throwWithLocation ( caErrorCode (ECA_ALLOCMEM) ); @@ -68,10 +68,10 @@ cac::cac ( bool enablePreemptiveCallbackIn ) : } { - threadBoolStatus tbs; + epicsThreadBooleanStatus tbs; - tbs = threadLowestPriorityLevelAbove ( this->initializingThreadsPriority, &abovePriority); - if ( tbs != tbsSuccess ) { + tbs = epicsThreadLowestPriorityLevelAbove ( this->initializingThreadsPriority, &abovePriority); + if ( tbs != epicsThreadBooleanStatusSuccess ) { abovePriority = this->initializingThreadsPriority; } } @@ -518,12 +518,12 @@ int cac::pend ( double timeout, int early ) /* * dont allow recursion */ - p = threadPrivateGet ( cacRecursionLock ); + p = epicsThreadPrivateGet ( cacRecursionLock ); if (p) { return ECA_EVDISALLOW; } - threadPrivateSet ( cacRecursionLock, &cacRecursionLock ); + epicsThreadPrivateSet ( cacRecursionLock, &cacRecursionLock ); this->enableCallbackPreemption (); @@ -531,7 +531,7 @@ int cac::pend ( double timeout, int early ) this->disableCallbackPreemption (); - threadPrivateSet ( cacRecursionLock, NULL ); + epicsThreadPrivateSet ( cacRecursionLock, NULL ); return status; } @@ -1039,7 +1039,7 @@ void cac::destroyNCIU ( nciu & chan ) bool cac::flushPermit () const { if ( this->pRecvProcThread ) { - if ( this->pRecvProcThread->isCurrentThread () ) { + if ( this->pRecvProcThread->thread.isCurrentThread () ) { return false; } } diff --git a/src/ca/cadef.h b/src/ca/cadef.h index c1590cbf5..f03876f81 100644 --- a/src/ca/cadef.h +++ b/src/ca/cadef.h @@ -37,7 +37,7 @@ # endif #endif -#include "osiThread.h" +#include "epicsThread.h" #include "shareLib.h" #include "caerr.h" #include "db_access.h" @@ -941,14 +941,14 @@ typedef void * caClientCtx; epicsShareFunc int epicsShareAPI ca_current_context (caClientCtx *pCurrentContext); epicsShareFunc int epicsShareAPI ca_attach_context (caClientCtx context); -epicsShareFunc int epicsShareAPI ca_channel_status (threadId tid); +epicsShareFunc int epicsShareAPI ca_channel_status (epicsThreadId tid); epicsShareFunc int epicsShareAPI ca_client_status (unsigned level); /* * deprecated */ -epicsShareFunc int epicsShareAPI ca_import (threadId tid); -epicsShareFunc int epicsShareAPI ca_import_cancel (threadId tid); +epicsShareFunc int epicsShareAPI ca_import (epicsThreadId tid); +epicsShareFunc int epicsShareAPI ca_import_cancel (epicsThreadId tid); #else /* CAC_ANSI_FUNC_PROTO */ diff --git a/src/ca/casw.cpp b/src/ca/casw.cpp index dcaeb9fc3..7a8d2f7a7 100644 --- a/src/ca/casw.cpp +++ b/src/ca/casw.cpp @@ -68,7 +68,7 @@ int main ( int argc, char **argv ) unsigned attemptNumber = 0u; while ( true ) { caRepeaterRegistrationMessage ( sock, repeaterPort, attemptNumber ); - threadSleep ( 0.1 ); + epicsThreadSleep ( 0.1 ); addrSize = ( osiSocklen_t ) sizeof ( addr ); status = recvfrom ( sock, buf, sizeof ( buf ), 0, &addr.sa, &addrSize ); diff --git a/src/ca/iocinf.h b/src/ca/iocinf.h index 4be4d7de5..19b855534 100644 --- a/src/ca/iocinf.h +++ b/src/ca/iocinf.h @@ -45,7 +45,7 @@ #include "tsDLList.h" #include "osiSock.h" #include "epicsEvent.h" -#include "osiThread.h" +#include "epicsThread.h" #include "osiTimer.h" #include "epicsMutex.h" #include "epicsEvent.h" @@ -486,7 +486,7 @@ static const unsigned contiguousMsgCountWhichTriggersFlowControl = 10u; enum iiu_conn_state {iiu_connecting, iiu_connected, iiu_disconnected}; -extern threadPrivateId cacRecursionLock; +extern epicsThreadPrivateId cacRecursionLock; class netiiu { public: @@ -610,7 +610,7 @@ private: char xmitBuf [MAX_UDP_SEND]; char recvBuf [MAX_UDP_RECV]; ELLLIST dest; - threadId recvThreadId; + epicsThreadId recvThreadId; epicsEventId recvThreadExitSignal; unsigned nBytesInXmitBuf; SOCKET sock; @@ -900,16 +900,17 @@ private: int code; }; -class recvProcessThread : public osiThread { +class recvProcessThread : public epicsThreadRunable { public: recvProcessThread ( class cac *pcacIn ); ~recvProcessThread (); - void entryPoint (); + void run (); void signalShutDown (); void enable (); void disable (); void signalActivity (); void show ( unsigned level ) const; + epicsThread thread; private: // // The additional complexity associated with @@ -929,13 +930,14 @@ private: bool shutDown; }; -class sendProcessThread : public osiThread { +class sendProcessThread : public epicsThreadRunable { public: sendProcessThread ( class cac &cacIn ); ~sendProcessThread (); - void entryPoint (); + void run (); void signalShutDown (); void signalActivity (); + epicsThread thread; private: epicsEvent sendActivity; class cac &cacRef; diff --git a/src/ca/recvProcessThread.cpp b/src/ca/recvProcessThread.cpp index 183edfb3e..8b2f6b229 100644 --- a/src/ca/recvProcessThread.cpp +++ b/src/ca/recvProcessThread.cpp @@ -20,24 +20,26 @@ #include "cac_IL.h" recvProcessThread::recvProcessThread (cac *pcacIn) : - osiThread ( "CAC-recv-process", threadGetStackSize (threadStackSmall), - pcacIn->getInitializingThreadsPriority () ), + thread(*this, "CAC-recv-process", + epicsThreadGetStackSize(epicsThreadStackSmall), + pcacIn->getInitializingThreadsPriority() ), pcac ( pcacIn ), enableRefCount ( 0u ), blockingForCompletion ( 0u ), processing ( false ), shutDown ( false ) { - this->start (); + this->thread.start (); } recvProcessThread::~recvProcessThread () { this->signalShutDown (); this->exit.wait (); + delete &thread; } -void recvProcessThread::entryPoint () +void recvProcessThread::run () { int status = ca_attach_context ( this->pcac ); SEVCHK ( status, "attaching to client context in recv process thread" ); diff --git a/src/ca/repeater.cpp b/src/ca/repeater.cpp index d8e9a5c86..6400667b3 100644 --- a/src/ca/repeater.cpp +++ b/src/ca/repeater.cpp @@ -562,7 +562,7 @@ void epicsShareAPI ca_repeater () */ void caRepeaterThread ( void * /* pDummy */ ) { - taskwdInsert ( threadGetIdSelf(), NULL, NULL ); + taskwdInsert ( epicsThreadGetIdSelf(), NULL, NULL ); ca_repeater (); } diff --git a/src/ca/tcpiiu.cpp b/src/ca/tcpiiu.cpp index 402325570..6bd1b4150 100644 --- a/src/ca/tcpiiu.cpp +++ b/src/ca/tcpiiu.cpp @@ -303,15 +303,15 @@ extern "C" void cacRecvThreadTCP ( void *pParam ) epicsAutoMutex autoMutex ( piiu->mutex ); if ( piiu->state == iiu_connected ) { unsigned priorityOfSend; - threadBoolStatus tbs; - threadId tid; + epicsThreadBooleanStatus tbs; + epicsThreadId tid; - tbs = threadLowestPriorityLevelAbove ( piiu->pCAC ()->getInitializingThreadsPriority (), &priorityOfSend ); - if ( tbs != tbsSuccess ) { + tbs = epicsThreadLowestPriorityLevelAbove ( piiu->pCAC ()->getInitializingThreadsPriority (), &priorityOfSend ); + if ( tbs != epicsThreadBooleanStatusSuccess ) { priorityOfSend = piiu->pCAC ()->getInitializingThreadsPriority (); } - tid = threadCreate ( "CAC-TCP-send", priorityOfSend, - threadGetStackSize ( threadStackMedium ), cacSendThreadTCP, piiu ); + tid = epicsThreadCreate ( "CAC-TCP-send", priorityOfSend, + epicsThreadGetStackSize ( epicsThreadStackMedium ), cacSendThreadTCP, piiu ); if ( ! tid ) { epicsEventSignal ( piiu->recvThreadExitSignal ); epicsEventSignal ( piiu->sendThreadExitSignal ); @@ -353,7 +353,7 @@ extern "C" void cacRecvThreadTCP ( void *pParam ) } else { // no way to be informed when memory is available - threadSleep ( 0.5 ); + epicsThreadSleep ( 0.5 ); } } } @@ -429,8 +429,8 @@ bool tcpiiu::initiateConnect ( const osiSockAddr &addrIn, unsigned minorVersion, class bhe &bhe, ipAddrToAsciiEngine &engineIn ) { unsigned priorityOfRecv; - threadBoolStatus tbs; - threadId tid; + epicsThreadBooleanStatus tbs; + epicsThreadId tid; int status; int flag; @@ -511,13 +511,13 @@ bool tcpiiu::initiateConnect ( const osiSockAddr &addrIn, unsigned minorVersion, memset ( (void *) &this->curMsg, '\0', sizeof ( this->curMsg ) ); - tbs = threadHighestPriorityLevelBelow ( this->pCAC ()->getInitializingThreadsPriority (), &priorityOfRecv ); - if ( tbs != tbsSuccess ) { + tbs = epicsThreadHighestPriorityLevelBelow ( this->pCAC ()->getInitializingThreadsPriority (), &priorityOfRecv ); + if ( tbs != epicsThreadBooleanStatusSuccess ) { priorityOfRecv = this->pCAC ()->getInitializingThreadsPriority (); } - tid = threadCreate ("CAC-TCP-recv", priorityOfRecv, - threadGetStackSize (threadStackMedium), cacRecvThreadTCP, this); + tid = epicsThreadCreate ("CAC-TCP-recv", priorityOfRecv, + epicsThreadGetStackSize (epicsThreadStackMedium), cacRecvThreadTCP, this); if ( tid == 0 ) { ca_printf ("CA: unable to create CA client receive thread\n"); socket_close ( this->sock ); diff --git a/src/ca/udpiiu.cpp b/src/ca/udpiiu.cpp index 12f1b5f7b..eb4fcaa3c 100644 --- a/src/ca/udpiiu.cpp +++ b/src/ca/udpiiu.cpp @@ -314,10 +314,10 @@ epicsShareFunc void epicsShareAPI caStartRepeaterIfNotInstalled ( unsigned repea */ osptr = osiSpawnDetachedProcess ( "CA Repeater", "caRepeater" ); if ( osptr == osiSpawnDetachedProcessNoSupport ) { - threadId tid; + epicsThreadId tid; - tid = threadCreate ( "CAC-repeater", threadPriorityLow, - threadGetStackSize (threadStackMedium), caRepeaterThread, 0); + tid = epicsThreadCreate ( "CAC-repeater", epicsThreadPriorityLow, + epicsThreadGetStackSize (epicsThreadStackMedium), caRepeaterThread, 0); if ( tid == 0 ) { ca_printf ("caStartRepeaterIfNotInstalled : unable to create CA repeater daemon thread\n"); } @@ -413,16 +413,16 @@ udpiiu::udpiiu ( cac &cac ) : { unsigned priorityOfRecv; - threadBoolStatus tbs; + epicsThreadBooleanStatus tbs; - tbs = threadLowestPriorityLevelAbove ( + tbs = epicsThreadLowestPriorityLevelAbove ( this->pCAC ()->getInitializingThreadsPriority (), &priorityOfRecv ); - if ( tbs != tbsSuccess ) { + if ( tbs != epicsThreadBooleanStatusSuccess ) { priorityOfRecv = this->pCAC ()->getInitializingThreadsPriority (); } - this->recvThreadId = threadCreate ( "CAC-UDP", priorityOfRecv, - threadGetStackSize (threadStackMedium), cacRecvThreadUDP, this ); + this->recvThreadId = epicsThreadCreate ( "CAC-UDP", priorityOfRecv, + epicsThreadGetStackSize (epicsThreadStackMedium), cacRecvThreadUDP, this ); if ( this->recvThreadId == 0 ) { ca_printf ("CA: unable to create UDP receive thread\n"); epicsEventDestroy (this->recvThreadExitSignal); @@ -852,5 +852,5 @@ void udpiiu::show ( unsigned level ) const bool udpiiu::isCurrentThread () const { - return ( this->recvThreadId == threadGetIdSelf () ); + return ( this->recvThreadId == epicsThreadGetIdSelf () ); } diff --git a/src/db/callback.c b/src/db/callback.c index 892c16bc4..e72fe462e 100644 --- a/src/db/callback.c +++ b/src/db/callback.c @@ -19,7 +19,7 @@ of this distribution. #include "dbDefs.h" #include "epicsEvent.h" -#include "osiThread.h" +#include "epicsThread.h" #include "osiInterrupt.h" #include "osiTimer.h" #include "epicsRingPointer.h" @@ -42,7 +42,7 @@ of this distribution. int callbackQueueSize = 2000; static epicsEventId callbackSem[NUM_CALLBACK_PRIORITIES]; static epicsRingPointerId callbackQ[NUM_CALLBACK_PRIORITIES]; -static threadId callbackTaskId[NUM_CALLBACK_PRIORITIES]; +static epicsThreadId callbackTaskId[NUM_CALLBACK_PRIORITIES]; static int ringOverflow[NUM_CALLBACK_PRIORITIES]; static void callbackInitPvt(void *); volatile int callbackRestart=FALSE; @@ -74,7 +74,7 @@ static void callbackInitPvt(void *arg) { int i; - timerQueue = osiTimerQueueCreate(threadPriorityScanHigh); + timerQueue = osiTimerQueueCreate(epicsThreadPriorityScanHigh); for(i=0; i #include "dbDefs.h" -#include "osiThread.h" +#include "epicsThread.h" #include "errlog.h" #include "cantProceed.h" #include "cvtFast.h" diff --git a/src/db/dbBkpt.c b/src/db/dbBkpt.c index 89582ad8c..0f96b8f9a 100644 --- a/src/db/dbBkpt.c +++ b/src/db/dbBkpt.c @@ -14,6 +14,9 @@ of this distribution. /* Modification Log: * ----------------- * $Log$ + * Revision 1.25 2001/01/12 00:27:16 jhill + * fixed bugs introduced by APS's osi => epics name changes + * * Revision 1.24 2001/01/11 16:11:21 mrk * replace osiSem with epicsMutex and/or epicsEvent * @@ -33,7 +36,7 @@ of this distribution. * changes for creating win dlls * * Revision 1.18 2000/02/26 23:45:22 norume - * Reflect routine name change from threadSuspend() to threadSuspendSelf(). + * Reflect routine name change from threadSuspend() to epicsThreadSuspendSelf(). * * Revision 1.17 2000/02/25 22:26:38 mrk * more changes for creating dlls @@ -107,7 +110,7 @@ of this distribution. #include #include "dbDefs.h" -#include "osiThread.h" +#include "epicsThread.h" #include "epicsMutex.h" #include "epicsEvent.h" #include "tsStamp.h" @@ -426,9 +429,9 @@ long epicsShareAPI dbb(const char *record_name) /* * Spawn continuation task */ - pnode->taskid = threadCreate("bkptCont",threadPriorityScanLow-1, - threadGetStackSize(threadStackBig), - (THREADFUNC)dbBkptCont,precord); + pnode->taskid = epicsThreadCreate("bkptCont",epicsThreadPriorityScanLow-1, + epicsThreadGetStackSize(epicsThreadStackBig), + (EPICSTHREADFUNC)dbBkptCont,precord); if (pnode->taskid == 0) { printf(" BKPT> Cannot spawn task to process record\n"); pnode->taskid = 0; @@ -567,7 +570,7 @@ long epicsShareAPI dbc(const char *record_name) * for a record with a breakpoint. This occurs * because stepping mode has been switched off. */ - threadResume(pnode->taskid); + epicsThreadResume(pnode->taskid); epicsMutexUnlock(bkpt_stack_sem); return(0); } @@ -596,7 +599,7 @@ long epicsShareAPI dbs(const char *record_name) last_lset = pnode->l_num; - threadResume(pnode->taskid); + epicsThreadResume(pnode->taskid); epicsMutexUnlock(bkpt_stack_sem); return(0); } @@ -758,7 +761,7 @@ int epicsShareAPI dbBkpt(dbCommon *precord) * source, queue its execution, but dump out of dbProcess without * calling record support. */ - if (pnode->taskid && (threadGetIdSelf() != pnode->taskid)) { + if (pnode->taskid && (epicsThreadGetIdSelf() != pnode->taskid)) { /* CONTINUE TASK CANNOT ENTER HERE */ /* @@ -855,7 +858,7 @@ int epicsShareAPI dbBkpt(dbCommon *precord) */ epicsMutexUnlock(bkpt_stack_sem); dbScanUnlock(precord); - threadSuspendSelf(); + epicsThreadSuspendSelf(); dbScanLock(precord); epicsMutexMustLock(bkpt_stack_sem); } diff --git a/src/db/dbBkpt.h b/src/db/dbBkpt.h index dac6221d1..80c6d3b6d 100644 --- a/src/db/dbBkpt.h +++ b/src/db/dbBkpt.h @@ -32,6 +32,10 @@ #ifndef INCdbBkptsh #define INCdbBkptsh 1 +#include "ellLib.h" +#include "epicsEvent.h" +#include "epicsThread.h" +#include "tsStamp.h" #include "shareLib.h" #ifdef __cplusplus extern "C" { @@ -73,7 +77,7 @@ struct LS_LIST { ELLLIST bp_list; /* list of records containing breakpoints in a lockset */ ELLLIST ep_queue; /* queue of entrypoints found so far */ epicsEventId ex_sem; /* semaphore for execution queue */ - threadId taskid; /* saved taskid for the task in stepping mode */ + epicsThreadId taskid; /* saved taskid for the task in stepping mode */ int step; /* one if currently "stepping," else zero */ unsigned long l_num; /* lockset number */ }; diff --git a/src/db/dbCa.c b/src/db/dbCa.c index d21ea7389..5b4f6daa1 100644 --- a/src/db/dbCa.c +++ b/src/db/dbCa.c @@ -33,7 +33,7 @@ of this distribution. #include "dbDefs.h" #include "epicsMutex.h" #include "epicsEvent.h" -#include "osiThread.h" +#include "epicsThread.h" #include "tsStamp.h" #include "errlog.h" #include "taskwd.h" @@ -85,8 +85,8 @@ void epicsShareAPI dbCaLinkInit(void) ellInit(&caList); caListSem = epicsMutexMustCreate(); caWakeupSem = epicsEventMustCreate(epicsEventEmpty); - threadCreate("dbCaLink", threadPriorityMedium, - threadGetStackSize(threadStackBig), (THREADFUNC) dbCaTask,0); + epicsThreadCreate("dbCaLink", epicsThreadPriorityMedium, + epicsThreadGetStackSize(epicsThreadStackBig), (EPICSTHREADFUNC) dbCaTask,0); } void epicsShareAPI dbCaAddLink( struct link *plink) @@ -627,13 +627,13 @@ void dbCaTask() short link_action; int status; - taskwdInsert(threadGetIdSelf(),NULL,NULL); + taskwdInsert(epicsThreadGetIdSelf(),NULL,NULL); SEVCHK(ca_context_create(enablePreemption), "dbCaTask calling ca_context_create"); SEVCHK(ca_add_exception_event(exceptionCallback,NULL), "ca_add_exception_event"); /*Dont do anything until iocInit initializes database*/ - while(!interruptAccept) threadSleep(.1); + while(!interruptAccept) epicsThreadSleep(.1); /* channel access event loop */ while (TRUE){ epicsEventMustWait(caWakeupSem); diff --git a/src/db/dbEvent.c b/src/db/dbEvent.c index 94ff0db35..59fa5f230 100644 --- a/src/db/dbEvent.c +++ b/src/db/dbEvent.c @@ -29,7 +29,7 @@ of this distribution. #include "dbDefs.h" #include "epicsMutex.h" #include "epicsEvent.h" -#include "osiThread.h" +#include "epicsThread.h" #include "errlog.h" #include "taskwd.h" #include "freeList.h" @@ -97,13 +97,13 @@ struct event_user { EXTRALABORFUNC *extralabor_sub;/* off load to event task */ void *extralabor_arg;/* parameter to above */ - threadId taskid; /* event handler task id */ + epicsThreadId taskid; /* event handler task id */ unsigned queovr; /* event que overflow count */ unsigned char pendexit; /* exit pend task */ unsigned char extra_labor; /* if set call extra labor func */ unsigned char flowCtrlMode; /* replace existing monitor */ void (*init_func)(); - threadId init_func_arg; + epicsThreadId init_func_arg; }; @@ -528,7 +528,7 @@ int epicsShareAPI db_flush_extra_labor_event (dbEventCtx ctx) struct event_user *evUser = (struct event_user *) ctx; while(evUser->extra_labor){ - threadSleep(1.0); + epicsThreadSleep(1.0); } return DB_EVENT_OK; @@ -880,7 +880,7 @@ LOCAL void event_task (void *pParm) (*evUser->init_func)(evUser->init_func_arg); } - taskwdInsert ( threadGetIdSelf(), NULL, NULL ); + taskwdInsert ( epicsThreadGetIdSelf(), NULL, NULL ); do{ epicsEventMustWait(evUser->ppendsem); @@ -936,7 +936,7 @@ LOCAL void event_task (void *pParm) freeListFree(dbevEventUserFreeList, evUser); - taskwdRemove(threadGetIdSelf()); + taskwdRemove(epicsThreadGetIdSelf()); return; } @@ -945,7 +945,7 @@ LOCAL void event_task (void *pParm) * DB_START_EVENTS() */ int epicsShareAPI db_start_events ( - dbEventCtx ctx,const char *taskname, void (*init_func)(threadId), + dbEventCtx ctx,const char *taskname, void (*init_func)(epicsThreadId), void *init_func_arg, unsigned osiPriority ) { struct event_user *evUser = (struct event_user *) ctx; @@ -967,8 +967,8 @@ int epicsShareAPI db_start_events ( if (!taskname) { taskname = EVENT_PEND_NAME; } - evUser->taskid = threadCreate ( - taskname, osiPriority, threadGetStackSize(threadStackMedium), + evUser->taskid = epicsThreadCreate ( + taskname, osiPriority, epicsThreadGetStackSize(epicsThreadStackMedium), event_task, (void *)evUser); if (!evUser->taskid) { epicsMutexUnlock (evUser->firstque.writelock); diff --git a/src/db/dbLock.c b/src/db/dbLock.c index 7a83db43d..7ea5e2d7a 100644 --- a/src/db/dbLock.c +++ b/src/db/dbLock.c @@ -68,7 +68,7 @@ since this will delay all other threads. #include "dbBase.h" #include "epicsMutex.h" #include "tsStamp.h" -#include "osiThread.h" +#include "epicsThread.h" #include "cantProceed.h" #include "ellLib.h" #include "dbBase.h" @@ -96,7 +96,7 @@ typedef struct lockSet { ELLNODE node; ELLLIST recordList; epicsMutexId lock; - threadId thread_id; + epicsThreadId thread_id; dbCommon *precord; unsigned long id; } lockSet; @@ -166,11 +166,11 @@ void epicsShareAPI dbLockSetRecordLock(dbCommon *precord) if(!plockRecord) return; plockSet = plockRecord->plockSet; if(!plockSet) return; - if(plockSet->thread_id==threadGetIdSelf()) return; + if(plockSet->thread_id==epicsThreadGetIdSelf()) return; /*Wait for up to 1 minute*/ status = epicsMutexLockWithTimeout(plockRecord->plockSet->lock,60.0); if(status==epicsMutexLockOK) { - plockSet->thread_id = threadGetIdSelf(); + plockSet->thread_id = epicsThreadGetIdSelf(); plockSet->precord = (void *)precord; /*give it back in case it will not be changed*/ epicsMutexUnlock(plockRecord->plockSet->lock); @@ -178,7 +178,7 @@ void epicsShareAPI dbLockSetRecordLock(dbCommon *precord) } /*Should never reach this point*/ errlogPrintf("dbLockSetRecordLock timeout caller 0x%x owner 0x%x", - threadGetIdSelf(),plockSet->thread_id); + epicsThreadGetIdSelf(),plockSet->thread_id); errlogPrintf(" record %s\n",precord->name); cantProceed("dbLockSetRecordLock"); } @@ -192,16 +192,16 @@ void epicsShareAPI dbScanLock(dbCommon *precord) if(!(plockRecord= precord->lset)) { epicsPrintf("dbScanLock plockRecord is NULL record %s\n", precord->name); - threadSuspendSelf(); + epicsThreadSuspendSelf(); } while(TRUE) { - while(changingLockSets) threadSleep(.05); + while(changingLockSets) epicsThreadSleep(.05); status = epicsMutexLock(plockRecord->plockSet->lock); /*epicsMutexLock fails if epicsMutexDestroy was called while active*/ if(status==epicsMutexLockOK) break; } plockSet = plockRecord->plockSet; - plockSet->thread_id = threadGetIdSelf(); + plockSet->thread_id = epicsThreadGetIdSelf(); plockSet->precord = (void *)precord; return; } diff --git a/src/db/dbScan.c b/src/db/dbScan.c index 8590bf6bc..3e8364372 100644 --- a/src/db/dbScan.c +++ b/src/db/dbScan.c @@ -55,7 +55,7 @@ #include "epicsMutex.h" #include "epicsEvent.h" #include "osiInterrupt.h" -#include "osiThread.h" +#include "epicsThread.h" #include "tsStamp.h" #include "cantProceed.h" #include "epicsRingPointer.h" @@ -79,7 +79,7 @@ int onceQueueSize = 1000; static epicsEventId onceSem; static epicsRingPointerId onceQ; -static threadId onceTaskId; +static epicsThreadId onceTaskId; /*all other scan types */ typedef struct scan_list{ @@ -117,7 +117,7 @@ static io_scan_list *iosl_head[NUM_CALLBACK_PRIORITIES]={NULL,NULL,NULL}; /* PERIODIC SCANNER */ static int nPeriodic=0; static scan_list **papPeriodic; /* pointer to array of pointers*/ -static threadId *periodicTaskId; /*array of thread ids*/ +static epicsThreadId *periodicTaskId; /*array of thread ids*/ /* Private routines */ static void onceTask(void); @@ -485,9 +485,9 @@ static void initOnce(void) cantProceed("dbScan: initOnce failed"); } onceSem=epicsEventMustCreate(epicsEventEmpty); - onceTaskId = threadCreate("scanOnce",threadPriorityScanHigh, - threadGetStackSize(threadStackBig), - (THREADFUNC)onceTask,0); + onceTaskId = epicsThreadCreate("scanOnce",epicsThreadPriorityScanHigh, + epicsThreadGetStackSize(epicsThreadStackBig), + (EPICSTHREADFUNC)onceTask,0); taskwdInsert(onceTaskId,NULL,0L); } @@ -506,7 +506,7 @@ static void periodicTask(void *arg) diff = tsStampDiffInSeconds(&end_time,&start_time); delay = psl->rate - diff; delay = (delay<=0.0) ? .1 : delay; - threadSleep(delay); + epicsThreadSleep(delay); tsStampGetCurrent(&start_time); } } @@ -548,11 +548,11 @@ static void spawnPeriodic(int ind) while(taskName[strlen(taskName)-1]=='0') taskName[strlen(taskName)-1] = 0; /*strip trailing . */ if(taskName[strlen(taskName)-1]=='.') taskName[strlen(taskName)-1] = 0; - periodicTaskId[ind] = threadCreate( + periodicTaskId[ind] = epicsThreadCreate( taskName, - threadPriorityScanLow + ind, - threadGetStackSize(threadStackBig), - (THREADFUNC)periodicTask, + epicsThreadPriorityScanLow + ind, + epicsThreadGetStackSize(epicsThreadStackBig), + (EPICSTHREADFUNC)periodicTask, (void *)psl); taskwdInsert(periodicTaskId[ind],NULL,0L); } diff --git a/src/db/dbServiceIO.cpp b/src/db/dbServiceIO.cpp index 2f7604e66..17210187a 100644 --- a/src/db/dbServiceIO.cpp +++ b/src/db/dbServiceIO.cpp @@ -132,10 +132,10 @@ dbEventSubscription dbServiceIO::subscribe ( struct dbAddr &addr, dbSubscription return 0; } - unsigned selfPriority = threadGetPrioritySelf (); + unsigned selfPriority = epicsThreadGetPrioritySelf (); unsigned above; - threadBoolStatus tbs = threadLowestPriorityLevelAbove (selfPriority, &above); - if ( tbs != tbsSuccess ) { + epicsThreadBooleanStatus tbs = epicsThreadLowestPriorityLevelAbove (selfPriority, &above); + if ( tbs != epicsThreadBooleanStatusSuccess ) { above = selfPriority; } status = db_start_events ( this->ctx, "CAC-event", diff --git a/src/db/recGbl.c b/src/db/recGbl.c index 6f2cc6fcc..b08f70d86 100644 --- a/src/db/recGbl.c +++ b/src/db/recGbl.c @@ -48,7 +48,6 @@ #include #include "dbDefs.h" -#include "osiThread.h" #include "tsStamp.h" #include "epicsPrint.h" #include "dbBase.h" diff --git a/src/db/test/callbackTest.c b/src/db/test/callbackTest.c index 13269a380..897ba718b 100644 --- a/src/db/test/callbackTest.c +++ b/src/db/test/callbackTest.c @@ -14,7 +14,7 @@ of this distribution. #include #include -#include "osiThread.h" +#include "epicsThread.h" #include "errlog.h" #include "callback.h" #include "taskwd.h" @@ -68,6 +68,6 @@ void callbackTest(void) wait[i]->requestedDiff = (double)i; callbackRequestDelayed(&wait[i]->callback,wait[i]->requestedDiff); } - threadSleep((double)(ncallbacks + 2)); + epicsThreadSleep((double)(ncallbacks + 2)); printf("callbackTest returning\n"); } diff --git a/src/db/test/callbackTestMain.c b/src/db/test/callbackTestMain.c index a0836b689..f77fd1ea9 100644 --- a/src/db/test/callbackTestMain.c +++ b/src/db/test/callbackTestMain.c @@ -13,14 +13,12 @@ of this distribution. #include #include -#include "osiThread.h" void *pdbbase=NULL; void callbackTest(void); int main(int argc,char *argv[]) { - threadInit(); callbackTest(); printf("main terminating\n"); return(0); diff --git a/src/dbStatic/dbExpand.c b/src/dbStatic/dbExpand.c index 894be7d46..475933593 100644 --- a/src/dbStatic/dbExpand.c +++ b/src/dbStatic/dbExpand.c @@ -22,7 +22,6 @@ of this distribution. #include #include "dbDefs.h" -#include "osiThread.h" #include "epicsPrint.h" #include "errMdef.h" #include "dbStaticLib.h" @@ -48,7 +47,6 @@ int main(int argc,char **argv) static char *pathSep = OSI_PATH_LIST_SEPARATOR; static char *subSep = ","; - threadInit(); /*Look for options*/ if(argc<2) { fprintf(stderr, diff --git a/src/dbStatic/dbMakeDBDDepends.c b/src/dbStatic/dbMakeDBDDepends.c index 93a65dac4..9a739cc9d 100644 --- a/src/dbStatic/dbMakeDBDDepends.c +++ b/src/dbStatic/dbMakeDBDDepends.c @@ -19,7 +19,6 @@ of this distribution. #include "dbStaticLib.h" #include "dbStaticPvt.h" #include "osiFileName.h" -#include "osiThread.h" epicsShareExtern char *makeDbdDepends; @@ -40,7 +39,6 @@ int main(int argc,char **argv) static char *pathSep = OSI_PATH_LIST_SEPARATOR; static char *subSep = ","; - threadInit(); /*Look for options*/ if(argc<2) { printf("usage: makeDbdDepends -Idir -Smacsub target.dbd input.dbd \n"); diff --git a/src/dbStatic/dbReadTest.c b/src/dbStatic/dbReadTest.c index 91541c4e3..de7bc1055 100644 --- a/src/dbStatic/dbReadTest.c +++ b/src/dbStatic/dbReadTest.c @@ -22,7 +22,6 @@ of this distribution. #include #include "dbDefs.h" -#include "osiThread.h" #include "epicsPrint.h" #include "errMdef.h" #include "dbStaticLib.h" @@ -48,7 +47,6 @@ int main(int argc,char **argv) static char *pathSep = OSI_PATH_LIST_SEPARATOR; static char *subSep = ","; - threadInit(); /*Look for options*/ if(argc<2) { printf("usage: dbReadTest -Idir -Smacsub file.dbd file.db \n"); diff --git a/src/dbStatic/dbToMenuH.c b/src/dbStatic/dbToMenuH.c index b6daa93e3..8acac08de 100644 --- a/src/dbStatic/dbToMenuH.c +++ b/src/dbStatic/dbToMenuH.c @@ -21,7 +21,6 @@ of this distribution. #include #include "dbDefs.h" -#include "osiThread.h" #include "epicsPrint.h" #include "errMdef.h" #include "dbStaticLib.h" @@ -52,7 +51,6 @@ int main(int argc,char **argv) static char *pathSep = OSI_PATH_LIST_SEPARATOR; static char *subSep = ","; - threadInit(); /*Look for options*/ if(argc<2) { fprintf(stderr,"usage: dbToMenu -Idir -Idir file.dbd [outfile]\n"); diff --git a/src/dbStatic/dbToRecordtypeH.c b/src/dbStatic/dbToRecordtypeH.c index d3e1f1d7a..126418f4a 100644 --- a/src/dbStatic/dbToRecordtypeH.c +++ b/src/dbStatic/dbToRecordtypeH.c @@ -22,7 +22,6 @@ of this distribution. #include #include "dbDefs.h" -#include "osiThread.h" #include "epicsPrint.h" #include "errMdef.h" #include "dbStaticLib.h" @@ -57,7 +56,6 @@ int main(int argc,char **argv) static char *pathSep = OSI_PATH_LIST_SEPARATOR; static char *subSep = ","; - threadInit(); /*Look for options*/ if(argc<2) { fprintf(stderr,"usage: dbToRecordtypeH -Idir -Idir file.dbd [outfile]\n"); diff --git a/src/iocsh/dbBkptRegister.c b/src/iocsh/dbBkptRegister.c index 200bde029..b7dfff2c5 100644 --- a/src/iocsh/dbBkptRegister.c +++ b/src/iocsh/dbBkptRegister.c @@ -13,8 +13,6 @@ of this distribution. #include #include "ellLib.h" -#include "osiThread.h" -#include "epicsEvent.h" #include "tsStamp.h" #include "errlog.h" #include "alarm.h" diff --git a/src/iocsh/iocUtil.c b/src/iocsh/iocUtil.c index d7b6d2b80..58427e547 100644 --- a/src/iocsh/iocUtil.c +++ b/src/iocsh/iocUtil.c @@ -8,7 +8,7 @@ #include #include "osiUnistd.h" -#include "osiThread.h" +#include "epicsThread.h" #define epicsExportSharedSymbols #include "ioccrf.h" @@ -69,7 +69,7 @@ static void showCallFunc(const ioccrfArgBuf *args) int first = 1; int level = 0; char *cp; - threadId tid; + epicsThreadId tid; unsigned long ltmp; char *endp; @@ -79,7 +79,7 @@ static void showCallFunc(const ioccrfArgBuf *args) i++; } if ((cp = args[i].sval) == NULL) { - threadShowAll (level); + epicsThreadShowAll (level); return; } for ( ; i < 10 ; i++) { @@ -87,29 +87,29 @@ static void showCallFunc(const ioccrfArgBuf *args) return; ltmp = strtoul (cp, &endp, 16); if (*endp) { - tid = threadGetId (cp); + tid = epicsThreadGetId (cp); if (!tid) { printf ("*** argument %d (%s) is not a valid task name ***\n", i+1, cp); continue; } } else { - tid = (threadId)ltmp; + tid = (epicsThreadId)ltmp; } if (first) { - threadShow (0, level); + epicsThreadShow (0, level); first = 0; } - threadShow (tid, level); + epicsThreadShow (tid, level); } } -/* threadInit */ -static const ioccrfFuncDef threadInitFuncDef = - {"threadInit",0}; -static void threadInitCallFunc(const ioccrfArgBuf *args) +/* epicsThreadInit */ +static const ioccrfFuncDef epicsThreadInitFuncDef = + {"epicsThreadInit",0}; +static void epicsThreadInitCallFunc(const ioccrfArgBuf *args) { - threadInit(); + epicsThreadInit(); } /* putenv */ @@ -149,7 +149,7 @@ void epicsShareAPI iocUtilRegister(void) ioccrfRegister(&chdirFuncDef,chdirCallFunc); ioccrfRegister(&pwdFuncDef,pwdCallFunc); ioccrfRegister(&showFuncDef,showCallFunc); - ioccrfRegister(&threadInitFuncDef,threadInitCallFunc); + ioccrfRegister(&epicsThreadInitFuncDef,epicsThreadInitCallFunc); ioccrfRegister(&putenvFuncDef,putenvCallFunc); ioccrfRegister(&iocLogInitFuncDef,iocLogInitCallFunc); } diff --git a/src/iocsh/ioccrf.cpp b/src/iocsh/ioccrf.cpp index 2e87747b6..a1731ab9d 100644 --- a/src/iocsh/ioccrf.cpp +++ b/src/iocsh/ioccrf.cpp @@ -18,7 +18,7 @@ of this distribution. #include "errlog.h" #include "dbAccess.h" -#include "osiThread.h" +#include "epicsThread.h" #include "epicsMutex.h" #include "registry.h" #define epicsExportSharedSymbols @@ -36,7 +36,7 @@ struct ioccrfCommand { static struct ioccrfCommand *ioccrfCommandHead; static char ioccrfID[] = "ioccrf"; static epicsMutexId commandTableMutex; -static threadOnceId commandTableOnceId = OSITHREAD_ONCE_INIT; +static epicsThreadOnceId commandTableOnceId = EPICS_THREAD_ONCE_INIT; /* * Set up command table mutex @@ -52,7 +52,7 @@ static void commandTableOnce (void *) static void commandTableLock (void) { - threadOnce (&commandTableOnceId, commandTableOnce, NULL); + epicsThreadOnce (&commandTableOnceId, commandTableOnce, NULL); epicsMutexMustLock (commandTableMutex); } @@ -62,7 +62,7 @@ commandTableLock (void) static void commandTableUnlock (void) { - threadOnce (&commandTableOnceId, commandTableOnce, NULL); + epicsThreadOnce (&commandTableOnceId, commandTableOnce, NULL); epicsMutexUnlock (commandTableMutex); } diff --git a/src/iocsh/osiRegister.c b/src/iocsh/osiRegister.c index 9dd781dd5..c1939b5e7 100644 --- a/src/iocsh/osiRegister.c +++ b/src/iocsh/osiRegister.c @@ -12,34 +12,34 @@ of this distribution. #include #include -#include "osiThread.h" +#include "epicsThread.h" #include "dbEvent.h" #define epicsExportSharedSymbols #include "ioccrf.h" #include "osiRegister.h" -/* threadShowAll */ -static const ioccrfArg threadShowAllArg0 = { "level",ioccrfArgInt}; -static const ioccrfArg * const threadShowAllArgs[1] = {&threadShowAllArg0}; -static const ioccrfFuncDef threadShowAllFuncDef = - {"threadShowAll",1,threadShowAllArgs}; -static void threadShowAllCallFunc(const ioccrfArgBuf *args) +/* epicsThreadShowAll */ +static const ioccrfArg epicsThreadShowAllArg0 = { "level",ioccrfArgInt}; +static const ioccrfArg * const epicsThreadShowAllArgs[1] = {&epicsThreadShowAllArg0}; +static const ioccrfFuncDef epicsThreadShowAllFuncDef = + {"epicsThreadShowAll",1,epicsThreadShowAllArgs}; +static void epicsThreadShowAllCallFunc(const ioccrfArgBuf *args) { - threadShowAll(args[0].ival); + epicsThreadShowAll(args[0].ival); } -/* threadSleep */ -static const ioccrfArg threadSleepArg0 = { "seconds",ioccrfArgDouble}; -static const ioccrfArg * const threadSleepArgs[1] = {&threadSleepArg0}; -static const ioccrfFuncDef threadSleepFuncDef = - {"threadSleep",1,threadSleepArgs}; -static void threadSleepCallFunc(const ioccrfArgBuf *args) +/* epicsThreadSleep */ +static const ioccrfArg epicsThreadSleepArg0 = { "seconds",ioccrfArgDouble}; +static const ioccrfArg * const epicsThreadSleepArgs[1] = {&epicsThreadSleepArg0}; +static const ioccrfFuncDef epicsThreadSleepFuncDef = + {"epicsThreadSleep",1,epicsThreadSleepArgs}; +static void epicsThreadSleepCallFunc(const ioccrfArgBuf *args) { - threadSleep(args[0].dval); + epicsThreadSleep(args[0].dval); } void epicsShareAPI osiRegister(void) { - ioccrfRegister(&threadShowAllFuncDef,threadShowAllCallFunc); - ioccrfRegister(&threadSleepFuncDef,threadSleepCallFunc); + ioccrfRegister(&epicsThreadShowAllFuncDef,epicsThreadShowAllCallFunc); + ioccrfRegister(&epicsThreadSleepFuncDef,epicsThreadSleepCallFunc); } diff --git a/src/libCom/Makefile b/src/libCom/Makefile index 5608b4100..69c82e261 100644 --- a/src/libCom/Makefile +++ b/src/libCom/Makefile @@ -132,8 +132,9 @@ INC += epicsAssert.h INC += epicsFindSymbol.h INC += osiPoolStatus.h INC += osdPoolStatus.h -INC += osiThread.h INC += osdThread.h + +INC += epicsThread.h INC += osiTime.h INC += osdTime.h INC += osiSigPipeIgnore.h @@ -143,6 +144,9 @@ INC += osiProcess.h INC += osiUnistd.h INC += osiWireFormat.h +SRCS += epicsThread.cpp +SRCS += osiTime.cpp + SRCS += osdSock.c SRCS += osiSock.c SRCS += osdAssert.c @@ -150,12 +154,10 @@ SRCS += osdFindSymbol.c SRCS += osdInterrupt.c SRCS += osdPoolStatus.c +SRCS += osdThread.c SRCS += osdMutex.c SRCS += osdEvent.c -SRCS += osdThread.c -SRCS += osiThread.cpp SRCS += osdTime.cpp -SRCS += osiTime.cpp SRCS += osdSigPipeIgnore.c SRCS += osdProcess.c SRCS += osdNetIntf.c diff --git a/src/libCom/error/errlog.c b/src/libCom/error/errlog.c index 7ea88f26f..c768e43d7 100644 --- a/src/libCom/error/errlog.c +++ b/src/libCom/error/errlog.c @@ -24,7 +24,7 @@ of this distribution. #define epicsExportSharedSymbols #define ERRLOG_INIT #include "dbDefs.h" -#include "osiThread.h" +#include "epicsThread.h" #include "epicsMutex.h" #include "epicsEvent.h" #include "osiInterrupt.h" @@ -301,7 +301,7 @@ static void errlogInitPvt(void *arg) { int bufsize = *(int *)arg; void *pbuffer; - threadId tid; + epicsThreadId tid; pvtData.errlogInitFailed = TRUE; if(bufsizenode); epicsMutexUnlock(pvtData.msgQueueLock); @@ -477,7 +477,7 @@ LOCAL void *pvtCalloc(size_t count,size_t size) pmem = calloc(count,size); if(!pmem) { printf("calloc failed in errlog\n"); - threadSuspendSelf(); + epicsThreadSuspendSelf(); } return(pmem); } diff --git a/src/libCom/fdmgr/fdManager.cpp b/src/libCom/fdmgr/fdManager.cpp index 031c938b8..30346b605 100644 --- a/src/libCom/fdmgr/fdManager.cpp +++ b/src/libCom/fdmgr/fdManager.cpp @@ -49,7 +49,7 @@ #define epicsExportSharedSymbols #include "epicsAssert.h" #include "osiTimer.h" -#include "osiThread.h" +#include "epicsThread.h" #include "tsMinMax.h" #include "fdManager.h" #include "locationException.h" @@ -183,7 +183,7 @@ epicsShareFunc void fdManager::process (double delay) * windows sockets and UNIX sockets implementation * of select() */ - if (minDelay>0.0) threadSleep(minDelay); + if (minDelay>0.0) epicsThreadSleep(minDelay); status = 0; } else { diff --git a/src/libCom/fdmgr/fdmgr.h b/src/libCom/fdmgr/fdmgr.h index b082d7cb0..6b5a375c0 100644 --- a/src/libCom/fdmgr/fdmgr.h +++ b/src/libCom/fdmgr/fdmgr.h @@ -45,7 +45,7 @@ #include "ellLib.h" #include "bucketLib.h" #include "osiSock.h" -#include "osiThread.h" +#include "epicsThread.h" #include "shareLib.h" #ifdef __cplusplus diff --git a/src/libCom/logClient/logClient.c b/src/libCom/logClient/logClient.c index cbb3c63d2..ac519b152 100644 --- a/src/libCom/logClient/logClient.c +++ b/src/libCom/logClient/logClient.c @@ -46,7 +46,7 @@ #include "dbDefs.h" #include "epicsEvent.h" #include "epicsMutex.h" -#include "osiThread.h" +#include "epicsThread.h" #include "osiSock.h" #include "epicsAssert.h" #include "errlog.h" @@ -81,7 +81,7 @@ typedef struct { LOCAL epicsMutexId logClientGlobalMutex; LOCAL epicsEventId logClientGlobalSignal; LOCAL ELLLIST logClientList; -LOCAL threadId logClientThreadId; +LOCAL epicsThreadId logClientThreadId; LOCAL logClient *pLogClientDefaultClient; LOCAL const double LOG_RESTART_DELAY = 5.0; /* sec */ @@ -416,7 +416,7 @@ LOCAL void logClientConnect (logClient *pClient) pClient->file = fdopen (pClient->sock, "a"); if (!pClient->file) { logClientReset (pClient); - threadSleep (10.0); + epicsThreadSleep (10.0); } pClient->connectReset = 0u; @@ -513,7 +513,7 @@ LOCAL void logClientGlobalInit () return; } - logClientThreadId = threadCreate ("logRestart", threadPriorityLow, + logClientThreadId = epicsThreadCreate ("logRestart", epicsThreadPriorityLow, logRestartStackSize, logRestart, 0); if (logClientThreadId==NULL) { epicsMutexDestroy (logClientGlobalMutex); @@ -590,7 +590,7 @@ epicsShareFunc logClientId epicsShareAPI logClientInit () epicsEventSignal (logClientGlobalSignal); - threadSleep (50e-3); + epicsThreadSleep (50e-3); connectTries++; if (connectTries>=maxConnectTries) { diff --git a/src/libCom/misc/cantProceed.c b/src/libCom/misc/cantProceed.c index 5dce96d27..751cb681e 100644 --- a/src/libCom/misc/cantProceed.c +++ b/src/libCom/misc/cantProceed.c @@ -17,7 +17,7 @@ of this distribution. #define epicsExportSharedSymbols #include "errlog.h" #include "cantProceed.h" -#include "osiThread.h" +#include "epicsThread.h" epicsShareFunc void * epicsShareAPI callocMustSucceed(size_t count, size_t size, const char *errorMessage) { @@ -45,6 +45,6 @@ epicsShareFunc void epicsShareAPI cantProceed(const char *errorMessage) { if(errorMessage) errlogPrintf("fatal error: %s\n",errorMessage); else errlogPrintf("fatal error\n"); - threadSleep(1.0); - threadSuspendSelf(); + epicsThreadSleep(1.0); + epicsThreadSuspendSelf(); } diff --git a/src/libCom/misc/ipAddrToAsciiAsynchronous.cpp b/src/libCom/misc/ipAddrToAsciiAsynchronous.cpp index ce043bb47..06a11e19d 100644 --- a/src/libCom/misc/ipAddrToAsciiAsynchronous.cpp +++ b/src/libCom/misc/ipAddrToAsciiAsynchronous.cpp @@ -15,16 +15,16 @@ */ #define epicsExportSharedSymbols -#include "osiThread.h" +#include "epicsThread.h" #include "ipAddrToAsciiAsynchronous.h" epicsMutex ipAddrToAsciiEngine::mutex; ipAddrToAsciiEngine::ipAddrToAsciiEngine ( const char *pName ) : - osiThread ( pName, 0x1000, threadPriorityLow ), nextId ( 0u ), - exitFlag ( false ) + thread(*(new epicsThread(*this,pName,0x1000,epicsThreadPriorityLow))), + nextId ( 0u ), exitFlag ( false ) { - this->start (); // start the thread + this->thread.start (); // start the thread } ipAddrToAsciiEngine::~ipAddrToAsciiEngine () @@ -44,9 +44,10 @@ ipAddrToAsciiEngine::~ipAddrToAsciiEngine () pItem->ioCompletionNotify ( this->nameTmp ); } ipAddrToAsciiEngine::mutex.unlock (); + delete &thread; } -void ipAddrToAsciiEngine::entryPoint () +void ipAddrToAsciiEngine::run () { osiSockAddr addr; unsigned tmpId; diff --git a/src/libCom/misc/ipAddrToAsciiAsynchronous.h b/src/libCom/misc/ipAddrToAsciiAsynchronous.h index 88c012011..768ed65db 100644 --- a/src/libCom/misc/ipAddrToAsciiAsynchronous.h +++ b/src/libCom/misc/ipAddrToAsciiAsynchronous.h @@ -17,6 +17,7 @@ #ifndef ipAddrToAsciiAsynchronous_h #define ipAddrToAsciiAsynchronous_h +#include "epicsThread.h" #include "epicsMutex.h" #include "epicsEvent.h" #include "tsDLList.h" @@ -27,12 +28,14 @@ class ipAddrToAsciiAsynchronous; // - this class executes the synchronous DNS query // - it creates one thread -class ipAddrToAsciiEngine : public osiThread { +class ipAddrToAsciiEngine : public epicsThreadRunable { public: epicsShareFunc ipAddrToAsciiEngine ( const char *pName ); epicsShareFunc ~ipAddrToAsciiEngine (); + virtual void run(); epicsShareFunc void show ( unsigned level ) const; private: + epicsThread &thread; tsDLList < ipAddrToAsciiAsynchronous > labor; epicsEvent event; epicsEvent threadExit; @@ -40,7 +43,6 @@ private: unsigned nextId; bool exitFlag; static epicsMutex mutex; - void entryPoint (); friend class ipAddrToAsciiAsynchronous; }; diff --git a/src/libCom/osi/epicsThread.cpp b/src/libCom/osi/epicsThread.cpp new file mode 100644 index 000000000..1a67c67ce --- /dev/null +++ b/src/libCom/osi/epicsThread.cpp @@ -0,0 +1,58 @@ +// +// $Id$ +// +// Author: Jeff Hill +// + +#include +#include + +extern "C" { +static void epicsThreadCallEntryPoint ( void *pPvt ); // for gnu warning +} + + +#define epicsExportSharedSymbols +#include "epicsThread.h" + +void epicsThreadRunable::stop() {}; + +static void epicsThreadCallEntryPoint ( void *pPvt ) +{ + epicsThread *pThread = static_cast ( pPvt ); + pThread->begin.wait (); + if ( ! pThread->cancel ) { + pThread->runable.run (); + } + pThread->id = 0; + pThread->exit.signal (); +} + +epicsThread::epicsThread (epicsThreadRunable &r, const char *name, unsigned stackSize, unsigned priority ) : + runable(r), cancel (false) +{ + this->id = epicsThreadCreate ( name, priority, stackSize, + epicsThreadCallEntryPoint, static_cast (this) ); +} + +epicsThread::~epicsThread () +{ + if ( this->id ) { + this->cancel = true; + this->begin.signal (); + while ( ! this->exit.wait ( 5.0 ) ) { + printf ("epicsThread::~epicsThread ():" + " Warning, thread object destroyed before thread exit \n"); + } + } +} + +void epicsThread::start () +{ + this->begin.signal (); +} + +bool epicsThread::isCurrentThread () const +{ + return ( epicsThreadGetIdSelf () == this->id ); +} diff --git a/src/libCom/osi/epicsThread.h b/src/libCom/osi/epicsThread.h new file mode 100644 index 000000000..1584ea794 --- /dev/null +++ b/src/libCom/osi/epicsThread.h @@ -0,0 +1,260 @@ +#ifndef epicsThreadh +#define epicsThreadh + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include "shareLib.h" + +typedef void (*EPICSTHREADFUNC)(void *parm); + +static const unsigned epicsThreadPriorityMax = 99; +static const unsigned epicsThreadPriorityMin = 0; + +/* some generic values */ +static const unsigned epicsThreadPriorityLow = 10; +static const unsigned epicsThreadPriorityMedium = 50; +static const unsigned epicsThreadPriorityHigh = 90; + +/* some iocCore specific values */ +static const unsigned epicsThreadPriorityChannelAccessServer = 30; +static const unsigned epicsThreadPriorityScanLow = 60; +static const unsigned epicsThreadPriorityScanHigh = 70; + +/* stack sizes for each stackSizeClass are implementation and CPU dependent */ +typedef enum { + epicsThreadStackSmall, epicsThreadStackMedium, epicsThreadStackBig +} epicsThreadStackSizeClass; + +typedef enum { + epicsThreadBooleanStatusFail, epicsThreadBooleanStatusSuccess +} epicsThreadBooleanStatus; + +epicsShareFunc unsigned int epicsShareAPI epicsThreadGetStackSize( + epicsThreadStackSizeClass size); + +typedef int epicsThreadOnceId; +#define EPICS_THREAD_ONCE_INIT 0 + +/* void epicsThreadOnce(epicsThreadOnceId *id, EPICSTHREADFUNC, void *arg); */ +/* epicsThreadOnce is implemented as a macro */ +/* epicsThreadOnceOsd should not be called by user code */ +epicsShareFunc void epicsShareAPI epicsThreadOnceOsd( + epicsThreadOnceId *id, EPICSTHREADFUNC, void *arg); + +#define epicsThreadOnce(id,func,arg) \ +if(*(id)<=0) epicsThreadOnceOsd((id),(func),(arg)) + +epicsShareFunc void epicsShareAPI epicsThreadInit(void); +epicsShareFunc void epicsShareAPI epicsThreadExitMain(void); + +/* (epicsThreadId)0 is guaranteed to be an invalid thread id */ +typedef void *epicsThreadId; + +epicsShareFunc epicsThreadId epicsShareAPI epicsThreadCreate(const char *name, + unsigned int priority, unsigned int stackSize, + EPICSTHREADFUNC funptr,void *parm); +epicsShareFunc void epicsShareAPI epicsThreadSuspendSelf(void); +epicsShareFunc void epicsShareAPI epicsThreadResume(epicsThreadId id); +epicsShareFunc unsigned int epicsShareAPI epicsThreadGetPriority( + epicsThreadId id); +epicsShareFunc unsigned int epicsShareAPI epicsThreadGetPrioritySelf(); +epicsShareFunc void epicsShareAPI epicsThreadSetPriority( + epicsThreadId id,unsigned int priority); +epicsShareFunc epicsThreadBooleanStatus epicsShareAPI + epicsThreadHighestPriorityLevelBelow ( + unsigned int priority, unsigned *pPriorityJustBelow); +epicsShareFunc epicsThreadBooleanStatus epicsShareAPI + epicsThreadLowestPriorityLevelAbove ( + unsigned int priority, unsigned *pPriorityJustAbove); +epicsShareFunc int epicsShareAPI epicsThreadIsEqual( + epicsThreadId id1, epicsThreadId id2); +epicsShareFunc int epicsShareAPI epicsThreadIsSuspended(epicsThreadId id); +epicsShareFunc void epicsShareAPI epicsThreadSleep(double seconds); +epicsShareFunc epicsThreadId epicsShareAPI epicsThreadGetIdSelf(void); +epicsShareFunc epicsThreadId epicsShareAPI epicsThreadGetId(const char *name); + +epicsShareFunc const char * epicsShareAPI epicsThreadGetNameSelf(void); + +/* For epicsThreadGetName name is guaranteed to be null terminated */ +/* size is size of buffer to hold name (including terminator) */ +/* Failure results in an empty string stored in name */ +epicsShareFunc void epicsShareAPI epicsThreadGetName( + epicsThreadId id, char *name, size_t size); + +epicsShareFunc void epicsShareAPI epicsThreadShowAll(unsigned int level); +epicsShareFunc void epicsShareAPI epicsThreadShow( + epicsThreadId id,unsigned int level); + +typedef void * epicsThreadPrivateId; +epicsShareFunc epicsThreadPrivateId epicsShareAPI epicsThreadPrivateCreate(void); +epicsShareFunc void epicsShareAPI epicsThreadPrivateDelete(epicsThreadPrivateId id); +epicsShareFunc void epicsShareAPI epicsThreadPrivateSet(epicsThreadPrivateId,void *); +epicsShareFunc void * epicsShareAPI epicsThreadPrivateGet(epicsThreadPrivateId); + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus + +#include "locationException.h" +#include "epicsEvent.h" + + +class epicsThreadRunable { +public: + virtual void run() = 0; + virtual void stop(); +}; + +class epicsShareClass epicsThread { +public: + epicsThread (epicsThreadRunable &,const char *name, unsigned int stackSize, + unsigned int priority=epicsThreadPriorityLow); + virtual ~epicsThread (); + void start(); + void resume (); + void getName (char *name, size_t size) const; + unsigned int getPriority () const; + void setPriority (unsigned int); + bool priorityIsEqual (const epicsThread &otherThread) const; + bool isSuspended () const; + bool isCurrentThread () const; + bool operator == (const epicsThread &rhs) const; + /* these operate on the current thread */ + static void suspendSelf (); + static void sleep (double seconds); + static epicsThread & getSelf (); + static const char * getNameSelf (); +private: + epicsThreadRunable &runable; + epicsThreadId id; + epicsEvent exit; + epicsEvent begin; + bool cancel; + + epicsThread ( const epicsThread & ); + epicsThread & operator = ( const epicsThread & ); + + friend void epicsThreadCallEntryPoint (void *pPvt); +}; + +template +class epicsThreadPrivate { +public: + epicsThreadPrivate (); + ~epicsThreadPrivate (); + T *get () const; + void set (T *); + class unableToCreateThreadPrivate {}; // exception +private: + epicsThreadPrivateId id; +}; + +#endif /* __cplusplus */ + +#include "osdThread.h" + +#ifdef __cplusplus + +#include "epicsAssert.h" + +inline void epicsThread::resume () +{ + epicsThreadResume (this->id); +} + +inline void epicsThread::getName (char *name, size_t size) const +{ + epicsThreadGetName (this->id, name, size); +} + +inline unsigned int epicsThread::getPriority () const +{ + return epicsThreadGetPriority (this->id); +} + +inline void epicsThread::setPriority (unsigned int priority) +{ + epicsThreadSetPriority (this->id, priority); +} + +inline bool epicsThread::priorityIsEqual (const epicsThread &otherThread) const +{ + if ( epicsThreadIsEqual (this->id, otherThread.id) ) { + return true; + } + else { + return false; + } +} + +inline bool epicsThread::isSuspended () const +{ + if ( epicsThreadIsSuspended (this->id) ) { + return true; + } + else { + return false; + } +} + +inline bool epicsThread::operator == (const epicsThread &rhs) const +{ + return (this->id == rhs.id); +} + +inline void epicsThread::suspendSelf () +{ + epicsThreadSuspendSelf (); +} + +inline void epicsThread::sleep (double seconds) +{ + epicsThreadSleep (seconds); +} + +inline epicsThread & epicsThread::getSelf () +{ + return * static_cast ( epicsThreadGetIdSelf () ); +} + +inline const char *epicsThread::getNameSelf () +{ + return epicsThreadGetNameSelf (); +} + +template +inline epicsThreadPrivate::epicsThreadPrivate () +{ + this->id = epicsThreadPrivateCreate (); + if (this->id == 0) { + throwWithLocation ( unableToCreateThreadPrivate () ); + } +} + +template +inline epicsThreadPrivate::~epicsThreadPrivate () +{ + epicsThreadPrivateDelete ( this->id ); +} + +template +inline T *epicsThreadPrivate::get () const +{ + return static_cast ( epicsThreadPrivateGet (this->id) ); +} + +template +inline void epicsThreadPrivate::set (T *pIn) +{ + epicsThreadPrivateSet ( this->id, static_cast (pIn) ); +} + +#endif /* ifdef __cplusplus */ + +#endif /* epicsThreadh */ diff --git a/src/libCom/osi/os/RTEMS/osdEvent.c b/src/libCom/osi/os/RTEMS/osdEvent.c index 93a94f2ee..41163ef08 100644 --- a/src/libCom/osi/os/RTEMS/osdEvent.c +++ b/src/libCom/osi/os/RTEMS/osdEvent.c @@ -18,7 +18,7 @@ #include #include "epicsEvent.h" -#include "osiThread.h" +#include "epicsThread.h" #include "errlog.h" /* @@ -182,7 +182,7 @@ epicsEventShow(epicsEventId id, unsigned int level) else { if (_CORE_mutex_Is_locked(&semaphore.Core_control.mutex)) { char name[20]; - threadGetName ((threadId)semaphore.Core_control.mutex.holder_id, name, sizeof name); + epicsThreadGetName ((epicsThreadId)semaphore.Core_control.mutex.holder_id, name, sizeof name); printf ("Held by:%8.8x (%s) Nest count:%d", semaphore.Core_control.mutex.holder_id, name, diff --git a/src/libCom/osi/os/RTEMS/osdInterrupt.c b/src/libCom/osi/os/RTEMS/osdInterrupt.c index 1de9c6722..c21d2dbfe 100644 --- a/src/libCom/osi/os/RTEMS/osdInterrupt.c +++ b/src/libCom/osi/os/RTEMS/osdInterrupt.c @@ -11,7 +11,7 @@ #include #include "errlog.h" #include "osiInterrupt.h" -#include "osiThread.h" +#include "epicsThread.h" #define INTERRUPT_CONTEXT_MESSAGE_QUEUE_COUNT 100 @@ -69,7 +69,7 @@ InterruptContextMessageDaemon (void *unused) &interruptContextMessageQueue); if (sc != RTEMS_SUCCESSFUL) { errlogPrintf ("Can't create interrupt context message queue: %s\n", rtems_status_text (sc)); - threadSuspendSelf (); + epicsThreadSuspendSelf (); } for (;;) { sc = rtems_message_queue_receive (interruptContextMessageQueue, @@ -79,7 +79,7 @@ InterruptContextMessageDaemon (void *unused) RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) { errlogPrintf ("Can't receive message from interrupt context: %s\n", rtems_status_text (sc)); - threadSuspendSelf (); + epicsThreadSuspendSelf (); } if (size == sizeof message) syslog (LOG_ERR, "%s", message); diff --git a/src/libCom/osi/os/RTEMS/osdMutex.c b/src/libCom/osi/os/RTEMS/osdMutex.c index 78255e111..364d55e9c 100644 --- a/src/libCom/osi/os/RTEMS/osdMutex.c +++ b/src/libCom/osi/os/RTEMS/osdMutex.c @@ -19,7 +19,6 @@ #include "epicsMutex.h" #include "epicsEvent.h" -#include "osiThread.h" #include "errlog.h" #define RTEMS_FAST_MUTEX diff --git a/src/libCom/osi/os/RTEMS/osdThread.c b/src/libCom/osi/os/RTEMS/osdThread.c index 21a7e7f7e..4e723aebb 100644 --- a/src/libCom/osi/os/RTEMS/osdThread.c +++ b/src/libCom/osi/os/RTEMS/osdThread.c @@ -25,7 +25,7 @@ #include "errlog.h" #include "epicsMutex.h" -#include "osiThread.h" +#include "epicsThread.h" #include "osiInterrupt.h" #include "cantProceed.h" @@ -37,7 +37,7 @@ struct taskVar { struct taskVar *back; char *name; rtems_id id; - THREADFUNC funptr; + EPICSTHREADFUNC funptr; void *parm; unsigned int threadVariableCapacity; void **threadVariables; @@ -59,20 +59,20 @@ static epicsMutexId onceMutex; * = 199 - osi * osi = 199 - RTEMS */ -int threadGetOsiPriorityValue(int ossPriority) +int epicsThreadGetOsiPriorityValue(int ossPriority) { if (ossPriority < 100) { - return threadPriorityMax; + return epicsThreadPriorityMax; } else if (ossPriority > 199) { - return threadPriorityMin; + return epicsThreadPriorityMin; } else { return (199u - (unsigned int)ossPriority); } } -int threadGetOssPriorityValue(unsigned int osiPriority) +int epicsThreadGetOssPriorityValue(unsigned int osiPriority) { if (osiPriority > 99) { return 100; @@ -83,9 +83,9 @@ int threadGetOssPriorityValue(unsigned int osiPriority) } /* - * threadLowestPriorityLevelAbove () + * epicsThreadLowestPriorityLevelAbove () */ -epicsShareFunc threadBoolStatus epicsShareAPI threadLowestPriorityLevelAbove +epicsShareFunc epicsThreadBooleanStatus epicsShareAPI epicsThreadLowestPriorityLevelAbove (unsigned int priority, unsigned *pPriorityJustAbove) { unsigned newPriority = priority + 1; @@ -93,37 +93,37 @@ epicsShareFunc threadBoolStatus epicsShareAPI threadLowestPriorityLevelAbove newPriority = priority + 1; if (newPriority <= 99) { *pPriorityJustAbove = newPriority; - return tbsSuccess; + return threadBoolStatusSuccess; } - return tbsFail; + return threadBoolStatusFail; } /* - * threadHighestPriorityLevelBelow () + * epicsThreadHighestPriorityLevelBelow () */ -epicsShareFunc threadBoolStatus epicsShareAPI threadHighestPriorityLevelBelow +epicsShareFunc epicsThreadBooleanStatus epicsShareAPI epicsThreadHighestPriorityLevelBelow (unsigned int priority, unsigned *pPriorityJustBelow) { unsigned newPriority = priority - 1; if (newPriority <= 99) { *pPriorityJustBelow = newPriority; - return tbsSuccess; + return threadBoolStatusSuccess; } - return tbsFail; + return threadBoolStatusFail; } #define ARCH_STACK_FACTOR 2 unsigned int -threadGetStackSize (threadStackSizeClass size) +epicsThreadGetStackSize (epicsThreadStackSizeClass size) { switch(size) { - case threadStackSmall: return( 4000*ARCH_STACK_FACTOR); - case threadStackMedium: return( 6000*ARCH_STACK_FACTOR); - case threadStackBig: return(11000*ARCH_STACK_FACTOR); + case epicsThreadStackSmall: return( 4000*ARCH_STACK_FACTOR); + case epicsThreadStackMedium: return( 6000*ARCH_STACK_FACTOR); + case epicsThreadStackBig: return(11000*ARCH_STACK_FACTOR); default: - errlogPrintf("threadGetStackSize illegal argument"); + errlogPrintf("epicsThreadGetStackSize illegal argument"); } return(11000*ARCH_STACK_FACTOR); } @@ -170,7 +170,7 @@ threadWrapper (rtems_task_argument arg) /* * The task wrapper takes care of cleanup */ -void threadExitMain (void) +void epicsThreadExitMain (void) { } @@ -180,7 +180,7 @@ void threadExitMain (void) static void badInit (const char *msg) { - const char fmt[] = "%s called before threadInit finished!"; + const char fmt[] = "%s called before epicsThreadInit finished!"; syslog (LOG_CRIT, fmt, msg); fprintf (stderr, fmt, msg); @@ -189,13 +189,13 @@ badInit (const char *msg) } static void -setThreadInfo (rtems_id tid, const char *name, THREADFUNC funptr,void *parm) +setThreadInfo (rtems_id tid, const char *name, EPICSTHREADFUNC funptr,void *parm) { struct taskVar *v; rtems_unsigned32 note; - v = mallocMustSucceed (sizeof *v, "threadCreate_vars"); - v->name = mallocMustSucceed (strlen (name) + 1, "threadCreate_name"); + v = mallocMustSucceed (sizeof *v, "epicsThreadCreate_vars"); + v->name = mallocMustSucceed (strlen (name) + 1, "epicsThreadCreate_name"); strcpy (v->name, name); v->id = tid; v->funptr = funptr; @@ -218,11 +218,11 @@ setThreadInfo (rtems_id tid, const char *name, THREADFUNC funptr,void *parm) /* * OS-dependent initialization * No need to worry about making this thread-safe since - * it must be called before threadCreate creates + * it must be called before epicsThreadCreate creates * any new threads. */ void -threadInit (void) +epicsThreadInit (void) { if (!initialized) { rtems_id tid; @@ -230,14 +230,14 @@ threadInit (void) extern void clockInit (void); clockInit (); - rtems_task_set_priority (RTEMS_SELF, threadGetOssPriorityValue(99), &old); + rtems_task_set_priority (RTEMS_SELF, epicsThreadGetOssPriorityValue(99), &old); onceMutex = epicsMutexMustCreate(); taskVarMutex = epicsMutexMustCreate (); rtems_task_ident (RTEMS_SELF, 0, &tid); setThreadInfo (tid, "_main_", NULL, NULL); initialized = 1; - threadCreate ("ImsgDaemon", 99, - threadGetStackSize (threadStackSmall), + epicsThreadCreate ("ImsgDaemon", 99, + epicsThreadGetStackSize (epicsThreadStackSmall), InterruptContextMessageDaemon, NULL); } } @@ -245,68 +245,68 @@ threadInit (void) /* * Create and start a new thread */ -threadId -threadCreate (const char *name, +epicsThreadId +epicsThreadCreate (const char *name, unsigned int priority, unsigned int stackSize, - THREADFUNC funptr,void *parm) + EPICSTHREADFUNC funptr,void *parm) { rtems_id tid; rtems_status_code sc; char c[4]; - if (!initialized) threadInit(); + if (!initialized) epicsThreadInit(); if (stackSize < RTEMS_MINIMUM_STACK_SIZE) { - errlogPrintf ("threadCreate %s illegal stackSize %d\n",name,stackSize); + errlogPrintf ("epicsThreadCreate %s illegal stackSize %d\n",name,stackSize); return 0; } strncpy (c, name, sizeof c); sc = rtems_task_create (rtems_build_name (c[0], c[1], c[2], c[3]), - threadGetOssPriorityValue (priority), + epicsThreadGetOssPriorityValue (priority), stackSize, RTEMS_PREEMPT|RTEMS_NO_TIMESLICE|RTEMS_NO_ASR|RTEMS_INTERRUPT_LEVEL(0), RTEMS_FLOATING_POINT|RTEMS_LOCAL, &tid); if (sc != RTEMS_SUCCESSFUL) { - errlogPrintf ("threadCreate create failure for %s: %s\n",name, rtems_status_text (sc)); + errlogPrintf ("epicsThreadCreate create failure for %s: %s\n",name, rtems_status_text (sc)); return 0; } setThreadInfo (tid, name, funptr,parm); - return (threadId)tid; + return (epicsThreadId)tid; } -threadId +epicsThreadId threadMustCreate (const char *name, unsigned int priority, unsigned int stackSize, - THREADFUNC funptr,void *parm) + EPICSTHREADFUNC funptr,void *parm) { - threadId tid; + epicsThreadId tid; - if ((tid = threadCreate (name, priority, stackSize, funptr, parm)) == NULL) + if ((tid = epicsThreadCreate (name, priority, stackSize, funptr, parm)) == NULL) cantProceed (0); return tid; } void -threadSuspendSelf (void) +epicsThreadSuspendSelf (void) { rtems_status_code sc; sc = rtems_task_suspend (RTEMS_SELF); if(sc != RTEMS_SUCCESSFUL) - errlogPrintf("threadSuspendSelf failed: %s\n", rtems_status_text (sc)); + errlogPrintf("epicsThreadSuspendSelf failed: %s\n", rtems_status_text (sc)); } -void threadResume(threadId id) +void epicsThreadResume(epicsThreadId id) { rtems_id tid = (rtems_id)id; rtems_status_code sc; sc = rtems_task_resume (tid); if(sc != RTEMS_SUCCESSFUL) - errlogPrintf("threadResume failed: %s\n", rtems_status_text (sc)); + errlogPrintf("epicsThreadResume failed: %s\n", rtems_status_text (sc)); } -unsigned int threadGetPriority(threadId id) +unsigned int epicsThreadGetPriority(epicsThreadId id) { rtems_id tid = (rtems_id)id; rtems_status_code sc; @@ -314,35 +314,35 @@ unsigned int threadGetPriority(threadId id) sc = rtems_task_set_priority (tid, RTEMS_CURRENT_PRIORITY, &pri); if (sc != RTEMS_SUCCESSFUL) - errlogPrintf("threadGetPriority failed: %s\n", rtems_status_text (sc)); - return threadGetOsiPriorityValue (pri); + errlogPrintf("epicsThreadGetPriority failed: %s\n", rtems_status_text (sc)); + return epicsThreadGetOsiPriorityValue (pri); } -unsigned int threadGetPrioritySelf(void) +unsigned int epicsThreadGetPrioritySelf(void) { - return threadGetPriority((threadId)RTEMS_SELF); + return epicsThreadGetPriority((epicsThreadId)RTEMS_SELF); } void -threadSetPriority (threadId id,unsigned int osip) +epicsThreadSetPriority (epicsThreadId id,unsigned int osip) { rtems_id tid = (rtems_id)id; rtems_status_code sc; - rtems_task_priority pri = threadGetOssPriorityValue(osip); + rtems_task_priority pri = epicsThreadGetOssPriorityValue(osip); sc = rtems_task_set_priority (tid, pri, &pri); if (sc != RTEMS_SUCCESSFUL) - errlogPrintf("threadSetPriority failed\n", rtems_status_text (sc)); + errlogPrintf("epicsThreadSetPriority failed\n", rtems_status_text (sc)); } int -threadIsEqual (threadId id1, threadId id2) +epicsThreadIsEqual (epicsThreadId id1, epicsThreadId id2) { return (id1 == id2); } int -threadIsSuspended (threadId id) +epicsThreadIsSuspended (epicsThreadId id) { rtems_id tid = (rtems_id)id; rtems_status_code sc; @@ -355,13 +355,13 @@ threadIsSuspended (threadId id) return 1; default: - errlogPrintf("threadIsSuspended: %s\n", rtems_status_text (sc)); + errlogPrintf("epicsThreadIsSuspended: %s\n", rtems_status_text (sc)); return 0; } } void -threadSleep (double seconds) +epicsThreadSleep (double seconds) { rtems_status_code sc; rtems_interval delay; @@ -370,19 +370,19 @@ threadSleep (double seconds) delay = seconds * rtemsTicksPerSecond_double; sc = rtems_task_wake_after (delay); if(sc != RTEMS_SUCCESSFUL) - errlogPrintf("threadSleep: %s\n", rtems_status_text (sc)); + errlogPrintf("epicsThreadSleep: %s\n", rtems_status_text (sc)); } -threadId -threadGetIdSelf (void) +epicsThreadId +epicsThreadGetIdSelf (void) { rtems_id tid; rtems_task_ident (RTEMS_SELF, 0, &tid); - return (threadId)tid; + return (epicsThreadId)tid; } -const char *threadGetNameSelf(void) +const char *epicsThreadGetNameSelf(void) { rtems_unsigned32 note; struct taskVar *v; @@ -392,7 +392,7 @@ const char *threadGetNameSelf(void) return v->name; } -void threadGetName (threadId id, char *name, size_t size) +void epicsThreadGetName (epicsThreadId id, char *name, size_t size) { rtems_id tid = (rtems_id)id; rtems_status_code sc; @@ -412,7 +412,7 @@ void threadGetName (threadId id, char *name, size_t size) taskVarUnlock (); } -threadId threadGetId (const char *name) +epicsThreadId epicsThreadGetId (const char *name) { struct taskVar *v; rtems_id tid = 0; @@ -429,15 +429,15 @@ threadId threadGetId (const char *name) } } taskVarUnlock (); - return (threadId)tid; + return (epicsThreadId)tid; } /* * Ensure func() is run only once. */ -void threadOnceOsd(threadOnceId *id, void(*func)(void *), void *arg) +void epicsThreadOnceOsd(epicsThreadOnceId *id, void(*func)(void *), void *arg) { - if (!initialized) threadInit(); + if (!initialized) epicsThreadInit(); epicsMutexMustLock(onceMutex); if (*id == 0) { *id = -1; @@ -451,24 +451,24 @@ void threadOnceOsd(threadOnceId *id, void(*func)(void *), void *arg) * Thread private storage implementation based on the vxWorks * implementation by Andrew Johnson APS/ASD. */ -threadPrivateId threadPrivateCreate () +epicsThreadPrivateId epicsThreadPrivateCreate () { unsigned int taskVarIndex; static volatile unsigned int threadVariableCount = 0; - if (!initialized) threadInit (); + if (!initialized) epicsThreadInit (); taskVarLock (); taskVarIndex = ++threadVariableCount; taskVarUnlock (); - return (threadPrivateId)taskVarIndex; + return (epicsThreadPrivateId)taskVarIndex; } -void threadPrivateDelete (threadPrivateId id) +void epicsThreadPrivateDelete (epicsThreadPrivateId id) { /* empty */ } -void threadPrivateSet (threadPrivateId id, void *pvt) +void epicsThreadPrivateSet (epicsThreadPrivateId id, void *pvt) { unsigned int varIndex = (unsigned int)id; rtems_unsigned32 note; @@ -480,7 +480,7 @@ void threadPrivateSet (threadPrivateId id, void *pvt) if (varIndex >= v->threadVariableCapacity) { v->threadVariables = realloc (v->threadVariables, (varIndex + 1) * sizeof (void *)); if (v->threadVariables == NULL) - cantProceed("threadPrivateSet realloc failed\n"); + cantProceed("epicsThreadPrivateSet realloc failed\n"); for (i = v->threadVariableCapacity ; i < varIndex ; i++) v->threadVariables[i] = NULL; v->threadVariableCapacity = varIndex + 1; @@ -488,7 +488,7 @@ void threadPrivateSet (threadPrivateId id, void *pvt) v->threadVariables[varIndex] = pvt; } -void * threadPrivateGet (threadPrivateId id) +void * epicsThreadPrivateGet (epicsThreadPrivateId id) { unsigned int varIndex = (unsigned int)id; rtems_unsigned32 note; @@ -556,7 +556,7 @@ showInternalTaskInfo (rtems_id tid) _Thread_Enable_dispatch(); /* * Show both real and current priorities if they differ. - * Note that the threadGetOsiPriorityValue routine is not used here. + * Note that the epicsThreadGetOsiPriorityValue routine is not used here. * If a thread has a priority outside the normal EPICS range then * that priority should be displayed, not the value truncated to * the EPICS range. @@ -575,32 +575,32 @@ showInternalTaskInfo (rtems_id tid) } static void -threadShowHeader (void) +epicsThreadShowHeader (void) { printf (" NAME ID PRIORITY STATE WAIT \n"); printf ("+-------------+--------+--------+--------+--------+\n"); } static void -threadShowInfo (struct taskVar *v, unsigned int level) +epicsThreadShowInfo (struct taskVar *v, unsigned int level) { printf ("%14.14s %8.8x", v->name, v->id); showInternalTaskInfo (v->id); printf ("\n"); } -void threadShow (threadId id, unsigned int level) +void epicsThreadShow (epicsThreadId id, unsigned int level) { struct taskVar *v; if (!id) { - threadShowHeader (); + epicsThreadShowHeader (); return; } taskVarLock (); for (v = taskVarHead ; v != NULL ; v = v->forw) { if ((rtems_id)id == v->id) { - threadShowInfo (v, level); + epicsThreadShowInfo (v, level); return; } } @@ -608,11 +608,11 @@ void threadShow (threadId id, unsigned int level) printf ("*** Thread %x does not exist.\n", (unsigned int)id); } -void threadShowAll (unsigned int level) +void epicsThreadShowAll (unsigned int level) { struct taskVar *v; - threadShowHeader (); + epicsThreadShowHeader (); taskVarLock (); /* * Show tasks in the order of creation (backwards through list) @@ -620,7 +620,7 @@ void threadShowAll (unsigned int level) for (v = taskVarHead ; v != NULL && v->forw != NULL ; v = v->forw) continue; while (v) { - threadShowInfo (v, level); + epicsThreadShowInfo (v, level); v = v->back; } taskVarUnlock (); diff --git a/src/libCom/osi/os/RTEMS/rtems_init.c b/src/libCom/osi/os/RTEMS/rtems_init.c index 3d7b8cdab..803a2c371 100644 --- a/src/libCom/osi/os/RTEMS/rtems_init.c +++ b/src/libCom/osi/os/RTEMS/rtems_init.c @@ -23,7 +23,7 @@ #include #include -#include +#include #include #include #include @@ -311,7 +311,7 @@ Init (rtems_task_argument ignored) /* * Do EPICS initialization */ - threadInit (); + epicsThreadInit (); /* * Run the EPICS startup script @@ -323,7 +323,7 @@ Init (rtems_task_argument ignored) /* * Everything's running! */ - threadSleep (2.0); + epicsThreadSleep (2.0); ioccrf (NULL); LogFatal ("Console command interpreter terminated"); } diff --git a/src/libCom/osi/os/WIN32/osdThread.c b/src/libCom/osi/os/WIN32/osdThread.c index 8ebce21cc..ed2019c1f 100644 --- a/src/libCom/osi/os/WIN32/osdThread.c +++ b/src/libCom/osi/os/WIN32/osdThread.c @@ -23,14 +23,14 @@ #define epicsExportSharedSymbols #include "shareLib.h" -#include "osiThread.h" +#include "epicsThread.h" #include "cantProceed.h" #include "errlog.h" #include "epicsAssert.h" typedef struct win32ThreadParam { HANDLE handle; - THREADFUNC funptr; + EPICSTHREADFUNC funptr; void *parm; char *pName; DWORD id; @@ -79,16 +79,16 @@ static void threadCleanupWIN32 (void) } /* - * threadExitMain () + * epicsThreadExitMain () */ -epicsShareFunc void epicsShareAPI threadExitMain (void) +epicsShareFunc void epicsShareAPI epicsThreadExitMain (void) { } /* - * threadInit () + * epicsThreadInit () */ -epicsShareFunc void epicsShareAPI threadInit (void) +epicsShareFunc void epicsShareAPI epicsThreadInit (void) { HANDLE win32ThreadGlobalMutexTmp; DWORD status; @@ -155,26 +155,26 @@ static unsigned osdPriorityMagFromPriorityOSI ( unsigned osiPriority ) { unsigned magnitude; - // optimizer will remove this one if threadPriorityMin is zero + // optimizer will remove this one if epicsThreadPriorityMin is zero // and osiPriority is unsigned - if (osiPrioritythreadPriorityMax) { - osiPriority = threadPriorityMax; + if (osiPriority>epicsThreadPriorityMax) { + osiPriority = epicsThreadPriorityMax; } magnitude = osiPriority * osdPriorityStateCount; - magnitude /= (threadPriorityMax - threadPriorityMin)+1; + magnitude /= (epicsThreadPriorityMax - epicsThreadPriorityMin)+1; return magnitude; } /* - * threadGetOsdPriorityValue () + * epicsThreadGetOsdPriorityValue () */ -static int threadGetOsdPriorityValue ( unsigned osiPriority ) +static int epicsThreadGetOsdPriorityValue ( unsigned osiPriority ) { unsigned magnitude = osdPriorityMagFromPriorityOSI ( osiPriority ); return osdPriorityList[magnitude]; @@ -205,76 +205,76 @@ static unsigned osiPriorityMagFromMagnitueOSD ( unsigned magnitude ) { unsigned osiPriority; - osiPriority = magnitude * (threadPriorityMax - threadPriorityMin); + osiPriority = magnitude * (epicsThreadPriorityMax - epicsThreadPriorityMin); osiPriority /= osdPriorityStateCount - 1u; - osiPriority += threadPriorityMin; + osiPriority += epicsThreadPriorityMin; return osiPriority; } /* - * threadGetOsiPriorityValue () + * epicsThreadGetOsiPriorityValue () */ -static unsigned threadGetOsiPriorityValue ( int osdPriority ) +static unsigned epicsThreadGetOsiPriorityValue ( int osdPriority ) { unsigned magnitude = osdPriorityMagFromPriorityOSD ( osdPriority ); return osiPriorityMagFromMagnitueOSD (magnitude); } /* - * threadLowestPriorityLevelAbove () + * epicsThreadLowestPriorityLevelAbove () */ -epicsShareFunc threadBoolStatus epicsShareAPI threadLowestPriorityLevelAbove +epicsShareFunc epicsThreadBooleanStatus epicsShareAPI epicsThreadLowestPriorityLevelAbove (unsigned int priority, unsigned *pPriorityJustAbove) { unsigned magnitude = osdPriorityMagFromPriorityOSI ( priority ); - threadBoolStatus status; + epicsThreadBooleanStatus status; if ( magnitude < (osdPriorityStateCount-1) ) { *pPriorityJustAbove = osiPriorityMagFromMagnitueOSD ( magnitude + 1u ); - status = tbsSuccess; + status = threadBoolStatusSuccess; } else { - status = tbsFail; + status = threadBoolStatusFail; } return status; } /* - * threadHighestPriorityLevelBelow () + * epicsThreadHighestPriorityLevelBelow () */ -epicsShareFunc threadBoolStatus epicsShareAPI threadHighestPriorityLevelBelow +epicsShareFunc epicsThreadBooleanStatus epicsShareAPI epicsThreadHighestPriorityLevelBelow (unsigned int priority, unsigned *pPriorityJustBelow) { unsigned magnitude = osdPriorityMagFromPriorityOSI ( priority ); - threadBoolStatus status; + epicsThreadBooleanStatus status; if ( magnitude > 1u ) { *pPriorityJustBelow = osiPriorityMagFromMagnitueOSD ( magnitude - 1u ); - status = tbsSuccess; + status = threadBoolStatusSuccess; } else { - status = tbsFail; + status = threadBoolStatusFail; } return status; } /* - * threadGetStackSize () + * epicsThreadGetStackSize () */ -epicsShareFunc unsigned int epicsShareAPI threadGetStackSize (threadStackSizeClass stackSizeClass) +epicsShareFunc unsigned int epicsShareAPI epicsThreadGetStackSize (epicsThreadStackSizeClass stackSizeClass) { - static const unsigned stackSizeTable[threadStackBig+1] = {4000, 6000, 11000}; + static const unsigned stackSizeTable[epicsThreadStackBig+1] = {4000, 6000, 11000}; - if (stackSizeClassthreadStackBig) { - errlogPrintf("threadGetStackSize illegal argument (too large)"); - return stackSizeTable[threadStackBig]; + if (stackSizeClass>epicsThreadStackBig) { + errlogPrintf("epicsThreadGetStackSize illegal argument (too large)"); + return stackSizeTable[epicsThreadStackBig]; } return stackSizeTable[stackSizeClass]; @@ -303,10 +303,10 @@ static unsigned WINAPI epicsWin32ThreadEntry (LPVOID lpParameter) } /* - * threadCreate () + * epicsThreadCreate () */ -epicsShareFunc threadId epicsShareAPI threadCreate (const char *pName, - unsigned int priority, unsigned int stackSize, THREADFUNC pFunc,void *pParm) +epicsShareFunc epicsThreadId epicsShareAPI epicsThreadCreate (const char *pName, + unsigned int priority, unsigned int stackSize, EPICSTHREADFUNC pFunc,void *pParm) { win32ThreadParam *pParmWIN32; int osdPriority; @@ -314,7 +314,7 @@ epicsShareFunc threadId epicsShareAPI threadCreate (const char *pName, BOOL bstat; if ( ! win32ThreadInitOK ) { - threadInit (); + epicsThreadInit (); if ( ! win32ThreadInitOK ) { return NULL; } @@ -338,7 +338,7 @@ epicsShareFunc threadId epicsShareAPI threadCreate (const char *pName, return NULL; } - osdPriority = threadGetOsdPriorityValue (priority); + osdPriority = epicsThreadGetOsdPriorityValue (priority); bstat = SetThreadPriority ( pParmWIN32->handle, osdPriority ); if (!bstat) { CloseHandle ( pParmWIN32->handle ); @@ -353,13 +353,13 @@ epicsShareFunc threadId epicsShareAPI threadCreate (const char *pName, return NULL; } - return ( threadId ) pParmWIN32; + return ( epicsThreadId ) pParmWIN32; } /* - * threadSuspendSelf () + * epicsThreadSuspendSelf () */ -epicsShareFunc void epicsShareAPI threadSuspendSelf () +epicsShareFunc void epicsShareAPI epicsThreadSuspendSelf () { win32ThreadParam *pParm = (win32ThreadParam *) TlsGetValue (tlsIndexWIN32); BOOL success; @@ -382,9 +382,9 @@ epicsShareFunc void epicsShareAPI threadSuspendSelf () } /* - * threadResume () + * epicsThreadResume () */ -epicsShareFunc void epicsShareAPI threadResume (threadId id) +epicsShareFunc void epicsShareAPI epicsThreadResume (epicsThreadId id) { win32ThreadParam *pParm = (win32ThreadParam *) id; BOOL success; @@ -403,9 +403,9 @@ epicsShareFunc void epicsShareAPI threadResume (threadId id) } /* - * threadGetPriority () + * epicsThreadGetPriority () */ -epicsShareFunc unsigned epicsShareAPI threadGetPriority (threadId id) +epicsShareFunc unsigned epicsShareAPI epicsThreadGetPriority (epicsThreadId id) { win32ThreadParam *pParm = (win32ThreadParam *) id; int win32ThreadPriority; @@ -413,52 +413,52 @@ epicsShareFunc unsigned epicsShareAPI threadGetPriority (threadId id) win32ThreadPriority = GetThreadPriority (pParm->handle); assert (win32ThreadPriority!=THREAD_PRIORITY_ERROR_RETURN); - return threadGetOsiPriorityValue (win32ThreadPriority); + return epicsThreadGetOsiPriorityValue (win32ThreadPriority); } /* - * threadGetPriority () + * epicsThreadGetPriority () */ -epicsShareFunc unsigned epicsShareAPI threadGetPrioritySelf () +epicsShareFunc unsigned epicsShareAPI epicsThreadGetPrioritySelf () { int win32ThreadPriority; win32ThreadPriority = GetThreadPriority ( GetCurrentThread () ); assert (win32ThreadPriority!=THREAD_PRIORITY_ERROR_RETURN); - return threadGetOsiPriorityValue (win32ThreadPriority); + return epicsThreadGetOsiPriorityValue (win32ThreadPriority); } /* - * threadSetPriority () + * epicsThreadSetPriority () */ -epicsShareFunc void epicsShareAPI threadSetPriority (threadId id, unsigned priority) +epicsShareFunc void epicsShareAPI epicsThreadSetPriority (epicsThreadId id, unsigned priority) { win32ThreadParam *pParm = (win32ThreadParam *) id; BOOL stat; - stat = SetThreadPriority (pParm->handle, threadGetOsdPriorityValue (priority) ); + stat = SetThreadPriority (pParm->handle, epicsThreadGetOsdPriorityValue (priority) ); assert (stat); } /* - * threadIsEqual () + * epicsThreadIsEqual () */ -epicsShareFunc int epicsShareAPI threadIsEqual (threadId id1, threadId id2) +epicsShareFunc int epicsShareAPI epicsThreadIsEqual (epicsThreadId id1, epicsThreadId id2) { return ( id1 == id2 ); } /* - * threadIsSuspended () + * epicsThreadIsSuspended () * * This implementation is deficient if the thread is not suspended by - * threadSuspendSelf () or resumed by threadResume(). This would happen - * if a WIN32 call was used instead of threadSuspendSelf(), or if WIN32 + * epicsThreadSuspendSelf () or resumed by epicsThreadResume(). This would happen + * if a WIN32 call was used instead of epicsThreadSuspendSelf(), or if WIN32 * suspended the thread when it receives an unhandled run time exception. * */ -epicsShareFunc int epicsShareAPI threadIsSuspended (threadId id) +epicsShareFunc int epicsShareAPI epicsThreadIsSuspended (epicsThreadId id) { win32ThreadParam *pParm = (win32ThreadParam *) id; DWORD exitCode; @@ -479,9 +479,9 @@ epicsShareFunc int epicsShareAPI threadIsSuspended (threadId id) } /* - * threadSleep () + * epicsThreadSleep () */ -epicsShareFunc void epicsShareAPI threadSleep (double seconds) +epicsShareFunc void epicsShareAPI epicsThreadSleep (double seconds) { static const double mSecPerSec = 1000; DWORD milliSecDelay = (DWORD) (seconds * mSecPerSec); @@ -489,24 +489,24 @@ epicsShareFunc void epicsShareAPI threadSleep (double seconds) } /* - * threadGetIdSelf () + * epicsThreadGetIdSelf () */ -epicsShareFunc threadId epicsShareAPI threadGetIdSelf (void) +epicsShareFunc epicsThreadId epicsShareAPI epicsThreadGetIdSelf (void) { win32ThreadParam *pParm = (win32ThreadParam *) TlsGetValue (tlsIndexWIN32); - return (threadId) pParm; + return (epicsThreadId) pParm; } -epicsShareFunc threadId epicsShareAPI threadGetId (const char *name) +epicsShareFunc epicsThreadId epicsShareAPI epicsThreadGetId (const char *name) { return 0; } /* - * threadGetNameSelf () + * epicsThreadGetNameSelf () */ -epicsShareFunc const char * epicsShareAPI threadGetNameSelf (void) +epicsShareFunc const char * epicsShareAPI epicsThreadGetNameSelf (void) { win32ThreadParam *pParm = (win32ThreadParam *) TlsGetValue (tlsIndexWIN32); @@ -519,9 +519,9 @@ epicsShareFunc const char * epicsShareAPI threadGetNameSelf (void) } /* - * threadGetName () + * epicsThreadGetName () */ -epicsShareFunc void epicsShareAPI threadGetName (threadId id, char *pName, size_t size) +epicsShareFunc void epicsShareAPI epicsThreadGetName (epicsThreadId id, char *pName, size_t size) { win32ThreadParam *pParm = (win32ThreadParam *) id; @@ -533,17 +533,17 @@ epicsShareFunc void epicsShareAPI threadGetName (threadId id, char *pName, size_ } /* - * threadShowAll () + * epicsThreadShowAll () */ -epicsShareFunc void epicsShareAPI threadShowAll (unsigned level) +epicsShareFunc void epicsShareAPI epicsThreadShowAll (unsigned level) { - printf ("sorry, threadShowAll() not implemented on WIN32\n"); + printf ("sorry, epicsThreadShowAll() not implemented on WIN32\n"); } /* - * threadShow () + * epicsThreadShow () */ -epicsShareFunc void epicsShareAPI threadShow (threadId id, unsigned level) +epicsShareFunc void epicsShareAPI epicsThreadShow (epicsThreadId id, unsigned level) { win32ThreadParam *pParm = (win32ThreadParam *) id; @@ -553,10 +553,10 @@ epicsShareFunc void epicsShareAPI threadShow (threadId id, unsigned level) } /* - * threadOnce () + * epicsThreadOnce () */ -epicsShareFunc void epicsShareAPI threadOnceOsd ( - threadOnceId *id, void (*func)(void *), void *arg) +epicsShareFunc void epicsShareAPI epicsThreadOnceOsd ( + epicsThreadOnceId *id, void (*func)(void *), void *arg) { win32ThreadParam *pParm = (win32ThreadParam *) id; @@ -564,7 +564,7 @@ epicsShareFunc void epicsShareAPI threadOnceOsd ( DWORD stat; if ( ! win32ThreadInitOK ) { - threadInit (); + epicsThreadInit (); if ( ! win32ThreadInitOK ) { return; } @@ -583,9 +583,9 @@ epicsShareFunc void epicsShareAPI threadOnceOsd ( } /* - * threadPrivateCreate () + * epicsThreadPrivateCreate () */ -epicsShareFunc threadPrivateId epicsShareAPI threadPrivateCreate () +epicsShareFunc epicsThreadPrivateId epicsShareAPI epicsThreadPrivateCreate () { osdThreadPrivate *p = (osdThreadPrivate *) malloc (sizeof (*p)); if (p) { @@ -595,13 +595,13 @@ epicsShareFunc threadPrivateId epicsShareAPI threadPrivateCreate () p = 0; } } - return (threadPrivateId) p; + return (epicsThreadPrivateId) p; } /* - * threadPrivateDelete () + * epicsThreadPrivateDelete () */ -epicsShareFunc void epicsShareAPI threadPrivateDelete (threadPrivateId id) +epicsShareFunc void epicsShareAPI epicsThreadPrivateDelete (epicsThreadPrivateId id) { osdThreadPrivate *p = (osdThreadPrivate *) id; BOOL stat = TlsFree (p->key); @@ -610,9 +610,9 @@ epicsShareFunc void epicsShareAPI threadPrivateDelete (threadPrivateId id) } /* - * threadPrivateSet () + * epicsThreadPrivateSet () */ -epicsShareFunc void epicsShareAPI threadPrivateSet (threadPrivateId id, void *pVal) +epicsShareFunc void epicsShareAPI epicsThreadPrivateSet (epicsThreadPrivateId id, void *pVal) { struct osdThreadPrivate *pPvt = (struct osdThreadPrivate *) id; BOOL stat = TlsSetValue (pPvt->key, (void *) pVal ); @@ -620,9 +620,9 @@ epicsShareFunc void epicsShareAPI threadPrivateSet (threadPrivateId id, void *pV } /* - * threadPrivateGet () + * epicsThreadPrivateGet () */ -epicsShareFunc void * epicsShareAPI threadPrivateGet (threadPrivateId id) +epicsShareFunc void * epicsShareAPI epicsThreadPrivateGet (epicsThreadPrivateId id) { struct osdThreadPrivate *pPvt = (struct osdThreadPrivate *) id; return (void *) TlsGetValue (pPvt->key); @@ -633,12 +633,12 @@ void testPriorityMapping () { unsigned i; - for (i=threadPriorityMin; i #define epicsExportSharedSymbols -#include "osiThread.h" +#include "epicsThread.h" #include "epicsEvent.h" #include "epicsMutex.h" #include "osiSock.h" @@ -53,9 +53,9 @@ static void createInfoMutex (void *unused) } static void lockInfo (void) { - static threadOnceId infoMutexOnceFlag = OSITHREAD_ONCE_INIT; + static epicsThreadOnceId infoMutexOnceFlag = EPICS_THREAD_ONCE_INIT; - threadOnce (&infoMutexOnceFlag, createInfoMutex, NULL); + epicsThreadOnce (&infoMutexOnceFlag, createInfoMutex, NULL); epicsMutexMustLock (infoMutex); } static void unlockInfo (void) diff --git a/src/libCom/osi/os/posix/osdEvent.c b/src/libCom/osi/os/posix/osdEvent.c index d53fbb494..abb4420c8 100644 --- a/src/libCom/osi/os/posix/osdEvent.c +++ b/src/libCom/osi/os/posix/osdEvent.c @@ -18,7 +18,6 @@ of this distribution. #include #include "epicsEvent.h" -#include "osiThread.h" #include "cantProceed.h" #include "tsStamp.h" #include "errlog.h" diff --git a/src/libCom/osi/os/posix/osdMutex.c b/src/libCom/osi/os/posix/osdMutex.c index fbc074d39..7e15a9761 100644 --- a/src/libCom/osi/os/posix/osdMutex.c +++ b/src/libCom/osi/os/posix/osdMutex.c @@ -18,7 +18,6 @@ of this distribution. #include #include "epicsMutex.h" -#include "osiThread.h" #include "cantProceed.h" #include "tsStamp.h" #include "errlog.h" diff --git a/src/libCom/osi/os/posix/osdThread.c b/src/libCom/osi/os/posix/osdThread.c index 7ac8ec0f2..f6529c0ef 100644 --- a/src/libCom/osi/os/posix/osdThread.c +++ b/src/libCom/osi/os/posix/osdThread.c @@ -1,4 +1,4 @@ -/* osiThread.c */ +/* epicsThread.c */ /* Author: Marty Kraimer Date: 18JAN2000 */ @@ -8,7 +8,7 @@ described on the COPYRIGHT_UniversityOfChicago file included as part of this distribution. ****************************************************************************/ -/* This is a posix implementation of osiThread */ +/* This is a posix implementation of epicsThread */ #include #include #include @@ -21,7 +21,7 @@ of this distribution. #include #include "ellLib.h" -#include "osiThread.h" +#include "epicsThread.h" #include "epicsMutex.h" #include "epicsEvent.h" #include "cantProceed.h" @@ -45,7 +45,7 @@ typedef struct threadInfo { pthread_t tid; pthread_attr_t attr; struct sched_param schedParam; - THREADFUNC createFunc; + EPICSTHREADFUNC createFunc; void *createArg; epicsEventId suspendEvent; int isSuspended; @@ -58,7 +58,7 @@ static epicsMutexId onceLock; static epicsMutexId listLock; static ELLLIST pthreadList; static commonAttr *pcommonAttr = 0; -static int threadInitCalled = 0; +static int epicsThreadInitCalled = 0; #define checkStatus(status,message) \ if((status)) {\ @@ -71,8 +71,8 @@ if(status) { \ cantProceed((method)); \ } -/* The following are for use by once, which is only invoked from threadInit*/ -/* Until threadInit completes errlogInit will not work */ +/* The following are for use by once, which is only invoked from epicsThreadInit*/ +/* Until epicsThreadInit completes errlogInit will not work */ /* It must also be used by init_threadInfo otherwise errlogInit could get */ /* called recursively */ #define checkStatusOnce(status,message) \ @@ -83,7 +83,7 @@ if((status)) {\ if(status) { \ fprintf(stderr,"%s error %s",(message),strerror((status))); \ fprintf(stderr," %s\n",method); \ - fprintf(stderr,"threadInit cant proceed. Program exiting\n"); \ + fprintf(stderr,"epicsThreadInit cant proceed. Program exiting\n"); \ exit(-1);\ } @@ -129,7 +129,7 @@ static int getOssPriorityValue(threadInfo *pthreadInfo) static threadInfo * init_threadInfo(const char *name, unsigned int priority, unsigned int stackSize, - THREADFUNC funptr,void *parm) + EPICSTHREADFUNC funptr,void *parm) { threadInfo *pthreadInfo; int status; @@ -160,7 +160,7 @@ static threadInfo * init_threadInfo(const char *name, status = pthread_attr_setschedparam( &pthreadInfo->attr,&pthreadInfo->schedParam); if(status && errVerbose) { - fprintf(stderr,"threadCreate: pthread_attr_setschedparam failed %s", + fprintf(stderr,"epicsThreadCreate: pthread_attr_setschedparam failed %s", strerror(status)); fprintf(stderr," sched_priority %d\n", pthreadInfo->schedParam.sched_priority); @@ -170,7 +170,7 @@ static threadInfo * init_threadInfo(const char *name, if(errVerbose) checkStatusOnce(status,"pthread_attr_setinheritsched"); #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ pthreadInfo->suspendEvent = epicsEventMustCreate(epicsEventEmpty); - pthreadInfo->name = mallocMustSucceed(strlen(name)+1,"threadCreate"); + pthreadInfo->name = mallocMustSucceed(strlen(name)+1,"epicsThreadCreate"); strcpy(pthreadInfo->name,name); return(pthreadInfo); } @@ -199,9 +199,9 @@ static void once(void) listLock = epicsMutexMustCreate(); ellInit(&pthreadList); pcommonAttr = calloc(1,sizeof(commonAttr)); - if(!pcommonAttr) checkStatusOnceQuit(errno,"calloc","threadInit"); + if(!pcommonAttr) checkStatusOnceQuit(errno,"calloc","epicsThreadInit"); status = pthread_attr_init(&pcommonAttr->attr); - checkStatusOnceQuit(status,"pthread_attr_init","threadInit"); + checkStatusOnceQuit(status,"pthread_attr_init","epicsThreadInit"); status = pthread_attr_setdetachstate( &pcommonAttr->attr, PTHREAD_CREATE_DETACHED); checkStatusOnce(status,"pthread_attr_setdetachstate"); @@ -231,9 +231,9 @@ static void once(void) #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ pthreadInfo = init_threadInfo("_main_",0,0,0,0); status = pthread_setspecific(getpthreadInfo,(void *)pthreadInfo); - checkStatusOnceQuit(status,"pthread_setspecific","threadInit"); + checkStatusOnceQuit(status,"pthread_setspecific","epicsThreadInit"); status = epicsMutexLock(listLock); - checkStatusOnceQuit(status,"epicsMutexLock","threadInit"); + checkStatusOnceQuit(status,"epicsMutexLock","epicsThreadInit"); ellAdd(&pthreadList,&pthreadInfo->node); epicsMutexUnlock(listLock); status = atexit(myAtExit); @@ -267,91 +267,91 @@ static void * start_routine(void *arg) #define ARCH_STACK_FACTOR 2 #endif -unsigned int threadGetStackSize (threadStackSizeClass stackSizeClass) +unsigned int epicsThreadGetStackSize (epicsThreadStackSizeClass stackSizeClass) { #if ! defined (_POSIX_THREAD_ATTR_STACKSIZE) return 0; #elif defined (OSITHREAD_USE_DEFAULT_STACK) return 0; #else - static const unsigned stackSizeTable[threadStackBig+1] = + static const unsigned stackSizeTable[epicsThreadStackBig+1] = {4000*ARCH_STACK_FACTOR, 6000*ARCH_STACK_FACTOR, 11000*ARCH_STACK_FACTOR}; - if (stackSizeClassthreadStackBig) { - errlogPrintf("threadGetStackSize illegal argument (too large)"); - return stackSizeTable[threadStackBig]; + if (stackSizeClass>epicsThreadStackBig) { + errlogPrintf("epicsThreadGetStackSize illegal argument (too large)"); + return stackSizeTable[epicsThreadStackBig]; } return stackSizeTable[stackSizeClass]; #endif /*_POSIX_THREAD_ATTR_STACKSIZE*/ } -void threadInit(void) +void epicsThreadInit(void) { static pthread_once_t once_control = PTHREAD_ONCE_INIT; int status = pthread_once(&once_control,once); - threadInitCalled = 1; - checkStatusQuit(status,"pthread_once","threadInit"); + epicsThreadInitCalled = 1; + checkStatusQuit(status,"pthread_once","epicsThreadInit"); } -/* threadOnce is a macro that calls threadOnceOsd */ -void threadOnceOsd(threadOnceId *id, void (*func)(void *), void *arg) +/* epicsThreadOnce is a macro that calls epicsThreadOnceOsd */ +void epicsThreadOnceOsd(epicsThreadOnceId *id, void (*func)(void *), void *arg) { - if(!threadInitCalled) threadInit(); + if(!epicsThreadInitCalled) epicsThreadInit(); if(epicsMutexLock(onceLock) != epicsMutexLockOK) { - fprintf(stderr,"threadOnceOsd epicsMutexLock failed.\n"); - fprintf(stderr,"Did you call threadInit? Program exiting\n"); + fprintf(stderr,"epicsThreadOnceOsd epicsMutexLock failed.\n"); + fprintf(stderr,"Did you call epicsThreadInit? Program exiting\n"); exit(-1); } if (*id == 0) { /* 0 => first call */ *id = -1; /* -1 => func() active */ func(arg); - *id = +1; /* +1 => func() done (see threadOnce() macro defn) */ + *id = +1; /* +1 => func() done (see epicsThreadOnce() macro defn) */ } epicsMutexUnlock(onceLock); } -threadId threadCreate(const char *name, +epicsThreadId epicsThreadCreate(const char *name, unsigned int priority, unsigned int stackSize, - THREADFUNC funptr,void *parm) + EPICSTHREADFUNC funptr,void *parm) { threadInfo *pthreadInfo; int status; - if(!threadInitCalled) threadInit(); + if(!epicsThreadInitCalled) epicsThreadInit(); assert(pcommonAttr); pthreadInfo = init_threadInfo(name,priority,stackSize,funptr,parm); status = pthread_create(&pthreadInfo->tid,&pthreadInfo->attr, start_routine,pthreadInfo); - checkStatusQuit(status,"pthread_create","threadCreate"); - return((threadId)pthreadInfo); + checkStatusQuit(status,"pthread_create","epicsThreadCreate"); + return((epicsThreadId)pthreadInfo); } -void threadSuspendSelf(void) +void epicsThreadSuspendSelf(void) { threadInfo *pthreadInfo = (threadInfo *)pthread_getspecific(getpthreadInfo); pthreadInfo->isSuspended = 1; epicsEventMustWait(pthreadInfo->suspendEvent); } -void threadResume(threadId id) +void epicsThreadResume(epicsThreadId id) { threadInfo *pthreadInfo = (threadInfo *)id; pthreadInfo->isSuspended = 0; epicsEventSignal(pthreadInfo->suspendEvent); } -void threadExitMain(void) +void epicsThreadExitMain(void) { threadInfo *pthreadInfo = (threadInfo *)pthread_getspecific(getpthreadInfo); if(pthreadInfo->createFunc) { errlogPrintf("called from non-main thread\n"); - cantProceed("threadExitMain"); + cantProceed("epicsThreadExitMain"); } else { free_threadInfo(pthreadInfo); @@ -359,18 +359,18 @@ void threadExitMain(void) } } -unsigned int threadGetPriority(threadId id) +unsigned int epicsThreadGetPriority(epicsThreadId id) { threadInfo *pthreadInfo = (threadInfo *)id; return(pthreadInfo->osiPriority); } -unsigned int threadGetPrioritySelf(void) +unsigned int epicsThreadGetPrioritySelf(void) { - return(threadGetPriority(threadGetIdSelf())); + return(epicsThreadGetPriority(epicsThreadGetIdSelf())); } -void threadSetPriority(threadId id,unsigned int priority) +void epicsThreadSetPriority(epicsThreadId id,unsigned int priority) { threadInfo *pthreadInfo = (threadInfo *)id; #if defined (_POSIX_THREAD_PRIORITY_SCHEDULING) @@ -389,54 +389,54 @@ void threadSetPriority(threadId id,unsigned int priority) #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ } -threadBoolStatus threadHighestPriorityLevelBelow( +epicsThreadBooleanStatus epicsThreadHighestPriorityLevelBelow( unsigned int priority, unsigned *pPriorityJustBelow) { unsigned newPriority = priority - 1; #if defined (_POSIX_THREAD_PRIORITY_SCHEDULING) int diff; - diff = (double)pcommonAttr->maxPriority - (double)pcommonAttr->minPriority; + diff = pcommonAttr->maxPriority - pcommonAttr->minPriority; if(diff<0) diff = -diff; if(diff>1 && diff <100) newPriority -= 100/(diff+1); #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ if (newPriority <= 99) { *pPriorityJustBelow = newPriority; - return tbsSuccess; + return epicsThreadBooleanStatusSuccess; } - return tbsFail; + return epicsThreadBooleanStatusFail; } -threadBoolStatus threadLowestPriorityLevelAbove( +epicsThreadBooleanStatus epicsThreadLowestPriorityLevelAbove( unsigned int priority, unsigned *pPriorityJustAbove) { unsigned newPriority = priority + 1; #if defined (_POSIX_THREAD_PRIORITY_SCHEDULING) int diff; - diff = (double)pcommonAttr->maxPriority - (double)pcommonAttr->minPriority; + diff = pcommonAttr->maxPriority - pcommonAttr->minPriority; if(diff<0) diff = -diff; if(diff>1 && diff <100) newPriority += 100/(diff+1); #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ if (newPriority <= 99) { *pPriorityJustAbove = newPriority; - return tbsSuccess; + return epicsThreadBooleanStatusSuccess; } - return tbsFail; + return epicsThreadBooleanStatusFail; } -int threadIsEqual(threadId id1, threadId id2) +int epicsThreadIsEqual(epicsThreadId id1, epicsThreadId id2) { threadInfo *p1 = (threadInfo *)id1; threadInfo *p2 = (threadInfo *)id2; return(pthread_equal(p1->tid,p2->tid)); } -int threadIsSuspended(threadId id) { +int epicsThreadIsSuspended(epicsThreadId id) { threadInfo *pthreadInfo = (threadInfo *)id; return(pthreadInfo->isSuspended ? 1 : 0); } -void threadSleep(double seconds) +void epicsThreadSleep(double seconds) { struct timespec delayTime; struct timespec remainingTime; @@ -448,12 +448,12 @@ void threadSleep(double seconds) nanosleep(&delayTime,&remainingTime); } -threadId threadGetIdSelf(void) { +epicsThreadId epicsThreadGetIdSelf(void) { threadInfo *pthreadInfo = (threadInfo *)pthread_getspecific(getpthreadInfo); - return((threadId)pthreadInfo); + return((epicsThreadId)pthreadInfo); } -threadId threadGetId(const char *name) { +epicsThreadId epicsThreadGetId(const char *name) { threadInfo *pthreadInfo; epicsMutexMustLock(listLock); pthreadInfo=(threadInfo *)ellFirst(&pthreadList); @@ -462,36 +462,36 @@ threadId threadGetId(const char *name) { pthreadInfo=(threadInfo *)ellNext(&pthreadInfo->node); } epicsMutexUnlock(listLock); - return((threadId)pthreadInfo); + return((epicsThreadId)pthreadInfo); } -const char *threadGetNameSelf() +const char *epicsThreadGetNameSelf() { threadInfo *pthreadInfo = (threadInfo *)pthread_getspecific(getpthreadInfo); return(pthreadInfo->name); } -void threadGetName(threadId id, char *name, size_t size) +void epicsThreadGetName(epicsThreadId id, char *name, size_t size) { threadInfo *pthreadInfo = (threadInfo *)id; strncpy(name, pthreadInfo->name, size-1); name[size-1] = '\0'; } -void threadShowAll(unsigned int level) +void epicsThreadShowAll(unsigned int level) { threadInfo *pthreadInfo; - threadShow(0,level); + epicsThreadShow(0,level); epicsMutexMustLock(listLock); pthreadInfo=(threadInfo *)ellFirst(&pthreadList); while(pthreadInfo) { - threadShow((threadId)pthreadInfo,level); + epicsThreadShow((epicsThreadId)pthreadInfo,level); pthreadInfo=(threadInfo *)ellNext(&pthreadInfo->node); } epicsMutexUnlock(listLock); } -void threadShow(threadId id,unsigned int level) +void epicsThreadShow(epicsThreadId id,unsigned int level) { threadInfo *pthreadInfo = (threadInfo *)id; @@ -506,7 +506,7 @@ void threadShow(threadId id,unsigned int level) status = pthread_getschedparam(pthreadInfo->tid,&policy,¶m); priority = (status ? 0 : param.sched_priority); - printf("%16.16s %p %d %8d %8.8s\n", pthreadInfo->name,(threadId) + printf("%16.16s %p %d %8d %8.8s\n", pthreadInfo->name,(epicsThreadId) pthreadInfo,pthreadInfo->osiPriority,priority,pthreadInfo-> isSuspended?"SUSPEND":"OK"); if(level>0) @@ -515,44 +515,44 @@ void threadShow(threadId id,unsigned int level) } -threadPrivateId threadPrivateCreate(void) +epicsThreadPrivateId epicsThreadPrivateCreate(void) { pthread_key_t *key; int status; - key = callocMustSucceed(1,sizeof(pthread_key_t),"threadPrivateCreate"); + key = callocMustSucceed(1,sizeof(pthread_key_t),"epicsThreadPrivateCreate"); status = pthread_key_create(key,0); - checkStatusQuit(status,"pthread_key_create","threadPrivateCreate"); - return((threadPrivateId)key); + checkStatusQuit(status,"pthread_key_create","epicsThreadPrivateCreate"); + return((epicsThreadPrivateId)key); } -void threadPrivateDelete(threadPrivateId id) +void epicsThreadPrivateDelete(epicsThreadPrivateId id) { pthread_key_t *key = (pthread_key_t *)id; int status; status = pthread_key_delete(*key); - checkStatusQuit(status,"pthread_key_delete","threadPrivateDelete"); + checkStatusQuit(status,"pthread_key_delete","epicsThreadPrivateDelete"); } -void threadPrivateSet (threadPrivateId id, void *value) +void epicsThreadPrivateSet (epicsThreadPrivateId id, void *value) { pthread_key_t *key = (pthread_key_t *)id; int status; if(errVerbose && !value) - errlogPrintf("threadPrivateSet: setting value of 0\n"); + errlogPrintf("epicsThreadPrivateSet: setting value of 0\n"); status = pthread_setspecific(*key,value); - checkStatusQuit(status,"pthread_setspecific","threadPrivateSet"); + checkStatusQuit(status,"pthread_setspecific","epicsThreadPrivateSet"); } -void *threadPrivateGet(threadPrivateId id) +void *epicsThreadPrivateGet(epicsThreadPrivateId id) { pthread_key_t *key = (pthread_key_t *)id; void *value; value = pthread_getspecific(*key); if(errVerbose && !value) - errlogPrintf("threadPrivateGet: pthread_getspecific returned 0\n"); + errlogPrintf("epicsThreadPrivateGet: pthread_getspecific returned 0\n"); return(value); } diff --git a/src/libCom/osi/os/vxWorks/iocClock.c b/src/libCom/osi/os/vxWorks/iocClock.c index deb5b6275..ad94f66db 100644 --- a/src/libCom/osi/os/vxWorks/iocClock.c +++ b/src/libCom/osi/os/vxWorks/iocClock.c @@ -24,7 +24,7 @@ of this distribution. #include "epicsTypes.h" #include "cantProceed.h" #include "errlog.h" -#include "osiThread.h" +#include "epicsThread.h" #include "epicsMutex.h" #include "tsStamp.h" #include "iocClock.h" @@ -60,7 +60,7 @@ static void syncNTP(void) while(1) { double diffTime; - if(!firstTime)threadSleep(iocClockSyncRate); + if(!firstTime)epicsThreadSleep(iocClockSyncRate); firstTime = 0; status = sntpcTimeGet(piocClockPvt->pserverAddr, piocClockPvt->tickRate,&Currtime); @@ -111,9 +111,10 @@ void iocClockInit() errlogPrintf("No NTP server is defined. Clock does not work\n"); return; } - threadCreate("syncNTP", - threadPriorityHigh,threadGetStackSize(threadStackSmall), - (THREADFUNC)syncNTP,0); + epicsThreadCreate("syncNTP", + epicsThreadPriorityHigh, + epicsThreadGetStackSize(epicsThreadStackSmall), + (EPICSTHREADFUNC)syncNTP,0); return; } diff --git a/src/libCom/osi/os/vxWorks/osdAssert.c b/src/libCom/osi/os/vxWorks/osdAssert.c index 06039c287..90a29b48e 100644 --- a/src/libCom/osi/os/vxWorks/osdAssert.c +++ b/src/libCom/osi/os/vxWorks/osdAssert.c @@ -36,7 +36,7 @@ #include #define epicsExportSharedSymbols -#include "osiThread.h" +#include "epicsThread.h" #include "epicsPrint.h" #include "epicsVersion.h" #include "epicsAssert.h" @@ -45,13 +45,13 @@ * epicsAssert () * * This forces assert failures into the log file and then - * calls threadSuspendSelf() instead of exit() so that we can debug + * calls epicsThreadSuspendSelf() instead of exit() so that we can debug * the problem. */ epicsShareFunc void epicsShareAPI epicsAssert (const char *pFile, const unsigned line, const char *pExp, const char *pAuthorName) { - threadId threadid = threadGetIdSelf(); + epicsThreadId threadid = epicsThreadGetIdSelf(); epicsPrintf ( "\n\n\n%s: A call to \"assert (%s)\" failed in %s at %d\n", @@ -83,6 +83,6 @@ epicsShareFunc void epicsShareAPI epicsAssert (const char *pFile, const unsigned } epicsPrintf ("This problem occurred in \"%s\"\n", epicsReleaseVersion); - threadSuspendSelf (); + epicsThreadSuspendSelf (); } diff --git a/src/libCom/osi/os/vxWorks/osdThread.c b/src/libCom/osi/os/vxWorks/osdThread.c index 6817f3e95..35df5520b 100644 --- a/src/libCom/osi/os/vxWorks/osdThread.c +++ b/src/libCom/osi/os/vxWorks/osdThread.c @@ -1,4 +1,4 @@ -/* osi/os/vxWorks/osiThread.c */ +/* osi/os/vxWorks/epicsThread.c */ /* Author: Marty Kraimer Date: 25AUG99 */ @@ -23,7 +23,7 @@ int sysClkRateGet(void); #include "errlog.h" #include "ellLib.h" -#include "osiThread.h" +#include "epicsThread.h" #include "cantProceed.h" #include "epicsAssert.h" #include "vxLib.h" @@ -36,14 +36,14 @@ int sysClkRateGet(void); #else #define ARCH_STACK_FACTOR 2 #endif -static const unsigned stackSizeTable[threadStackBig+1] = +static const unsigned stackSizeTable[epicsThreadStackBig+1] = {4000*ARCH_STACK_FACTOR, 6000*ARCH_STACK_FACTOR, 11000*ARCH_STACK_FACTOR}; -/* definitions for implementation of threadPrivate */ +/* definitions for implementation of epicsThreadPrivate */ static void **papTSD = 0; -static int nthreadPrivate = 0; +static int nepicsThreadPrivate = 0; -static SEM_ID threadOnceMutex = 0; +static SEM_ID epicsThreadOnceMutex = 0; /* Just map osi 0 to 99 into vx 100 to 199 */ /* remember that for vxWorks lower number means higher priority */ @@ -53,10 +53,10 @@ static SEM_ID threadOnceMutex = 0; static unsigned int getOsiPriorityValue(int ossPriority) { if ( ossPriority < 100 ) { - return threadPriorityMax; + return epicsThreadPriorityMax; } else if ( ossPriority > 199 ) { - return threadPriorityMin; + return epicsThreadPriorityMin; } else { return ( 199u - (unsigned int) ossPriority ); @@ -73,49 +73,49 @@ static int getOssPriorityValue(unsigned int osiPriority) } } -unsigned int threadGetStackSize (threadStackSizeClass stackSizeClass) +unsigned int epicsThreadGetStackSize (epicsThreadStackSizeClass stackSizeClass) { - if (stackSizeClassthreadStackBig) { - errlogPrintf("threadGetStackSize illegal argument (too large)"); - return stackSizeTable[threadStackBig]; + if (stackSizeClass>epicsThreadStackBig) { + errlogPrintf("epicsThreadGetStackSize illegal argument (too large)"); + return stackSizeTable[epicsThreadStackBig]; } return stackSizeTable[stackSizeClass]; } -void threadInit(void) +void epicsThreadInit(void) { static int lock = 0; while(!vxTas(&lock)) taskDelay(1); - if(threadOnceMutex==0) { - threadOnceMutex = semMCreate( + if(epicsThreadOnceMutex==0) { + epicsThreadOnceMutex = semMCreate( SEM_DELETE_SAFE|SEM_INVERSION_SAFE|SEM_Q_PRIORITY); - assert(threadOnceMutex); + assert(epicsThreadOnceMutex); } lock = 0; iocClockInit(); } -void threadOnceOsd(threadOnceId *id, void (*func)(void *), void *arg) +void epicsThreadOnceOsd(epicsThreadOnceId *id, void (*func)(void *), void *arg) { - threadInit(); - assert(semTake(threadOnceMutex,WAIT_FOREVER)==OK); + epicsThreadInit(); + assert(semTake(epicsThreadOnceMutex,WAIT_FOREVER)==OK); if (*id == 0) { /* 0 => first call */ *id = -1; /* -1 => func() active */ func(arg); - *id = +1; /* +1 => func() done (see threadOnce() macro defn) */ + *id = +1; /* +1 => func() done (see epicsThreadOnce() macro defn) */ } - semGive(threadOnceMutex); + semGive(epicsThreadOnceMutex); } -static void createFunction(THREADFUNC func, void *parm) +static void createFunction(EPICSTHREADFUNC func, void *parm) { int tid = taskIdSelf(); @@ -127,14 +127,14 @@ static void createFunction(THREADFUNC func, void *parm) free(papTSD); } -threadId threadCreate(const char *name, +epicsThreadId epicsThreadCreate(const char *name, unsigned int priority, unsigned int stackSize, - THREADFUNC funptr,void *parm) + EPICSTHREADFUNC funptr,void *parm) { int tid; - if(threadOnceMutex==0) threadInit(); + if(epicsThreadOnceMutex==0) epicsThreadInit(); if(stackSize<100) { - errlogPrintf("threadCreate %s illegal stackSize %d\n",name,stackSize); + errlogPrintf("epicsThreadCreate %s illegal stackSize %d\n",name,stackSize); return(0); } tid = taskSpawn((char *)name,getOssPriorityValue(priority), @@ -142,51 +142,51 @@ threadId threadCreate(const char *name, (FUNCPTR)createFunction,(int)funptr,(int)parm, 0,0,0,0,0,0,0,0); if(tid==0) { - errlogPrintf("threadCreate taskSpawn failure for %s\n",name); + errlogPrintf("epicsThreadCreate taskSpawn failure for %s\n",name); return(0); } - return((threadId)tid); + return((epicsThreadId)tid); } -void threadSuspendSelf() +void epicsThreadSuspendSelf() { STATUS status; status = taskSuspend(taskIdSelf()); - if(status) errlogPrintf("threadSuspendSelf failed\n"); + if(status) errlogPrintf("epicsThreadSuspendSelf failed\n"); } -void threadResume(threadId id) +void epicsThreadResume(epicsThreadId id) { int tid = (int)id; STATUS status; status = taskResume(tid); - if(status) errlogPrintf("threadResume failed\n"); + if(status) errlogPrintf("epicsThreadResume failed\n"); } -void threadExitMain(void) +void epicsThreadExitMain(void) { - errlogPrintf("threadExitMain was called for vxWorks. Why?\n"); + errlogPrintf("epicsThreadExitMain was called for vxWorks. Why?\n"); } -unsigned int threadGetPriority(threadId id) +unsigned int epicsThreadGetPriority(epicsThreadId id) { int tid = (int)id; STATUS status; int priority = 0; status = taskPriorityGet(tid,&priority); - if(status) errlogPrintf("threadGetPriority failed\n"); + if(status) errlogPrintf("epicsThreadGetPriority failed\n"); return(getOsiPriorityValue(priority)); } -unsigned int threadGetPrioritySelf(void) +unsigned int epicsThreadGetPrioritySelf(void) { - return(threadGetPriority(threadGetIdSelf())); + return(epicsThreadGetPriority(epicsThreadGetIdSelf())); } -void threadSetPriority(threadId id,unsigned int osip) +void epicsThreadSetPriority(epicsThreadId id,unsigned int osip) { int tid = (int)id; STATUS status; @@ -194,21 +194,21 @@ void threadSetPriority(threadId id,unsigned int osip) priority = getOssPriorityValue(osip); status = taskPrioritySet(tid,priority); - if(status) errlogPrintf("threadSetPriority failed\n"); + if(status) errlogPrintf("epicsThreadSetPriority failed\n"); } -threadBoolStatus threadHighestPriorityLevelBelow( +epicsThreadBooleanStatus epicsThreadHighestPriorityLevelBelow( unsigned int priority, unsigned *pPriorityJustBelow) { unsigned newPriority = priority - 1; if (newPriority <= 99) { *pPriorityJustBelow = newPriority; - return tbsSuccess; + return epicsThreadBooleanStatusSuccess; } - return tbsFail; + return epicsThreadBooleanStatusFail; } -threadBoolStatus threadLowestPriorityLevelAbove( +epicsThreadBooleanStatus epicsThreadLowestPriorityLevelAbove( unsigned int priority, unsigned *pPriorityJustAbove) { unsigned newPriority = priority + 1; @@ -216,59 +216,59 @@ threadBoolStatus threadLowestPriorityLevelAbove( newPriority = priority + 1; if (newPriority <= 99) { *pPriorityJustAbove = newPriority; - return tbsSuccess; + return epicsThreadBooleanStatusSuccess; } - return tbsFail; + return epicsThreadBooleanStatusFail; } -int threadIsEqual(threadId id1, threadId id2) +int epicsThreadIsEqual(epicsThreadId id1, epicsThreadId id2) { return((id1==id2) ? 1 : 0); } -int threadIsSuspended(threadId id) +int epicsThreadIsSuspended(epicsThreadId id) { int tid = (int)id; return((int)taskIsSuspended(tid)); } -void threadSleep(double seconds) +void epicsThreadSleep(double seconds) { STATUS status; status = taskDelay((int)(seconds*sysClkRateGet())); - if(status) errlogPrintf(0,"threadSleep\n"); + if(status) errlogPrintf(0,"epicsThreadSleep\n"); } -threadId threadGetIdSelf(void) +epicsThreadId epicsThreadGetIdSelf(void) { - return((threadId)taskIdSelf()); + return((epicsThreadId)taskIdSelf()); } -threadId threadGetId(const char *name) +epicsThreadId epicsThreadGetId(const char *name) { int tid = taskNameToId((char *)name); - return((threadId)(tid==ERROR?0:tid)); + return((epicsThreadId)(tid==ERROR?0:tid)); } -const char *threadGetNameSelf(void) +const char *epicsThreadGetNameSelf(void) { return taskName(taskIdSelf()); } -void threadGetName (threadId id, char *name, size_t size) +void epicsThreadGetName (epicsThreadId id, char *name, size_t size) { int tid = (int)id; strncpy(name,taskName(tid),size-1); name[size-1] = '\0'; } -void threadShowAll(unsigned int level) +void epicsThreadShowAll(unsigned int level) { taskShow(0,2); } -void threadShow(threadId id,unsigned int level) +void epicsThreadShow(epicsThreadId id,unsigned int level) { int tid = (int)id; taskShow(tid,level); @@ -277,29 +277,29 @@ void threadShow(threadId id,unsigned int level) /* The following algorithm was thought of by Andrew Johnson APS/ASD . * The basic idea is to use a single vxWorks task variable. * The task variable is papTSD, which is an array of pointers to the TSD - * The array size is equal to the number of threadPrivateIds created + 1 - * when threadPrivateSet is called. - * Until the first call to threadPrivateCreate by a application papTSD=0 - * After first call papTSD[0] is value of nthreadPrivate when - * threadPrivateSet was last called by the thread. This is also - * the value of threadPrivateId. - * The algorithm allows for threadPrivateCreate being called after - * the first call to threadPrivateSet. + * The array size is equal to the number of epicsThreadPrivateIds created + 1 + * when epicsThreadPrivateSet is called. + * Until the first call to epicsThreadPrivateCreate by a application papTSD=0 + * After first call papTSD[0] is value of nepicsThreadPrivate when + * epicsThreadPrivateSet was last called by the thread. This is also + * the value of epicsThreadPrivateId. + * The algorithm allows for epicsThreadPrivateCreate being called after + * the first call to epicsThreadPrivateSet. */ -threadPrivateId threadPrivateCreate() +epicsThreadPrivateId epicsThreadPrivateCreate() { static int lock = 0; - threadPrivateId id; + epicsThreadPrivateId id; - threadInit(); - /*lock is necessary because ++nthreadPrivate may not be indivisible*/ + epicsThreadInit(); + /*lock is necessary because ++nepicsThreadPrivate may not be indivisible*/ while(!vxTas(&lock)) taskDelay(1); - id = (threadPrivateId)++nthreadPrivate; + id = (epicsThreadPrivateId)++nepicsThreadPrivate; lock = 0; return(id); } -void threadPrivateDelete(threadPrivateId id) +void epicsThreadPrivateDelete(epicsThreadPrivateId id) { /*nothing to delete */ return; @@ -309,34 +309,34 @@ void threadPrivateDelete(threadPrivateId id) * Note that it is not necessary to have mutex for following * because they must be called by the same thread */ -void threadPrivateSet (threadPrivateId id, void *pvt) +void epicsThreadPrivateSet (epicsThreadPrivateId id, void *pvt) { - int indpthreadPrivate = (int)id; - int nthreadPrivateOld = 0; + int indpepicsThreadPrivate = (int)id; + int nepicsThreadPrivateOld = 0; - if(papTSD) nthreadPrivateOld = (int)papTSD[0]; - if(!papTSD || (nthreadPrivateOld -#include - -static void osiThreadCallEntryPoint ( void *pPvt ); // for gnu warning - -#define epicsExportSharedSymbols -#include "osiThread.h" - -static void osiThreadCallEntryPoint ( void *pPvt ) -{ - osiThread *pThread = static_cast ( pPvt ); - pThread->begin.wait (); - if ( ! pThread->cancel ) { - pThread->entryPoint (); - } - pThread->id = 0; - pThread->exit.signal (); -} - -osiThread::osiThread ( const char *name, unsigned stackSize, unsigned priority ) : - cancel (false) -{ - this->id = threadCreate ( name, priority, stackSize, - osiThreadCallEntryPoint, static_cast (this) ); -} - -osiThread::~osiThread () -{ - if ( this->id ) { - this->cancel = true; - this->begin.signal (); - while ( ! this->exit.wait ( 5.0 ) ) { - printf ("osiThread::~osiThread ():" - " Warning, thread object destroyed before thread exit \n"); - } - } -} - -void osiThread::start () -{ - this->begin.signal (); -} - -bool osiThread::isCurrentThread () const -{ - return ( threadGetIdSelf () == this->id ); -} diff --git a/src/libCom/osi/osiThread.h b/src/libCom/osi/osiThread.h deleted file mode 100644 index fd4cee5fa..000000000 --- a/src/libCom/osi/osiThread.h +++ /dev/null @@ -1,248 +0,0 @@ -#ifndef osiThreadh -#define osiThreadh - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -#include "shareLib.h" - -typedef void (*THREADFUNC)(void *parm); - -static const unsigned threadPriorityMax = 99; -static const unsigned threadPriorityMin = 0; - -/* some generic values */ -static const unsigned threadPriorityLow = 10; -static const unsigned threadPriorityMedium = 50; -static const unsigned threadPriorityHigh = 90; - -/* some iocCore specific values */ -static const unsigned threadPriorityChannelAccessServer = 30; -static const unsigned threadPriorityScanLow = 60; -static const unsigned threadPriorityScanHigh = 70; - -/* stack sizes for each stackSizeClass are implementation and CPU dependent */ -typedef enum { - threadStackSmall, threadStackMedium, threadStackBig -} threadStackSizeClass; - -typedef enum {tbsFail, tbsSuccess} threadBoolStatus; - -epicsShareFunc unsigned int epicsShareAPI threadGetStackSize(threadStackSizeClass size); - -typedef int threadOnceId; -#define OSITHREAD_ONCE_INIT 0 - -/* void threadOnce(threadOnceId *id, THREADFUNC, void *arg); */ -/* threadOnce is implemented as a macro */ -/* threadOnceOsd should not be called by user code */ -epicsShareFunc void epicsShareAPI threadOnceOsd( - threadOnceId *id, THREADFUNC, void *arg); - -#define threadOnce(id,func,arg) \ -if(*(id)<=0) threadOnceOsd((id),(func),(arg)) - -epicsShareFunc void epicsShareAPI threadInit(void); -epicsShareFunc void epicsShareAPI threadExitMain(void); - -/* (threadId)0 is guaranteed to be an invalid thread id */ -typedef void *threadId; - -epicsShareFunc threadId epicsShareAPI threadCreate(const char *name, - unsigned int priority, unsigned int stackSize, - THREADFUNC funptr,void *parm); -epicsShareFunc void epicsShareAPI threadSuspendSelf(void); -epicsShareFunc void epicsShareAPI threadResume(threadId id); -epicsShareFunc unsigned int epicsShareAPI threadGetPriority(threadId id); -epicsShareFunc unsigned int epicsShareAPI threadGetPrioritySelf(); -epicsShareFunc void epicsShareAPI threadSetPriority( - threadId id,unsigned int priority); -epicsShareFunc threadBoolStatus epicsShareAPI threadHighestPriorityLevelBelow - (unsigned int priority, unsigned *pPriorityJustBelow); -epicsShareFunc threadBoolStatus epicsShareAPI threadLowestPriorityLevelAbove - (unsigned int priority, unsigned *pPriorityJustAbove); -epicsShareFunc int epicsShareAPI threadIsEqual(threadId id1, threadId id2); -epicsShareFunc int epicsShareAPI threadIsSuspended(threadId id); -epicsShareFunc void epicsShareAPI threadSleep(double seconds); -epicsShareFunc threadId epicsShareAPI threadGetIdSelf(void); -epicsShareFunc threadId epicsShareAPI threadGetId(const char *name); - -epicsShareFunc const char * epicsShareAPI threadGetNameSelf(void); - -/* For threadGetName name is guaranteed to be null terminated */ -/* size is size of buffer to hold name (including terminator) */ -/* Failure results in an empty string stored in name */ -epicsShareFunc void epicsShareAPI threadGetName(threadId id, char *name, size_t size); - -epicsShareFunc void epicsShareAPI threadShowAll(unsigned int level); -epicsShareFunc void epicsShareAPI threadShow(threadId id,unsigned int level); - -typedef void * threadPrivateId; -epicsShareFunc threadPrivateId epicsShareAPI threadPrivateCreate (void); -epicsShareFunc void epicsShareAPI threadPrivateDelete (threadPrivateId id); -epicsShareFunc void epicsShareAPI threadPrivateSet (threadPrivateId, void *); -epicsShareFunc void * epicsShareAPI threadPrivateGet (threadPrivateId); - -#ifdef __cplusplus -} -#endif - -#ifdef __cplusplus - -#include "locationException.h" -#include "epicsEvent.h" - -class epicsShareClass osiThread { -public: - osiThread (const char *name, unsigned stackSize, - unsigned priority=threadPriorityLow); - virtual ~osiThread (); - - void start(); - - virtual void entryPoint () = 0; - - void resume (); - void getName (char *name, size_t size) const; - unsigned getPriority () const; - void setPriority (unsigned); - bool priorityIsEqual (const osiThread &otherThread) const; - bool isSuspended () const; - bool isCurrentThread () const; - bool operator == (const osiThread &rhs) const; - - /* these operate on the current thread */ - static void suspendSelf (); - static void sleep (double seconds); - static osiThread & getSelf (); - static const char * getNameSelf (); -private: - threadId id; - epicsEvent exit; - epicsEvent begin; - bool cancel; - - osiThread ( const osiThread & ); - osiThread & operator = ( const osiThread & ); - - friend void osiThreadCallEntryPoint (void *pPvt); -}; - -template -class osiThreadPrivate { -public: - osiThreadPrivate (); - ~osiThreadPrivate (); - T *get () const; - void set (T *); - class unableToCreateThreadPrivate {}; // exception -private: - threadPrivateId id; -}; - -#endif /* __cplusplus */ - -#include "osdThread.h" - -#ifdef __cplusplus - -#include "epicsAssert.h" - -inline void osiThread::resume () -{ - threadResume (this->id); -} - -inline void osiThread::getName (char *name, size_t size) const -{ - threadGetName (this->id, name, size); -} - -inline unsigned osiThread::getPriority () const -{ - return threadGetPriority (this->id); -} - -inline void osiThread::setPriority (unsigned priority) -{ - threadSetPriority (this->id, priority); -} - -inline bool osiThread::priorityIsEqual (const osiThread &otherThread) const -{ - if ( threadIsEqual (this->id, otherThread.id) ) { - return true; - } - else { - return false; - } -} - -inline bool osiThread::isSuspended () const -{ - if ( threadIsSuspended (this->id) ) { - return true; - } - else { - return false; - } -} - -inline bool osiThread::operator == (const osiThread &rhs) const -{ - return (this->id == rhs.id); -} - -inline void osiThread::suspendSelf () -{ - threadSuspendSelf (); -} - -inline void osiThread::sleep (double seconds) -{ - threadSleep (seconds); -} - -inline osiThread & osiThread::getSelf () -{ - return * static_cast ( threadGetIdSelf () ); -} - -inline const char *osiThread::getNameSelf () -{ - return threadGetNameSelf (); -} - -template -inline osiThreadPrivate::osiThreadPrivate () -{ - this->id = threadPrivateCreate (); - if (this->id == 0) { - throwWithLocation ( unableToCreateThreadPrivate () ); - } -} - -template -inline osiThreadPrivate::~osiThreadPrivate () -{ - threadPrivateDelete ( this->id ); -} - -template -inline T *osiThreadPrivate::get () const -{ - return static_cast ( threadPrivateGet (this->id) ); -} - -template -inline void osiThreadPrivate::set (T *pIn) -{ - threadPrivateSet ( this->id, static_cast (pIn) ); -} - -#endif /* ifdef __cplusplus */ - -#endif /* osiThreadh */ diff --git a/src/libCom/taskwd/taskwd.c b/src/libCom/taskwd/taskwd.c index 7163aa6b3..0ba7e8703 100644 --- a/src/libCom/taskwd/taskwd.c +++ b/src/libCom/taskwd/taskwd.c @@ -24,7 +24,7 @@ of this distribution. #define epicsExportSharedSymbols #include "dbDefs.h" -#include "osiThread.h" +#include "epicsThread.h" #include "epicsMutex.h" #include "errlog.h" #include "ellLib.h" @@ -38,7 +38,7 @@ struct task_list { MYFUNCPTR callback; void *arg; union { - threadId tid; + epicsThreadId tid; void *userpvt; } id; int suspended; @@ -49,7 +49,7 @@ static ELLLIST anylist; static epicsMutexId lock; static epicsMutexId anylock; static epicsMutexId alloclock; -static threadId taskwdid=0; +static epicsThreadId taskwdid=0; volatile int taskwdOn=TRUE; struct freeList{ struct freeList *next; @@ -71,19 +71,19 @@ static void taskwdInitPvt(void *arg) alloclock = epicsMutexMustCreate(); ellInit(&list); ellInit(&anylist); - taskwdid = threadCreate( - "taskwd",threadPriorityLow, - threadGetStackSize(threadStackSmall), - (THREADFUNC)taskwdTask,0); + taskwdid = epicsThreadCreate( + "taskwd",epicsThreadPriorityLow, + epicsThreadGetStackSize(epicsThreadStackSmall), + (EPICSTHREADFUNC)taskwdTask,0); } void epicsShareAPI taskwdInit() { - static threadOnceId taskwdOnceFlag = OSITHREAD_ONCE_INIT; + static epicsThreadOnceId taskwdOnceFlag = EPICS_THREAD_ONCE_INIT; void *arg = 0; - threadOnce(&taskwdOnceFlag,taskwdInitPvt,arg); + epicsThreadOnce(&taskwdOnceFlag,taskwdInitPvt,arg); } -void epicsShareAPI taskwdInsert(threadId tid,TASKWDFUNCPRR callback,void *arg) +void epicsShareAPI taskwdInsert(epicsThreadId tid,TASKWDFUNCPRR callback,void *arg) { struct task_list *pt; @@ -112,7 +112,7 @@ void epicsShareAPI taskwdAnyInsert(void *userpvt,TASKWDANYFUNCPRR callback,void epicsMutexUnlock(anylock); } -void epicsShareAPI taskwdRemove(threadId tid) +void epicsShareAPI taskwdRemove(epicsThreadId tid) { struct task_list *pt; @@ -162,7 +162,7 @@ static void taskwdTask(void) pt = (struct task_list *)ellFirst(&list); while(pt) { next = (struct task_list *)ellNext((void *)pt); - if(threadIsSuspended(pt->id.tid)) { + if(epicsThreadIsSuspended(pt->id.tid)) { char message[100]; if(!pt->suspended) { @@ -197,7 +197,7 @@ static void taskwdTask(void) } epicsMutexUnlock(lock); } - threadSleep(TASKWD_DELAY); + epicsThreadSleep(TASKWD_DELAY); } } diff --git a/src/libCom/taskwd/taskwd.h b/src/libCom/taskwd/taskwd.h index 42bc4ac74..b10e86044 100644 --- a/src/libCom/taskwd/taskwd.h +++ b/src/libCom/taskwd/taskwd.h @@ -22,11 +22,11 @@ of this distribution. #ifndef INCtaskwdh #define INCtaskwdh 1 -#include "osiThread.h" +#include "epicsThread.h" #include "shareLib.h" typedef void (*TASKWDFUNCPRR)(void *parm); -typedef void (*TASKWDANYFUNCPRR)(void *parm,threadId tid); +typedef void (*TASKWDANYFUNCPRR)(void *parm,epicsThreadId tid); #ifdef __cplusplus extern "C" { @@ -34,10 +34,10 @@ extern "C" { epicsShareFunc void epicsShareAPI taskwdInit(void); epicsShareFunc void epicsShareAPI taskwdInsert( - threadId tid, TASKWDFUNCPRR callback,void *arg); + epicsThreadId tid, TASKWDFUNCPRR callback,void *arg); epicsShareFunc void epicsShareAPI taskwdAnyInsert( void *userpvt, TASKWDANYFUNCPRR callback,void *arg); -epicsShareFunc void epicsShareAPI taskwdRemove(threadId tid); +epicsShareFunc void epicsShareAPI taskwdRemove(epicsThreadId tid); epicsShareFunc void epicsShareAPI taskwdAnyRemove(void *userpvt); #ifdef __cplusplus diff --git a/src/libCom/test/Makefile b/src/libCom/test/Makefile index bc55e9cfa..1858928b0 100644 --- a/src/libCom/test/Makefile +++ b/src/libCom/test/Makefile @@ -6,6 +6,11 @@ PROD_LIBS += Com USR_LIBS_hpux += cma + +epicsThreadTestHost_SRCS += epicsThreadTestMain.cpp epicsThreadTest.cpp +PROD += epicsThreadTestHost +OBJS_IOC += epicsThreadTest + timerTestHost_SRCS += timerTestMain.c timerTest.c PROD += timerTestHost OBJS_IOC += timerTest @@ -22,10 +27,6 @@ epicsMutexTestHost_SRCS += epicsMutexTestMain.cpp epicsMutexTest.cpp PROD += epicsMutexTestHost OBJS_IOC += epicsMutexTest -threadTestHost_SRCS += threadTestMain.c threadTest.c -PROD += threadTestHost -OBJS_IOC += threadTest - #fdmgrTest_SRCS += fdmgrTest.c #PROD += fdmgrTest diff --git a/src/libCom/test/epicsEventTest.cpp b/src/libCom/test/epicsEventTest.cpp index b8dd94770..c8020d9b3 100644 --- a/src/libCom/test/epicsEventTest.cpp +++ b/src/libCom/test/epicsEventTest.cpp @@ -16,7 +16,7 @@ of this distribution. #include #include -#include "osiThread.h" +#include "epicsThread.h" #include "epicsEvent.h" #include "epicsMutex.h" #include "epicsRingPointer.h" @@ -30,11 +30,15 @@ typedef struct info { epicsRingPointerId ring; }info; +extern "C" { +static void consumer(void *arg); +} + static void consumer(void *arg) { info *pinfo = (info *)arg; time_t tp; - threadId idSelf = threadGetIdSelf(); + epicsThreadId idSelf = epicsThreadGetIdSelf(); printf("consumer %p starting time %ld\n",idSelf,time(&tp)); while(1) { @@ -50,7 +54,7 @@ static void consumer(void *arg) idSelf,(int)status,time(&tp)); } while(epicsRingPointerGetUsed(pinfo->ring)>=2) { - threadId message[2]; + epicsThreadId message[2]; int i; for(i=0; i<2; i++) { @@ -66,11 +70,15 @@ static void consumer(void *arg) } } +extern "C" { +static void producer(void *arg); +} + static void producer(void *arg) { info *pinfo = (info *)arg; time_t tp; - threadId idSelf = threadGetIdSelf(); + epicsThreadId idSelf = epicsThreadGetIdSelf(); int ntimes=0; printf("producer %p starting time %ld\n",idSelf,time(&tp)); @@ -94,14 +102,14 @@ static void producer(void *arg) for(i=0; i<2; i++) { if(!epicsRingPointerPush(pinfo->ring,idSelf)) printf("producer %p error\n",idSelf); - if(i==0 && (ntimes%4==0)) threadSleep(.1); + if(i==0 && (ntimes%4==0)) epicsThreadSleep(.1); } printf("producer %p sending\n",idSelf); } else { printf("producer %p ring buffer is full\n",idSelf); } epicsMutexUnlock(pinfo->lockRing); - threadSleep(1.0); + epicsThreadSleep(1.0); epicsEventSignal(pinfo->event); } } @@ -109,7 +117,7 @@ static void producer(void *arg) extern "C" void epicsEventTest(int nthreads,int verbose) { unsigned int stackSize; - threadId *id; + epicsThreadId *id; char **name; int i; info *pinfo; @@ -118,7 +126,6 @@ extern "C" void epicsEventTest(int nthreads,int verbose) time_t tp; int errVerboseSave = errVerbose; - threadInit (); errVerbose = verbose; event = epicsEventMustCreate(epicsEventEmpty); printf("calling epicsEventWaitWithTimeout(event,2.0) time %ld\n",time(&tp)); @@ -146,23 +153,23 @@ extern "C" void epicsEventTest(int nthreads,int verbose) pinfo->event = event; pinfo->lockRing = epicsMutexCreate(); pinfo->ring = epicsRingPointerCreate(1024*2); - stackSize = threadGetStackSize(threadStackSmall); - threadCreate("consumer",50,stackSize,consumer,pinfo); - id = (threadId *)calloc(nthreads,sizeof(threadId)); + stackSize = epicsThreadGetStackSize(epicsThreadStackSmall); + epicsThreadCreate("consumer",50,stackSize,consumer,pinfo); + id = (epicsThreadId *)calloc(nthreads,sizeof(epicsThreadId)); name = (char **)calloc(nthreads,sizeof(char *)); for(i=0; iquit = 1; - threadSleep(2.0); + epicsThreadSleep(2.0); epicsEventSignal(pinfo->event); - threadSleep(1.0); + epicsThreadSleep(1.0); printf("semTest returning time %ld\n",time(&tp)); errVerbose = errVerboseSave; } diff --git a/src/libCom/test/epicsEventTestMain.cpp b/src/libCom/test/epicsEventTestMain.cpp index cbedf2d71..f64c2a324 100644 --- a/src/libCom/test/epicsEventTestMain.cpp +++ b/src/libCom/test/epicsEventTestMain.cpp @@ -15,7 +15,7 @@ of this distribution. #include #include -#include "osiThread.h" +#include "epicsThread.h" extern "C" void epicsEventTest(int nthreads,int errVerbose); diff --git a/src/libCom/test/epicsMutexTest.cpp b/src/libCom/test/epicsMutexTest.cpp index f1919d598..f5d718db8 100644 --- a/src/libCom/test/epicsMutexTest.cpp +++ b/src/libCom/test/epicsMutexTest.cpp @@ -16,7 +16,7 @@ of this distribution. #include #include -#include "osiThread.h" +#include "epicsThread.h" #include "epicsMutex.h" #include "errlog.h" @@ -46,16 +46,16 @@ static void mutexThread(void *arg) } printf("mutexThread %d epicsMutexLock time %ld\n", pinfo->threadnum,time(&tp)); - threadSleep(.1); + epicsThreadSleep(.1); epicsMutexUnlock(pinfo->mutex); - threadSleep(.9); + epicsThreadSleep(.9); } } extern "C" void epicsMutexTest(int nthreads,int verbose) { unsigned int stackSize; - threadId *id; + epicsThreadId *id; int i; char **name; void **arg; @@ -65,7 +65,6 @@ extern "C" void epicsMutexTest(int nthreads,int verbose) time_t tp; int errVerboseSave = errVerbose; - threadInit (); errVerbose = verbose; mutex = epicsMutexMustCreate(); printf("calling epicsMutexLock(mutex) time %ld\n",time(&tp)); @@ -90,11 +89,11 @@ extern "C" void epicsMutexTest(int nthreads,int verbose) errVerbose = errVerboseSave; return; } - id = (void **)calloc(nthreads,sizeof(threadId)); + id = (void **)calloc(nthreads,sizeof(epicsThreadId)); name = (char **)calloc(nthreads,sizeof(char *)); arg = (void **)calloc(nthreads,sizeof(void *)); pinfo = (info **)calloc(nthreads,sizeof(info *)); - stackSize = threadGetStackSize(threadStackSmall); + stackSize = epicsThreadGetStackSize(epicsThreadStackSmall); for(i=0; ithreadnum = i; pinfo[i]->mutex = mutex; arg[i] = pinfo[i]; - id[i] = threadCreate(name[i],40,stackSize,(THREADFUNC)mutexThread,arg[i]); + id[i] = epicsThreadCreate(name[i],40,stackSize,(EPICSTHREADFUNC)mutexThread,arg[i]); printf("semTest created mutexThread %d id %p time %ld\n", i, id[i],time(&tp)); } - threadSleep(5.0); + epicsThreadSleep(5.0); printf("semTest setting quit time %ld\n",time(&tp)); for(i=0; iquit = 1; } - threadSleep(2.0); + epicsThreadSleep(2.0); errVerbose = errVerboseSave; } diff --git a/src/libCom/test/epicsMutexTestMain.cpp b/src/libCom/test/epicsMutexTestMain.cpp index ff862ef01..bf145067f 100644 --- a/src/libCom/test/epicsMutexTestMain.cpp +++ b/src/libCom/test/epicsMutexTestMain.cpp @@ -15,7 +15,7 @@ of this distribution. #include #include -#include "osiThread.h" +#include "epicsThread.h" extern "C" void epicsMutexTest(int nthreads,int errVerbose); diff --git a/src/libCom/test/epicsThreadTest.cpp b/src/libCom/test/epicsThreadTest.cpp new file mode 100644 index 000000000..a881f5b62 --- /dev/null +++ b/src/libCom/test/epicsThreadTest.cpp @@ -0,0 +1,88 @@ +/* epicsThreadTest.cpp */ + +/* Author: Marty Kraimer Date: 26JAN2000 */ + +/********************COPYRIGHT NOTIFICATION********************************** +This software was developed under a United States Government license +described on the COPYRIGHT_UniversityOfChicago file included as part +of this distribution. +****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#include "epicsThread.h" +#include "errlog.h" + +static epicsThreadPrivate privateKey; + +class myThread: public epicsThreadRunable { +public: + myThread(int arg,const char *name); + virtual ~myThread(); + virtual void run(); + epicsThread thread; +private: + int *argvalue; +}; + +myThread::myThread(int arg,const char *name) : + thread(*this,name,epicsThreadGetStackSize(epicsThreadStackSmall),50+arg), + argvalue(0) +{ + argvalue = new int; + *argvalue = arg; + thread.start(); +} + +myThread::~myThread() {delete argvalue;} + +void myThread::run() +{ + int myPrivate = *argvalue; + privateKey.set(argvalue); + errlogPrintf("threadFunc %d starting argvalue %p\n",myPrivate,argvalue); + epicsThreadSleep(2.0); + argvalue = privateKey.get(); + errlogPrintf("threadFunc %d stopping argvalue %p\n",myPrivate,argvalue); +} + +extern "C" void threadTest(int ntasks,int verbose) +{ + myThread **papmyThread; + int i; + char **name; + int startPriority,minPriority,maxPriority; + int errVerboseSave = errVerbose; + + errVerbose = verbose; + errlogInit(4096); + papmyThread = (myThread **)calloc(ntasks,sizeof(myThread *)); + name = (char **)calloc(ntasks,sizeof(char **)); + errlogPrintf("threadTest starting\n"); + for(i=0; ithread.getPriority(); + papmyThread[i]->thread.setPriority(epicsThreadPriorityMin); + minPriority = papmyThread[i]->thread.getPriority(); + papmyThread[i]->thread.setPriority(epicsThreadPriorityMax); + maxPriority = papmyThread[i]->thread.getPriority(); + papmyThread[i]->thread.setPriority(50+i); + if(i==0)errlogPrintf("startPriority %d minPriority %d maxPriority %d\n", + startPriority,minPriority,maxPriority); + } + epicsThreadSleep(.1); + epicsThreadShowAll(0); + epicsThreadSleep(5.0); + errlogPrintf("epicsThreadTest returning\n"); + epicsThreadSleep(.5); + errVerbose = errVerboseSave; +} diff --git a/src/libCom/test/threadTestMain.c b/src/libCom/test/epicsThreadTestMain.cpp similarity index 93% rename from src/libCom/test/threadTestMain.c rename to src/libCom/test/epicsThreadTestMain.cpp index 8468e555e..40f964443 100644 --- a/src/libCom/test/threadTestMain.c +++ b/src/libCom/test/epicsThreadTestMain.cpp @@ -15,8 +15,8 @@ of this distribution. #include #include -#include "osiThread.h" -void threadTest(int nthreads,int errVerbose); +#include "epicsThread.h" +extern "C" void threadTest(int nthreads,int errVerbose); int main(int argc,char *argv[]) { diff --git a/src/libCom/test/osiTimeTest.cpp b/src/libCom/test/osiTimeTest.cpp index 6c870f6ca..d22a739a0 100644 --- a/src/libCom/test/osiTimeTest.cpp +++ b/src/libCom/test/osiTimeTest.cpp @@ -3,7 +3,7 @@ #include #include "osiTime.h" -#include "osiThread.h" +#include "epicsThread.h" #include "errlog.h" extern "C" { diff --git a/src/libCom/test/ringPointerTest.c b/src/libCom/test/ringPointerTest.c index 88f2307d5..06f07bd7e 100644 --- a/src/libCom/test/ringPointerTest.c +++ b/src/libCom/test/ringPointerTest.c @@ -16,7 +16,7 @@ of this distribution. #include #include -#include "osiThread.h" +#include "epicsThread.h" #include "epicsRingPointer.h" #include "errlog.h" #include "epicsEvent.h" @@ -62,7 +62,7 @@ void ringPointerTest() if(!consumerEvent) {printf("epicsEventMustCreate failed\n");exit(1);} pinfo->ring = ring = epicsRingPointerCreate(ringSize); if(!ring) {printf("epicsRingPointerCreate failed\n");exit(1);} - threadCreate("consumer",50,threadGetStackSize(threadStackSmall), + epicsThreadCreate("consumer",50,epicsThreadGetStackSize(epicsThreadStackSmall), consumer,pinfo); if(!epicsRingPointerIsEmpty(ring)) printf("epicsRingPointerIsEmpty failed\n"); printf("fill ring\n"); @@ -83,11 +83,11 @@ void ringPointerTest() for(i=0; i #include -#include "osiThread.h" +#include "epicsThread.h" void ringPointerTest(void); diff --git a/src/libCom/test/threadTest.c b/src/libCom/test/threadTest.c deleted file mode 100644 index 9453fc813..000000000 --- a/src/libCom/test/threadTest.c +++ /dev/null @@ -1,83 +0,0 @@ -/* threadTest.c */ - -/* Author: Marty Kraimer Date: 26JAN2000 */ - -/********************COPYRIGHT NOTIFICATION********************************** -This software was developed under a United States Government license -described on the COPYRIGHT_UniversityOfChicago file included as part -of this distribution. -****************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include - -#include "osiThread.h" -#include "errlog.h" - -threadPrivateId privateKey; - -static void threadFunc(void *arg) -{ - int myPrivate; - int argvalue = *(int *)arg; - myPrivate = argvalue; - threadPrivateSet(privateKey,(void *)argvalue); - errlogPrintf("threadFunc %d starting\n",argvalue); - threadSleep(2.0); - argvalue = -1; - argvalue = (int)threadPrivateGet(privateKey); - errlogPrintf("threadFunc %d stopping myPrivate %d\n",argvalue,myPrivate); -} - -void threadTest(int ntasks,int verbose) -{ - unsigned int stackSize; - threadId *id; - int i; - char **name; - void **arg; - int startPriority,minPriority,maxPriority; - int errVerboseSave = errVerbose; - - threadInit (); - errVerbose = verbose; - errlogInit(4096); - id = calloc(ntasks,sizeof(threadId *)); - name = calloc(ntasks,sizeof(char **)); - arg = calloc(ntasks,sizeof(void *)); - errlogPrintf("threadTest starting\n"); - stackSize = threadGetStackSize(threadStackSmall); - errlogPrintf("stackSize %u\n",stackSize); - privateKey = threadPrivateCreate(); - for(i=0; i #include -#include "osiThread.h" +#include "epicsThread.h" #include "osiTimer.h" #include "errlog.h" #include "tsStamp.h" @@ -42,8 +42,7 @@ void timerTest(void) TS_STAMP start; int i; - threadInit (); - timerQueue = osiTimerQueueCreate(threadPriorityLow); + timerQueue = osiTimerQueueCreate(epicsThreadPriorityLow); for(i=0; itimer = osiTimerCreate(&jumpTable,timerQueue,(void *)timer[i]); @@ -52,7 +51,7 @@ void timerTest(void) timer[i]->requestedDiff = (double)i; osiTimerArm(timer[i]->timer,(double)i); } - threadSleep((double)(ntimers + 2)); + epicsThreadSleep((double)(ntimers + 2)); printf("timerTest returning\n"); } diff --git a/src/libCom/timer/osiTimer.cpp b/src/libCom/timer/osiTimer.cpp index 32778fc50..5c390d306 100644 --- a/src/libCom/timer/osiTimer.cpp +++ b/src/libCom/timer/osiTimer.cpp @@ -39,13 +39,17 @@ #include "locationException.h" #include "errlog.h" -class osiTimerThread : public osiThread { +class osiTimerThread : public epicsThreadRunable { public: osiTimerThread (osiTimerQueue &, unsigned priority); + virtual ~osiTimerThread(); private: + friend class osiTimer; + friend class osiTimerQueue; + epicsThread thread; osiTimerQueue &queue; - virtual void entryPoint (); + virtual void run(); }; // @@ -460,7 +464,7 @@ void osiTimerQueue::terminateManagerThread () this->rescheduleEvent.signal (); - while ( ! this->exitFlag && ! this->pMgrThread->isSuspended () ) { + while ( ! this->exitFlag && ! this->pMgrThread->thread.isSuspended () ) { this->exitEvent.wait ( 1.0 ); } @@ -480,16 +484,19 @@ void osiTimerQueue::terminateManagerThread () // osiTimerThread::osiTimerThread () // osiTimerThread::osiTimerThread (osiTimerQueue &queueIn, unsigned priority) : - osiThread ("osiTimerQueue", threadGetStackSize (threadStackMedium), priority), + thread( *this, "osiTimerQueue", + epicsThreadGetStackSize (epicsThreadStackMedium), priority) , queue (queueIn) { - this->start (); + this->thread.start (); } +osiTimerThread::~osiTimerThread() {}; + // -// osiTimerThread::entryPoint () +// osiTimerThread::run () // -void osiTimerThread::entryPoint () +void osiTimerThread::run () { queue.exitFlag = false; while ( ! queue.terminateFlag ) { diff --git a/src/libCom/timer/osiTimer.h b/src/libCom/timer/osiTimer.h index c7daee0e9..8c270f174 100644 --- a/src/libCom/timer/osiTimer.h +++ b/src/libCom/timer/osiTimer.h @@ -32,7 +32,7 @@ #define osiTimerHInclude #include "shareLib.h" /* reset share lib defines */ -#include "osiThread.h" +#include "epicsThread.h" #include "tsStamp.h" #ifdef __cplusplus @@ -183,7 +183,7 @@ public: mtsCreateManagerThread // manager thread expires timers asnychronously }; epicsShareFunc osiTimerQueue ( managerThreadSelect mts, - unsigned managerThreadPriority = threadPriorityMin ); + unsigned managerThreadPriority = epicsThreadPriorityMin ); epicsShareFunc virtual ~osiTimerQueue(); epicsShareFunc double delayToFirstExpire () const; /* returns seconds */ epicsShareFunc void process (); @@ -235,7 +235,7 @@ typedef struct osiTimerJumpTable { }osiTimerJumpTable; typedef void * osiTimerQueueId; -/* see osiThread.h for the range of priorities allowed here */ +/* see epicsThread.h for the range of priorities allowed here */ epicsShareFunc osiTimerQueueId epicsShareAPI osiTimerQueueCreate (unsigned managerThreadPriority); typedef void * osiTimerId; diff --git a/src/makeBaseApp/top/exampleApp/src/caMonitor.c b/src/makeBaseApp/top/exampleApp/src/caMonitor.c index 8008614d5..a6cce1e2e 100644 --- a/src/makeBaseApp/top/exampleApp/src/caMonitor.c +++ b/src/makeBaseApp/top/exampleApp/src/caMonitor.c @@ -7,7 +7,6 @@ #include #include -#include "osiThread.h" #include "tsStamp.h" #include "cadef.h" #include "dbDefs.h" diff --git a/src/makeBaseApp/top/exampleApp/src/exampleMain.c b/src/makeBaseApp/top/exampleApp/src/exampleMain.c index a62b27577..75ebab244 100644 --- a/src/makeBaseApp/top/exampleApp/src/exampleMain.c +++ b/src/makeBaseApp/top/exampleApp/src/exampleMain.c @@ -13,14 +13,14 @@ of this distribution. #include #include -#include "osiThread.h" +#include "epicsThread.h" #include "ioccrf.h" int main(int argc,char *argv[]) { if(argc>=2) { ioccrf(argv[1]); - threadSleep(.2); + epicsThreadSleep(.2); } ioccrf(NULL); return(0); diff --git a/src/misc/iocInit.c b/src/misc/iocInit.c index 0f03afb95..c0bf309f6 100644 --- a/src/misc/iocInit.c +++ b/src/misc/iocInit.c @@ -52,7 +52,7 @@ of this distribution. #include #include "dbDefs.h" -#include "osiThread.h" +#include "epicsThread.h" #include "epicsPrint.h" #include "tsStamp.h" #include "ellLib.h" @@ -121,7 +121,7 @@ int epicsShareAPI iocInit() taskwdInit(); callbackInit(); /* let threads start */ - threadSleep(.1); + epicsThreadSleep(.1); initHooks(initHookAfterCallbackInit); dbCaLinkInit(); initHooks(initHookAfterCaLinkInit); initDrvSup(); initHooks(initHookAfterInitDrvSup); @@ -139,7 +139,7 @@ int epicsShareAPI iocInit() errlogPrintf("iocInit: asInit Failed during initialization\n"); return(-1); } - threadSleep(.5); + epicsThreadSleep(.5); initHooks(initHookAfterScanInit); /* Enable scan tasks and some driver support functions. */ diff --git a/src/rsrv/camsgtask.c b/src/rsrv/camsgtask.c index 40d45b63b..4c1adae0a 100644 --- a/src/rsrv/camsgtask.c +++ b/src/rsrv/camsgtask.c @@ -53,9 +53,9 @@ void camsgtask (struct client *client) int nchars; int status; - client->tid = threadGetIdSelf (); + client->tid = epicsThreadGetIdSelf (); - taskwdInsert (threadGetIdSelf(), NULL, NULL); + taskwdInsert (epicsThreadGetIdSelf(), NULL, NULL); while (TRUE) { client->recv.stk = 0; diff --git a/src/rsrv/caservertask.c b/src/rsrv/caservertask.c index 7731236c2..b0672e35f 100644 --- a/src/rsrv/caservertask.c +++ b/src/rsrv/caservertask.c @@ -231,11 +231,11 @@ struct client *create_client (SOCKET sock) } { - unsigned priorityOfSelf = threadGetPrioritySelf (); - threadBoolStatus tbs; + unsigned priorityOfSelf = epicsThreadGetPrioritySelf (); + epicsThreadBooleanStatus tbs; - tbs = threadLowestPriorityLevelAbove ( priorityOfSelf, &priorityOfEvents ); - if ( tbs != tbsSuccess ) { + tbs = epicsThreadLowestPriorityLevelAbove ( priorityOfSelf, &priorityOfEvents ); + if ( tbs != epicsThreadBooleanStatusSuccess ) { priorityOfEvents = priorityOfSelf; } } @@ -276,17 +276,17 @@ struct client *create_client (SOCKET sock) */ LOCAL int req_server (void) { - unsigned priorityOfSelf = threadGetPrioritySelf (); + unsigned priorityOfSelf = epicsThreadGetPrioritySelf (); unsigned priorityOfUDP; - threadBoolStatus tbs; + epicsThreadBooleanStatus tbs; struct sockaddr_in serverAddr; /* server's address */ osiSocklen_t addrSize; int status; SOCKET clientSock; - threadId tid; + epicsThreadId tid; int portChange; - taskwdInsert ( threadGetIdSelf (), NULL, NULL ); + taskwdInsert ( epicsThreadGetIdSelf (), NULL, NULL ); ca_server_port = envGetInetPortConfigParam (&EPICS_CA_SERVER_PORT, CA_SERVER_PORT); @@ -300,7 +300,7 @@ LOCAL int req_server (void) */ if ( ( IOC_sock = socket(AF_INET, SOCK_STREAM, 0) ) == INVALID_SOCKET ) { errlogPrintf ("CAS: Socket creation error\n"); - threadSuspendSelf (); + epicsThreadSuspendSelf (); } /* @@ -346,7 +346,7 @@ LOCAL int req_server (void) if ( status < 0 ) { errlogPrintf ( "CAS: Socket bind error was \"%s\"\n", SOCKERRSTR (SOCKERRNO) ); - threadSuspendSelf (); + epicsThreadSuspendSelf (); } portChange = 1; } @@ -360,7 +360,7 @@ LOCAL int req_server (void) if ( status ) { errlogPrintf ( "CAS: getsockname() error %s\n", SOCKERRSTR(SOCKERRNO) ); - threadSuspendSelf (); + epicsThreadSuspendSelf (); } ca_server_port = ntohs (serverAddr.sin_port); @@ -378,17 +378,17 @@ LOCAL int req_server (void) if ( listen ( IOC_sock, 10 ) < 0 ) { errlogPrintf ("CAS: Listen error\n"); socket_close (IOC_sock); - threadSuspendSelf (); + epicsThreadSuspendSelf (); } - tbs = threadHighestPriorityLevelBelow ( priorityOfSelf, &priorityOfUDP ); - if ( tbs != tbsSuccess ) { + tbs = epicsThreadHighestPriorityLevelBelow ( priorityOfSelf, &priorityOfUDP ); + if ( tbs != epicsThreadBooleanStatusSuccess ) { priorityOfUDP = priorityOfSelf; } - tid = threadCreate ( "CAS-UDP", priorityOfUDP, - threadGetStackSize (threadStackMedium), - (THREADFUNC) cast_server, 0 ); + tid = epicsThreadCreate ( "CAS-UDP", priorityOfUDP, + epicsThreadGetStackSize (epicsThreadStackMedium), + (EPICSTHREADFUNC) cast_server, 0 ); if ( tid == 0 ) { epicsPrintf ( "CAS: unable to start connection request thread\n" ); } @@ -400,19 +400,19 @@ LOCAL int req_server (void) if ( ( clientSock = accept ( IOC_sock, &sockAddr, &addLen ) ) == INVALID_SOCKET ) { errlogPrintf("CAS: Client accept error was \"%s\"\n", (int) SOCKERRSTR(SOCKERRNO)); - threadSleep(15.0); + epicsThreadSleep(15.0); continue; } else { unsigned priorityOfClient; - threadId id; + epicsThreadId id; struct client *pClient; pClient = create_client (clientSock); if (!pClient) { errlogPrintf ( "CAS: unable to create new client because \"%s\"\n", strerror (errno) ); - threadSleep(15.0); + epicsThreadSleep(15.0); continue; } @@ -420,25 +420,25 @@ LOCAL int req_server (void) * go up two levels in priority so that the event task is above the * task waiting in accept () */ - tbs = threadLowestPriorityLevelAbove ( priorityOfSelf, &priorityOfClient ); - if ( tbs != tbsSuccess ) { + tbs = epicsThreadLowestPriorityLevelAbove ( priorityOfSelf, &priorityOfClient ); + if ( tbs != epicsThreadBooleanStatusSuccess ) { priorityOfClient = priorityOfSelf; } else { unsigned belowPriorityOfClient = priorityOfClient; - tbs = threadLowestPriorityLevelAbove ( belowPriorityOfClient, &priorityOfClient ); - if ( tbs != tbsSuccess ) { + tbs = epicsThreadLowestPriorityLevelAbove ( belowPriorityOfClient, &priorityOfClient ); + if ( tbs != epicsThreadBooleanStatusSuccess ) { priorityOfClient = belowPriorityOfClient; } } - id = threadCreate ( "CAS-client", priorityOfClient, - threadGetStackSize (threadStackBig), - (THREADFUNC)camsgtask, (void *)pClient ); + id = epicsThreadCreate ( "CAS-client", priorityOfClient, + epicsThreadGetStackSize (epicsThreadStackBig), + (EPICSTHREADFUNC)camsgtask, (void *)pClient ); if (id==0) { destroy_client ( pClient ); errlogPrintf ( "CAS: task creation for new client failed\n" ); - threadSleep ( 15.0 ); + epicsThreadSleep ( 15.0 ); continue; } } @@ -450,7 +450,7 @@ LOCAL int req_server (void) */ epicsShareFunc int epicsShareAPI rsrv_init (void) { - threadId tid; + epicsThreadId tid; clientQlock = epicsMutexMustCreate(); @@ -462,10 +462,10 @@ epicsShareFunc int epicsShareAPI rsrv_init (void) prsrv_cast_client = NULL; pCaBucket = NULL; - tid = threadCreate ("CAS-TCP", - threadPriorityChannelAccessServer, - threadGetStackSize(threadStackMedium), - (THREADFUNC)req_server,0); + tid = epicsThreadCreate ("CAS-TCP", + epicsThreadPriorityChannelAccessServer, + epicsThreadGetStackSize(epicsThreadStackMedium), + (EPICSTHREADFUNC)req_server,0); if ( tid == 0 ) { epicsPrintf ( "CAS: unable to start connection request thread\n" ); } diff --git a/src/rsrv/cast_server.c b/src/rsrv/cast_server.c index dcecfbb7d..c4a1cb855 100644 --- a/src/rsrv/cast_server.c +++ b/src/rsrv/cast_server.c @@ -121,9 +121,9 @@ LOCAL void clean_addrq() */ int cast_server(void) { - unsigned priorityOfSelf = threadGetPrioritySelf (); + unsigned priorityOfSelf = epicsThreadGetPrioritySelf (); unsigned priorityOfBeacon; - threadBoolStatus tbs; + epicsThreadBooleanStatus tbs; struct sockaddr_in sin; int status; int count=0; @@ -131,10 +131,10 @@ int cast_server(void) osiSocklen_t recv_addr_size; unsigned short port; int nchars; - threadId tid; + epicsThreadId tid; int flag; - taskwdInsert(threadGetIdSelf(),NULL,NULL); + taskwdInsert(epicsThreadGetIdSelf(),NULL,NULL); port = envGetInetPortConfigParam (&EPICS_CA_SERVER_PORT, CA_SERVER_PORT); @@ -153,7 +153,7 @@ int cast_server(void) if ( ( IOC_cast_sock = socket (AF_INET, SOCK_DGRAM, 0) ) == INVALID_SOCKET ) { epicsPrintf ("CAS: cast socket creation error\n"); - threadSuspendSelf (); + epicsThreadSuspendSelf (); } /* @@ -203,7 +203,7 @@ int cast_server(void) if( bind(IOC_cast_sock, (struct sockaddr *)&sin, sizeof (sin)) < 0){ epicsPrintf ("CAS: UDP server port bind error was \"%s\"\n", SOCKERRSTR ( SOCKERRNO ) ); socket_close (IOC_cast_sock); - threadSuspendSelf (); + epicsThreadSuspendSelf (); } flag = 1; @@ -216,14 +216,14 @@ int cast_server(void) __FILE__, SOCKERRSTR (errnoCpy) ); } - tbs = threadHighestPriorityLevelBelow ( priorityOfSelf, &priorityOfBeacon ); - if ( tbs != tbsSuccess ) { + tbs = epicsThreadHighestPriorityLevelBelow ( priorityOfSelf, &priorityOfBeacon ); + if ( tbs != epicsThreadBooleanStatusSuccess ) { priorityOfBeacon = priorityOfSelf; } - tid = threadCreate ( "CAS-beacon", priorityOfBeacon, - threadGetStackSize (threadStackSmall), - (THREADFUNC) rsrv_online_notify_task, 0 ); + tid = epicsThreadCreate ( "CAS-beacon", priorityOfBeacon, + epicsThreadGetStackSize (epicsThreadStackSmall), + (EPICSTHREADFUNC) rsrv_online_notify_task, 0 ); if ( tid == 0 ) { epicsPrintf ( "CAS: unable to start beacon thread\n" ); } @@ -238,11 +238,11 @@ int cast_server(void) if (prsrv_cast_client) { break; } - threadSleep(300.0); + epicsThreadSleep(300.0); } prsrv_cast_client->sock = IOC_cast_sock; - prsrv_cast_client->tid = threadGetIdSelf (); + prsrv_cast_client->tid = epicsThreadGetIdSelf (); while (TRUE) { status = recvfrom ( @@ -255,7 +255,7 @@ int cast_server(void) if (status<0) { epicsPrintf ("CAS: UDP recv error (errno=%s)\n", SOCKERRSTR(SOCKERRNO)); - threadSleep(1.0); + epicsThreadSleep(1.0); } else { prsrv_cast_client->recv.cnt = (unsigned long) status; diff --git a/src/rsrv/online_notify.c b/src/rsrv/online_notify.c index de8c66b8f..691b3a914 100644 --- a/src/rsrv/online_notify.c +++ b/src/rsrv/online_notify.c @@ -86,7 +86,7 @@ int rsrv_online_notify_task() casSufficentSpaceInPool = osiSufficentSpaceInPool (); - taskwdInsert (threadGetIdSelf(),NULL,NULL); + taskwdInsert (epicsThreadGetIdSelf(),NULL,NULL); longStatus = envGetDoubleConfigParam ( &EPICS_CA_BEACON_PERIOD, &maxPeriod); @@ -108,14 +108,14 @@ int rsrv_online_notify_task() */ if ( (sock = socket (AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET) { errlogPrintf ("CAS: online socket creation error\n"); - threadSuspendSelf (); + epicsThreadSuspendSelf (); } status = setsockopt (sock, SOL_SOCKET, SO_BROADCAST, (char *)&true, sizeof(true)); if (status<0) { errlogPrintf ("CAS: online socket set up error\n"); - threadSuspendSelf (); + epicsThreadSuspendSelf (); } #if 0 @@ -199,7 +199,7 @@ int rsrv_online_notify_task() pNode = (osiSockAddrNode *) pNode->node.next; } - threadSleep(delay); + epicsThreadSleep(delay); if (delaymaxdelay) { diff --git a/src/rsrv/server.h b/src/rsrv/server.h index b114f9c77..805349831 100644 --- a/src/rsrv/server.h +++ b/src/rsrv/server.h @@ -34,7 +34,7 @@ # error suspect that libCom is being exported from rsrv? #endif /* ifdef epicsExportSharedSymbols */ -#include "osiThread.h" +#include "epicsThread.h" #include "epicsMutex.h" #include "epicsEvent.h" #include "bucketLib.h" @@ -109,7 +109,7 @@ struct client { epicsEventId blockSem; /* used whenever the client blocks */ SOCKET sock; int proto; - threadId tid; + epicsThreadId tid; unsigned minor_version_number; char disconnect; /* disconnect detected */ }; diff --git a/src/util/ca_test_main.c b/src/util/ca_test_main.c index 204c0a569..03c7a61e7 100644 --- a/src/util/ca_test_main.c +++ b/src/util/ca_test_main.c @@ -32,12 +32,10 @@ #include "ca_test.h" #include "dbDefs.h" -#include "osiThread.h" int main(int argc, char **argv) { - threadInit (); /* * print error and return if arguments are invalid */