From 629b14d3d4139902e60b3757e6f6dd32a0e9c71a Mon Sep 17 00:00:00 2001 From: Marty Kraimer Date: Tue, 13 Jul 2004 14:49:18 +0000 Subject: [PATCH] epicsThreadIsOkToBlock epicsThreadSetOkToBlock only for calling thread --- src/libCom/osi/epicsThread.cpp | 36 ++++++++++++++++++++++++- src/libCom/osi/os/RTEMS/osdThread.c | 39 --------------------------- src/libCom/osi/os/WIN32/osdThread.c | 23 ---------------- src/libCom/osi/os/posix/osdThread.c | 12 --------- src/libCom/osi/os/vxWorks/osdThread.c | 15 ----------- 5 files changed, 35 insertions(+), 90 deletions(-) diff --git a/src/libCom/osi/epicsThread.cpp b/src/libCom/osi/epicsThread.cpp index b6d48bd72..09f731002 100644 --- a/src/libCom/osi/epicsThread.cpp +++ b/src/libCom/osi/epicsThread.cpp @@ -240,7 +240,7 @@ const char *epicsThread::getNameSelf () return epicsThreadGetNameSelf (); } -bool epicsThread::isOkToBlock () +bool epicsThread::isOkToBlock () { return static_cast(epicsThreadIsOkToBlock()); } @@ -250,3 +250,37 @@ void epicsThread::setOkToBlock(bool isOkToBlock) epicsThreadSetOkToBlock(static_cast(isOkToBlock)); } +extern "C" { + static epicsThreadOnceId okToBlockOnce = EPICS_THREAD_ONCE_INIT; + epicsThreadPrivateId okToBlockPrivate; + typedef struct okToBlockStruct okToBlockStruct; + struct okToBlockStruct { + int okToBlock; + }; + static okToBlockStruct okToBlockNo = {0}; + static okToBlockStruct okToBlockYes = {1}; + + static void epicsThreadOnceIdInit(void *) + { + okToBlockPrivate = epicsThreadPrivateCreate(); + } + + + int epicsShareAPI epicsThreadIsOkToBlock(void) + { + okToBlockStruct *pokToBlock; + void *arg = 0; + epicsThreadOnce(&okToBlockOnce,epicsThreadOnceIdInit,arg); + pokToBlock = (okToBlockStruct*)epicsThreadPrivateGet(okToBlockPrivate); + return (pokToBlock ? pokToBlock->okToBlock : 0); + } + + void epicsShareAPI epicsThreadSetOkToBlock(int isOkToBlock) + { + okToBlockStruct *pokToBlock; + void *arg = 0; + epicsThreadOnce(&okToBlockOnce,epicsThreadOnceIdInit,arg); + pokToBlock = (isOkToBlock) ? &okToBlockYes : &okToBlockNo; + epicsThreadPrivateSet(okToBlockPrivate,pokToBlock); + } +} // extern "C" diff --git a/src/libCom/osi/os/RTEMS/osdThread.c b/src/libCom/osi/os/RTEMS/osdThread.c index a2a31a698..7f0264f4a 100644 --- a/src/libCom/osi/os/RTEMS/osdThread.c +++ b/src/libCom/osi/os/RTEMS/osdThread.c @@ -48,7 +48,6 @@ struct taskVar { void *parm; unsigned int threadVariableCapacity; void **threadVariables; - int okToBlock; }; static epicsMutexId taskVarMutex; static struct taskVar *taskVarHead; @@ -214,7 +213,6 @@ setThreadInfo (rtems_id tid, const char *name, EPICSTHREADFUNC funptr,void *parm v->parm = parm; v->threadVariableCapacity = 0; v->threadVariables = NULL; - v->okToBlock = 0; note = (rtems_unsigned32)v; rtems_task_set_note (tid, RTEMS_NOTEPAD_TASKVAR, note); taskVarLock (); @@ -454,43 +452,6 @@ epicsThreadId epicsThreadGetId (const char *name) return (epicsThreadId)tid; } -int epicsThreadIsOkToBlock (void) -{ - rtems_id tid = (rtems_id)epicsThreadGetIdSelf(); - rtems_status_code sc; - rtems_unsigned32 note; - struct taskVar *v; - int okToBlock; - - taskVarLock (); - sc = rtems_task_get_note (tid, RTEMS_NOTEPAD_TASKVAR, ¬e); - if (sc == RTEMS_SUCCESSFUL) { - v = (void *)note; - okToBlock = v->okToBlock; - } - else { - okToBlock = 0; - } - taskVarUnlock (); - return okToBlock; -} - -void epicsThreadSetOkToBlock (int isOkToBlock) -{ - rtems_id tid = (rtems_id)epicsThreadGetIdSelf(); - rtems_status_code sc; - rtems_unsigned32 note; - struct taskVar *v; - - taskVarLock (); - sc = rtems_task_get_note (tid, RTEMS_NOTEPAD_TASKVAR, ¬e); - if (sc == RTEMS_SUCCESSFUL) { - v = (void *)note; - v->okToBlock = isOkToBlock; - } - taskVarUnlock (); -} - /* * Ensure func() is run only once. */ diff --git a/src/libCom/osi/os/WIN32/osdThread.c b/src/libCom/osi/os/WIN32/osdThread.c index 711fa45d6..edea368b0 100644 --- a/src/libCom/osi/os/WIN32/osdThread.c +++ b/src/libCom/osi/os/WIN32/osdThread.c @@ -52,7 +52,6 @@ typedef struct win32ThreadParam { DWORD id; unsigned epicsPriority; char isSuspended; - int isOkToBlock; } win32ThreadParam; typedef struct epicsThreadPrivateOSD { @@ -845,28 +844,6 @@ epicsShareFunc void epicsShareAPI epicsThreadGetName ( } } -/* - * epicsThreadIsOkToBlock () - */ -epicsShareFunc int epicsShareAPI epicsThreadIsOkToBlock (void); -{ - epicsThreadId id = epicsThreadGetIdSelf(); - win32ThreadParam *pParm = ( win32ThreadParam * ) id; - - return pParm->isOkToBlock; -} - -/* - * epicsThreadSetOkToBlock () - */ -epicsShareFunc int epicsShareAPI epicsThreadSetOkToBlock ( int isOkToBlock) -{ - epicsThreadId id = epicsThreadGetIdSelf(); - win32ThreadParam *pParm = ( win32ThreadParam * ) id; - - pParm->isOkToBlock = isOkToBlock; -} - /* * epics_GetThreadPriorityAsString () */ diff --git a/src/libCom/osi/os/posix/osdThread.c b/src/libCom/osi/os/posix/osdThread.c index 93cbb31f7..543249a80 100644 --- a/src/libCom/osi/os/posix/osdThread.c +++ b/src/libCom/osi/os/posix/osdThread.c @@ -55,7 +55,6 @@ typedef struct epicsThreadOSD { int isSuspended; unsigned int osiPriority; char *name; - int isOkToBlock; } epicsThreadOSD; static pthread_key_t getpthreadInfo; @@ -583,17 +582,6 @@ const char *epicsThreadGetNameSelf() return(pthreadInfo->name); } -int epicsThreadIsOkToBlock(void) -{ - epicsThreadId pthreadInfo = epicsThreadGetIdSelf(); - return pthreadInfo->isOkToBlock; -} - -void epicsThreadSetOkToBlock(int isOkToBlock) { - epicsThreadId pthreadInfo = epicsThreadGetIdSelf(); - pthreadInfo->isOkToBlock = isOkToBlock; -} - void epicsThreadGetName(epicsThreadId pthreadInfo, char *name, size_t size) { assert(epicsThreadOnceCalled); diff --git a/src/libCom/osi/os/vxWorks/osdThread.c b/src/libCom/osi/os/vxWorks/osdThread.c index 3b11d4d69..5ab6c8eb6 100644 --- a/src/libCom/osi/os/vxWorks/osdThread.c +++ b/src/libCom/osi/os/vxWorks/osdThread.c @@ -40,8 +40,6 @@ static const unsigned stackSizeTable[epicsThreadStackBig+1] = {4000*ARCH_STACK_FACTOR, 6000*ARCH_STACK_FACTOR, 11000*ARCH_STACK_FACTOR}; -/*tasVar for isOkToBlock*/ -int isOkToBlock; /* definitions for implementation of epicsThreadPrivate */ static void **papTSD = 0; @@ -128,7 +126,6 @@ static void createFunction(EPICSTHREADFUNC func, void *parm) (*func)(parm); free(papTSD); taskVarDelete(tid,(int *)&papTSD); - taskVarDelete(tid,&isOkToBlock); } epicsThreadId epicsThreadCreate(const char *name, @@ -149,8 +146,6 @@ epicsThreadId epicsThreadCreate(const char *name, errlogPrintf("epicsThreadCreate taskSpawn failure for %s\n",name); return(0); } - taskVarAdd(tid,&isOkToBlock); - taskVarSet(tid,&isOkToBlock,0); return((epicsThreadId)tid); } @@ -276,16 +271,6 @@ void epicsThreadGetName (epicsThreadId id, char *name, size_t size) name[size-1] = '\0'; } -int epicsThreadIsOkToBlock(void) -{ - return taskVarGet(taskIdSelf(),&isOkToBlock); -} - -void epicsThreadSetOkToBlock(int yesNo) -{ - taskVarSet(taskIdSelf(),&isOkToBlock,yesNo); -} - void epicsThreadShowAll(unsigned int level) { taskShow(0,2);