From 46fa31020ed4c5d3e4055eb63e4e34ecd341ba0c Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Mon, 9 Mar 2020 09:02:31 -0700 Subject: [PATCH] Com: (WIN32) fix handling of thread joinable flag and refcnt Analogous changes for windows cf. 02a24a144d0c062311212c769926c1e2df5a1a52 --- modules/libcom/src/osi/os/WIN32/osdThread.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/modules/libcom/src/osi/os/WIN32/osdThread.c b/modules/libcom/src/osi/os/WIN32/osdThread.c index 5b498a7ea..455d97b64 100644 --- a/modules/libcom/src/osi/os/WIN32/osdThread.c +++ b/modules/libcom/src/osi/os/WIN32/osdThread.c @@ -54,7 +54,7 @@ typedef struct epicsThreadOSD { DWORD id; unsigned epicsPriority; char isSuspended; - char joinable; + int joinable; } win32ThreadParam; typedef struct epicsThreadPrivateOSD { @@ -577,6 +577,10 @@ epicsThreadId epicsThreadCreateOpt ( pParmWIN32->funptr = pFunc; pParmWIN32->parm = pParm; pParmWIN32->epicsPriority = opts->priority; + if(opts->joinable) { + pParmWIN32->joinable = 1; + epicsAtomicIncrIntT(&pParmWIN32->refcnt); + } { unsigned threadId; @@ -615,11 +619,6 @@ epicsThreadId epicsThreadCreateOpt ( return NULL; } - if(opts->joinable) { - pParmWIN32->joinable = 1; - epicsAtomicIncrIntT(&pParmWIN32->refcnt); - } - return ( epicsThreadId ) pParmWIN32; } @@ -629,7 +628,7 @@ void epicsThreadMustJoin(epicsThreadId id) if(!id) { /* no-op */ - } else if(!pParmWIN32->joinable) { + } else if(epicsAtomicCmpAndSwapIntT(&id->joinable, 1, 0)!=1) { if(epicsThreadGetIdSelf()==id) { fprintf(stderr, "Warning: %s thread self-join of unjoinable\n", pParmWIN32->pName); @@ -640,7 +639,6 @@ void epicsThreadMustJoin(epicsThreadId id) */ cantProceed("Error: %s thread not joinable.\n", pParmWIN32->pName); } - return; } else if(epicsThreadGetIdSelf() != id) { DWORD status = WaitForSingleObject(pParmWIN32->handle, INFINITE); @@ -648,11 +646,9 @@ void epicsThreadMustJoin(epicsThreadId id) /* TODO: signal error? */ } - pParmWIN32->joinable = 0; epicsParmCleanupWIN32(pParmWIN32); } else { /* join self silently does nothing */ - pParmWIN32->joinable = 0; epicsParmCleanupWIN32(pParmWIN32); } }