From 137283ec0b70f175ac9c7b7ff37202974296e96f Mon Sep 17 00:00:00 2001 From: Ralph Lange Date: Tue, 3 Jul 2012 15:27:50 +0200 Subject: [PATCH] libCom/osi: Add default start hook for _main_ thread --- src/libCom/osi/epicsThread.h | 2 +- src/libCom/osi/os/Linux/osdThreadExtra.c | 2 ++ src/libCom/osi/os/RTEMS/osdThread.c | 2 +- src/libCom/osi/os/WIN32/osdThread.c | 2 +- src/libCom/osi/os/default/osdThreadExtra.c | 2 ++ src/libCom/osi/os/default/osdThreadHooks.c | 4 +++- src/libCom/osi/os/posix/osdThread.c | 2 +- src/libCom/osi/os/posix/osdThreadExtra.c | 6 ++++++ src/libCom/osi/os/vxWorks/osdThread.c | 2 +- 9 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/libCom/osi/epicsThread.h b/src/libCom/osi/epicsThread.h index a94bd9c3b..23457a0af 100644 --- a/src/libCom/osi/epicsThread.h +++ b/src/libCom/osi/epicsThread.h @@ -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); diff --git a/src/libCom/osi/os/Linux/osdThreadExtra.c b/src/libCom/osi/os/Linux/osdThreadExtra.c index 61a0ef2bd..13a3b5df7 100644 --- a/src/libCom/osi/os/Linux/osdThreadExtra.c +++ b/src/libCom/osi/os/Linux/osdThreadExtra.c @@ -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; diff --git a/src/libCom/osi/os/RTEMS/osdThread.c b/src/libCom/osi/os/RTEMS/osdThread.c index 70a014539..f3871bc43 100644 --- a/src/libCom/osi/os/RTEMS/osdThread.c +++ b/src/libCom/osi/os/RTEMS/osdThread.c @@ -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), diff --git a/src/libCom/osi/os/WIN32/osdThread.c b/src/libCom/osi/os/WIN32/osdThread.c index e9c573731..30c72a10f 100644 --- a/src/libCom/osi/os/WIN32/osdThread.c +++ b/src/libCom/osi/os/WIN32/osdThread.c @@ -228,7 +228,7 @@ static win32ThreadGlobal * fetchWin32ThreadGlobal ( void ) pWin32ThreadGlobal = 0; return 0; } - epicsThreadHooksInit (); + epicsThreadHooksInit (NULL); InterlockedExchange ( & initCompleted, 1 ); diff --git a/src/libCom/osi/os/default/osdThreadExtra.c b/src/libCom/osi/os/default/osdThreadExtra.c index 311db013d..a63ab910f 100644 --- a/src/libCom/osi/os/default/osdThreadExtra.c +++ b/src/libCom/osi/os/default/osdThreadExtra.c @@ -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; diff --git a/src/libCom/osi/os/default/osdThreadHooks.c b/src/libCom/osi/os/default/osdThreadHooks.c index 86f0113dd..3fb1e159d 100644 --- a/src/libCom/osi/os/default/osdThreadHooks.c +++ b/src/libCom/osi/os/default/osdThreadHooks.c @@ -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) diff --git a/src/libCom/osi/os/posix/osdThread.c b/src/libCom/osi/os/posix/osdThread.c index 6eac4f8b8..f0926d230 100644 --- a/src/libCom/osi/os/posix/osdThread.c +++ b/src/libCom/osi/os/posix/osdThread.c @@ -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; } diff --git a/src/libCom/osi/os/posix/osdThreadExtra.c b/src/libCom/osi/os/posix/osdThreadExtra.c index 9df3485af..8d4338e31 100644 --- a/src/libCom/osi/os/posix/osdThreadExtra.c +++ b/src/libCom/osi/os/posix/osdThreadExtra.c @@ -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) { diff --git a/src/libCom/osi/os/vxWorks/osdThread.c b/src/libCom/osi/os/vxWorks/osdThread.c index 7953c03ef..9a9eea5d2 100644 --- a/src/libCom/osi/os/vxWorks/osdThread.c +++ b/src/libCom/osi/os/vxWorks/osdThread.c @@ -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));