diff --git a/src/libCom/misc/epicsExit.c b/src/libCom/misc/epicsExit.c index 0fbed224b..3de8bc6b2 100644 --- a/src/libCom/misc/epicsExit.c +++ b/src/libCom/misc/epicsExit.c @@ -29,6 +29,7 @@ #define epicsExportSharedSymbols #include "ellLib.h" +#include "errlog.h" #include "epicsThread.h" #include "epicsMutex.h" #include "cantProceed.h" @@ -48,10 +49,13 @@ typedef struct exitPvt { int atExitDebug = 0; static epicsThreadOnceId exitPvtOnce = EPICS_THREAD_ONCE_INIT; +static epicsThreadOnceId exitLaterOnce = EPICS_THREAD_ONCE_INIT; static exitPvt * pExitPvtPerProcess = 0; static epicsMutexId exitPvtLock = 0; static epicsThreadPrivateId exitPvtPerThread = 0; +static int exitLaterStatus; + static void destroyExitPvt(exitPvt * pep) { ellFree ( &pep->list ); @@ -179,6 +183,26 @@ epicsShareFunc void epicsExit(int status) exit(status); } +static void exitNow(void *junk) +{ + epicsExit(exitLaterStatus); +} + +static void exitLaterOnceFunc(void *raw) +{ + int *status = raw; + exitLaterStatus = *status; + epicsThreadMustCreate("exitLater", + epicsThreadPriorityLow, + epicsThreadGetStackSize(epicsThreadStackSmall), + &exitNow, NULL); +} + +epicsShareFunc void epicsExitLater(int status) +{ + epicsThreadOnce(&exitLaterOnce, &exitLaterOnceFunc, &status); +} + #include "epicsExport.h" epicsExportAddress(int,atExitDebug); diff --git a/src/libCom/misc/epicsExit.h b/src/libCom/misc/epicsExit.h index e64316010..3e961cbc1 100644 --- a/src/libCom/misc/epicsExit.h +++ b/src/libCom/misc/epicsExit.h @@ -18,6 +18,7 @@ extern "C" { typedef void (*epicsExitFunc)(void *arg); epicsShareFunc void epicsExit(int status); +epicsShareFunc void epicsExitLater(int status); epicsShareFunc void epicsExitCallAtExits(void); epicsShareFunc int epicsAtExit3(epicsExitFunc func, void *arg, const char* name); #define epicsAtExit(F,A) epicsAtExit3(F,A,#F) diff --git a/src/std/softIoc/softMain.cpp b/src/std/softIoc/softMain.cpp index a2b64eae8..13ecce884 100644 --- a/src/std/softIoc/softMain.cpp +++ b/src/std/softIoc/softMain.cpp @@ -83,7 +83,7 @@ const char *exit_db = EXIT_FILE; static void exitSubroutine(subRecord *precord) { - epicsExit((precord->a == 0.0) ? EXIT_SUCCESS : EXIT_FAILURE); + epicsExitLater((precord->a == 0.0) ? EXIT_SUCCESS : EXIT_FAILURE); } static void usage(int status) {