epicsExit: add epicsExitLater() to trigger process exit without blocking
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user