libCom/osi: Add default start hook for _main_ thread

This commit is contained in:
Ralph Lange
2012-07-03 15:27:50 +02:00
parent 7b47cad8e4
commit 137283ec0b
9 changed files with 18 additions and 6 deletions

View File

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

View File

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

View File

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

View File

@@ -228,7 +228,7 @@ static win32ThreadGlobal * fetchWin32ThreadGlobal ( void )
pWin32ThreadGlobal = 0;
return 0;
}
epicsThreadHooksInit ();
epicsThreadHooksInit (NULL);
InterlockedExchange ( & initCompleted, 1 );

View File

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

View File

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

View File

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

View File

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

View File

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