epicsThreadIsOkToBlock epicsThreadSetOkToBlock only for calling thread

This commit is contained in:
Marty Kraimer
2004-07-13 14:49:18 +00:00
parent f54d1ca30a
commit 629b14d3d4
5 changed files with 35 additions and 90 deletions

View File

@@ -240,7 +240,7 @@ const char *epicsThread::getNameSelf ()
return epicsThreadGetNameSelf ();
}
bool epicsThread::isOkToBlock ()
bool epicsThread::isOkToBlock ()
{
return static_cast<int>(epicsThreadIsOkToBlock());
}
@@ -250,3 +250,37 @@ void epicsThread::setOkToBlock(bool isOkToBlock)
epicsThreadSetOkToBlock(static_cast<int>(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"

View File

@@ -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, &note);
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, &note);
if (sc == RTEMS_SUCCESSFUL) {
v = (void *)note;
v->okToBlock = isOkToBlock;
}
taskVarUnlock ();
}
/*
* Ensure func() is run only once.
*/

View File

@@ -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 ()
*/

View File

@@ -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);

View File

@@ -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);