From 1910478297f7565d291a95d632eebe01e383438d Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Fri, 14 Nov 2025 19:52:21 -0800 Subject: [PATCH] Ensure pthreadInfo->tid initialized for both creator and new thread --- modules/libcom/src/osi/os/posix/osdThread.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/modules/libcom/src/osi/os/posix/osdThread.c b/modules/libcom/src/osi/os/posix/osdThread.c index 42f94b73b..82e143ccd 100644 --- a/modules/libcom/src/osi/os/posix/osdThread.c +++ b/modules/libcom/src/osi/os/posix/osdThread.c @@ -425,6 +425,10 @@ static void * start_routine(void *arg) int status; sigset_t blockAllSig; + // concurrently written from creator thread with same value + pthreadInfo->tid = pthread_self(); + epicsAtomicWriteMemoryBarrier(); + sigfillset(&blockAllSig); pthread_sigmask(SIG_SETMASK,&blockAllSig,NULL); status = pthread_setspecific(getpthreadInfo,arg); @@ -624,9 +628,15 @@ epicsThreadCreateOpt(const char * name, epicsAtomicIncrIntT(&pthreadInfo->refcnt); } - status = pthread_create(&pthreadInfo->tid, &pthreadInfo->attr, + + pthread_t new_tid; + status = pthread_create(&new_tid, &pthreadInfo->attr, start_routine, pthreadInfo); + // pthreadInfo->tid concurrently written with same value by new thread + pthreadInfo->tid = new_tid; + epicsAtomicWriteMemoryBarrier(); + free_threadInfo(pthreadInfo); // dispose of temp ref /* On success, pthreadInfo treat as invalid after this point. * (eg. very short lived thread which self-joins) @@ -653,9 +663,13 @@ epicsThreadCreateOpt(const char * name, } pthreadInfo->isEpicsThread = 1; - status = pthread_create(&pthreadInfo->tid, &pthreadInfo->attr, + status = pthread_create(&new_tid, &pthreadInfo->attr, start_routine, pthreadInfo); + // pthreadInfo->tid concurrently written with same value by new thread + pthreadInfo->tid = new_tid; + epicsAtomicWriteMemoryBarrier(); + free_threadInfo(pthreadInfo); // dispose of temp ref } checkStatusOnce(status, "pthread_create");