epicsExit: add epicsExitLater() to trigger process exit without blocking

This commit is contained in:
Michael Davidsaver
2014-11-13 11:58:35 -05:00
parent d35780888a
commit 924350b362
3 changed files with 26 additions and 1 deletions

View File

@@ -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);

View File

@@ -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)

View File

@@ -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) {