libCom/osi: Add default start hook for _main_ thread
This commit is contained in:
@@ -103,7 +103,7 @@ epicsShareFunc void epicsShareAPI epicsThreadShow(
|
||||
|
||||
/* Hooks called when a thread starts, map function called once for every thread */
|
||||
typedef void (*EPICS_THREAD_HOOK_ROUTINE)(epicsThreadId id);
|
||||
epicsShareFunc void epicsThreadHooksInit(void);
|
||||
epicsShareFunc void epicsThreadHooksInit(epicsThreadId id);
|
||||
epicsShareFunc void epicsThreadAddStartHook(EPICS_THREAD_HOOK_ROUTINE hook);
|
||||
epicsShareFunc void epicsThreadMap(EPICS_THREAD_HOOK_ROUTINE func);
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include "epicsThread.h"
|
||||
|
||||
epicsShareExtern EPICS_THREAD_HOOK_ROUTINE epicsThreadDefaultStartHook;
|
||||
epicsShareExtern EPICS_THREAD_HOOK_ROUTINE epicsThreadMainStartHook;
|
||||
|
||||
void epicsThreadShowInfo(epicsThreadOSD *pthreadInfo, unsigned int level)
|
||||
{
|
||||
@@ -62,3 +63,4 @@ static void thread_hook(epicsThreadOSD *pthreadInfo)
|
||||
}
|
||||
|
||||
EPICS_THREAD_HOOK_ROUTINE epicsThreadDefaultStartHook = thread_hook;
|
||||
EPICS_THREAD_HOOK_ROUTINE epicsThreadMainStartHook = thread_hook;
|
||||
|
||||
@@ -238,7 +238,7 @@ epicsThreadInit (void)
|
||||
taskVarMutex = epicsMutexMustCreate ();
|
||||
rtems_task_ident (RTEMS_SELF, 0, &tid);
|
||||
setThreadInfo (tid, "_main_", NULL, NULL);
|
||||
epicsThreadHooksInit();
|
||||
epicsThreadHooksInit(tid);
|
||||
initialized = 1;
|
||||
epicsThreadCreate ("ImsgDaemon", 99,
|
||||
epicsThreadGetStackSize (epicsThreadStackSmall),
|
||||
|
||||
@@ -228,7 +228,7 @@ static win32ThreadGlobal * fetchWin32ThreadGlobal ( void )
|
||||
pWin32ThreadGlobal = 0;
|
||||
return 0;
|
||||
}
|
||||
epicsThreadHooksInit ();
|
||||
epicsThreadHooksInit (NULL);
|
||||
|
||||
InterlockedExchange ( & initCompleted, 1 );
|
||||
|
||||
|
||||
@@ -13,5 +13,7 @@
|
||||
#include "shareLib.h"
|
||||
|
||||
epicsShareExtern EPICS_THREAD_HOOK_ROUTINE epicsThreadDefaultStartHook;
|
||||
epicsShareExtern EPICS_THREAD_HOOK_ROUTINE epicsThreadMainStartHook;
|
||||
|
||||
EPICS_THREAD_HOOK_ROUTINE epicsThreadDefaultStartHook;
|
||||
EPICS_THREAD_HOOK_ROUTINE epicsThreadMainStartHook;
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
epicsShareFunc void epicsThreadRunStartHooks(epicsThreadId id);
|
||||
epicsShareExtern EPICS_THREAD_HOOK_ROUTINE epicsThreadDefaultStartHook;
|
||||
epicsShareExtern EPICS_THREAD_HOOK_ROUTINE epicsThreadMainStartHook;
|
||||
|
||||
#define checkStatusOnceReturn(status, message, method) \
|
||||
if((status)) { \
|
||||
@@ -50,12 +51,13 @@ epicsShareFunc void epicsThreadAddStartHook(EPICS_THREAD_HOOK_ROUTINE hook)
|
||||
epicsMutexUnlock(hookLock);
|
||||
}
|
||||
|
||||
epicsShareFunc void epicsThreadHooksInit(void)
|
||||
epicsShareFunc void epicsThreadHooksInit(epicsThreadId id)
|
||||
{
|
||||
if (!hookLock) {
|
||||
hookLock = epicsMutexMustCreate();
|
||||
if (epicsThreadDefaultStartHook) epicsThreadAddStartHook(epicsThreadDefaultStartHook);
|
||||
}
|
||||
if (id && epicsThreadMainStartHook) epicsThreadMainStartHook(id);
|
||||
}
|
||||
|
||||
epicsShareFunc void epicsThreadRunStartHooks(epicsThreadId id)
|
||||
|
||||
@@ -354,7 +354,7 @@ static void once(void)
|
||||
checkStatusQuit(status,"pthread_mutex_unlock","epicsThreadInit");
|
||||
status = atexit(epicsExitCallAtExits);
|
||||
checkStatusOnce(status,"atexit");
|
||||
epicsThreadHooksInit();
|
||||
epicsThreadHooksInit(pthreadInfo);
|
||||
epicsThreadOnceCalled = 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -17,6 +17,12 @@
|
||||
#include "epicsEvent.h"
|
||||
#include "epicsThread.h"
|
||||
|
||||
epicsShareExtern EPICS_THREAD_HOOK_ROUTINE epicsThreadDefaultStartHook;
|
||||
epicsShareExtern EPICS_THREAD_HOOK_ROUTINE epicsThreadMainStartHook;
|
||||
|
||||
EPICS_THREAD_HOOK_ROUTINE epicsThreadDefaultStartHook;
|
||||
EPICS_THREAD_HOOK_ROUTINE epicsThreadMainStartHook;
|
||||
|
||||
void epicsThreadShowInfo(epicsThreadOSD *pthreadInfo, unsigned int level)
|
||||
{
|
||||
if(!pthreadInfo) {
|
||||
|
||||
@@ -105,7 +105,7 @@ static void epicsThreadInit(void)
|
||||
static int lock = 0;
|
||||
|
||||
while(!vxTas(&lock)) taskDelay(1);
|
||||
epicsThreadHooksInit();
|
||||
epicsThreadHooksInit(NULL);
|
||||
mutexInit(epicsThreadOnceMutex);
|
||||
mutexInit(epicsThreadListMutex);
|
||||
taskIdList = calloc(ID_LIST_CHUNK, sizeof(int));
|
||||
|
||||
Reference in New Issue
Block a user