diff --git a/src/libCom/osi/epicsThread.h b/src/libCom/osi/epicsThread.h index fa0a6bd70..6e6c30970 100644 --- a/src/libCom/osi/epicsThread.h +++ b/src/libCom/osi/epicsThread.h @@ -101,6 +101,16 @@ epicsShareFunc void epicsShareAPI epicsThreadShowAll(unsigned int level); epicsShareFunc void epicsShareAPI epicsThreadShow( epicsThreadId id,unsigned int level); +/* Hooks being called when a thread starts or exits */ +typedef void (*EPICS_THREAD_HOOK_ROUTINE)(epicsThreadId id); +epicsShareFunc void epicsShareAPI epicsThreadHooksInit(void); +epicsShareFunc void epicsShareAPI epicsThreadAddStartHook(EPICS_THREAD_HOOK_ROUTINE hook); +epicsShareFunc void epicsShareAPI epicsThreadAddExitHook(EPICS_THREAD_HOOK_ROUTINE hook); +epicsShareFunc void epicsShareAPI epicsThreadRunStartHooks(epicsThreadId id); +epicsShareFunc void epicsShareAPI epicsThreadRunExitHooks(epicsThreadId id); +epicsShareExtern EPICS_THREAD_HOOK_ROUTINE epicsThreadDefaultStartHook; +epicsShareExtern EPICS_THREAD_HOOK_ROUTINE epicsThreadDefaultExitHook; + typedef struct epicsThreadPrivateOSD * epicsThreadPrivateId; epicsShareFunc epicsThreadPrivateId epicsShareAPI epicsThreadPrivateCreate(void); epicsShareFunc void epicsShareAPI epicsThreadPrivateDelete(epicsThreadPrivateId id); diff --git a/src/libCom/osi/os/Linux/osdThread.h b/src/libCom/osi/os/Linux/osdThread.h index 52637b16f..ebdd47659 100644 --- a/src/libCom/osi/os/Linux/osdThread.h +++ b/src/libCom/osi/os/Linux/osdThread.h @@ -37,16 +37,6 @@ typedef struct epicsThreadOSD { char name[1]; /* actually larger */ } epicsThreadOSD; -/* Hooks being called when a thread starts or exits */ -typedef void (*EPICS_THREAD_HOOK_ROUTINE)(epicsThreadOSD *pthreadInfo); -epicsShareFunc void epicsThreadHooksInit(); -epicsShareFunc void epicsThreadAddStartHook(EPICS_THREAD_HOOK_ROUTINE hook); -epicsShareFunc void epicsThreadAddExitHook(EPICS_THREAD_HOOK_ROUTINE hook); -epicsShareFunc void epicsThreadRunStartHooks(epicsThreadOSD *pthreadInfo); -epicsShareFunc void epicsThreadRunExitHooks(epicsThreadOSD *pthreadInfo); -epicsShareExtern EPICS_THREAD_HOOK_ROUTINE epicsThreadDefaultStartHook; -epicsShareExtern EPICS_THREAD_HOOK_ROUTINE epicsThreadDefaultExitHook; - epicsShareFunc pthread_t epicsShareAPI epicsThreadGetPosixThreadId(epicsThreadId id); epicsShareFunc void epicsShowThreadInfo(epicsThreadOSD *pthreadInfo, unsigned int level); diff --git a/src/libCom/osi/os/default/osdThreadHooks.c b/src/libCom/osi/os/default/osdThreadHooks.c index b553cc160..52f42b5ad 100644 --- a/src/libCom/osi/os/default/osdThreadHooks.c +++ b/src/libCom/osi/os/default/osdThreadHooks.c @@ -30,8 +30,8 @@ typedef struct epicsThreadHook { EPICS_THREAD_HOOK_ROUTINE func; } epicsThreadHook; -static ELLLIST startHooks; -static ELLLIST exitHooks; +static ELLLIST startHooks = ELLLIST_INIT; +static ELLLIST exitHooks = ELLLIST_INIT; static epicsMutexId hookLock; static void addHook (ELLLIST *list, EPICS_THREAD_HOOK_ROUTINE func) @@ -46,13 +46,13 @@ static void addHook (ELLLIST *list, EPICS_THREAD_HOOK_ROUTINE func) epicsMutexUnlock(hookLock); } -static void runHooks (ELLLIST *list, epicsThreadOSD *pthreadInfo) { +static void runHooks (ELLLIST *list, epicsThreadId id) { epicsThreadHook *pHook; /* As we're only ever inserting hooks at the head of the list, forward traversing is safe */ pHook = (epicsThreadHook *) ellFirst(list); while (pHook) { - pHook->func(pthreadInfo); + pHook->func(id); pHook = (epicsThreadHook *) ellNext(&pHook->node); } } @@ -67,21 +67,19 @@ void epicsThreadAddExitHook(EPICS_THREAD_HOOK_ROUTINE func) addHook(&exitHooks, func); } -void epicsThreadHooksInit() +void epicsThreadHooksInit(void) { hookLock = epicsMutexMustCreate(); - ellInit(&startHooks); - ellInit(&exitHooks); if (epicsThreadDefaultStartHook) epicsThreadAddStartHook(epicsThreadDefaultStartHook); if (epicsThreadDefaultExitHook) epicsThreadAddExitHook(epicsThreadDefaultExitHook); } -void epicsThreadRunStartHooks(epicsThreadOSD *pthreadInfo) +void epicsThreadRunStartHooks(epicsThreadId id) { - runHooks(&startHooks, pthreadInfo); + runHooks(&startHooks, id); } -void epicsThreadRunExitHooks(epicsThreadOSD *pthreadInfo) +void epicsThreadRunExitHooks(epicsThreadId id) { - runHooks(&exitHooks, pthreadInfo); + runHooks(&exitHooks, id); } diff --git a/src/libCom/osi/os/posix/osdThread.h b/src/libCom/osi/os/posix/osdThread.h index 6ce223e6e..0885f9410 100644 --- a/src/libCom/osi/os/posix/osdThread.h +++ b/src/libCom/osi/os/posix/osdThread.h @@ -36,16 +36,6 @@ typedef struct epicsThreadOSD { char name[1]; /* actually larger */ } epicsThreadOSD; -/* Hooks being called when a thread starts or exits */ -typedef void (*EPICS_THREAD_HOOK_ROUTINE)(epicsThreadOSD *pthreadInfo); -epicsShareFunc void epicsThreadHooksInit(); -epicsShareFunc void epicsThreadAddStartHook(EPICS_THREAD_HOOK_ROUTINE hook); -epicsShareFunc void epicsThreadAddExitHook(EPICS_THREAD_HOOK_ROUTINE hook); -epicsShareFunc void epicsThreadRunStartHooks(epicsThreadOSD *pthreadInfo); -epicsShareFunc void epicsThreadRunExitHooks(epicsThreadOSD *pthreadInfo); -epicsShareExtern EPICS_THREAD_HOOK_ROUTINE epicsThreadDefaultStartHook; -epicsShareExtern EPICS_THREAD_HOOK_ROUTINE epicsThreadDefaultExitHook; - epicsShareFunc pthread_t epicsShareAPI epicsThreadGetPosixThreadId(epicsThreadId id); epicsShareFunc void epicsShowThreadInfo(epicsThreadOSD *pthreadInfo, unsigned int level);