#else /* posix / generic implementation */
-#if (DE_OS == DE_OS_UNIX) || (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_OSX) || (DE_OS == DE_OS_IOS)
-# define USE_SIGNAL_HANDLER 1
+#if defined(QP_USE_SIGNAL_HANDLER)
# include <signal.h>
#endif
-#if defined(USE_SIGNAL_HANDLER)
+#if defined(QP_USE_SIGNAL_HANDLER)
typedef struct SignalInfo_s
{
{ SIGPIPE, QP_CRASHTYPE_OTHER, "SIGPIPE" }
};
-#endif /* USE_SIGNAL_HANDLER */
+#endif /* QP_USE_SIGNAL_HANDLER */
struct qpCrashHandler_s
{
qpCrashInfo crashInfo;
int crashSignal;
-#if defined(USE_SIGNAL_HANDLER)
+#if defined(QP_USE_SIGNAL_HANDLER)
struct sigaction oldHandlers[DE_LENGTH_OF_ARRAY(s_signals)];
#endif
};
g_crashHandler->crashHandlerFunc(g_crashHandler, g_crashHandler->handlerUserPointer);
}
-#if defined(USE_SIGNAL_HANDLER)
+#if defined(QP_USE_SIGNAL_HANDLER)
static const SignalInfo* getSignalInfo (int sigNum)
{
g_crashHandler->crashHandlerFunc(g_crashHandler, g_crashHandler->handlerUserPointer);
}
-#endif /* USE_SIGNAL_HANDLER */
+#endif /* QP_USE_SIGNAL_HANDLER */
qpCrashHandler* qpCrashHandler_create (qpCrashHandlerFunc handlerFunc, void* userPointer)
{
/* DE_ASSERT callback. */
deSetAssertFailureCallback(assertFailureCallback);
-#if defined(USE_SIGNAL_HANDLER)
+#if defined(QP_USE_SIGNAL_HANDLER)
/* Register signal handlers. */
{
struct sigaction action;
deSetAssertFailureCallback(DE_NULL);
-#if defined(USE_SIGNAL_HANDLER)
+#if defined(QP_USE_SIGNAL_HANDLER)
/* Restore old handlers. */
{
int sigNdx;
#include "qpDebugOut.h"
+#include "qpCrashHandler.h" /*!< for QP_USE_SIGNAL_HANDLER */
+
#include <stdio.h>
#include <stdlib.h>
TerminateProcess(curProc, -1);
}
-#elif (DE_OS == DE_OS_IOS)
+#else
-#include "deThread.h"
+#if (DE_OS == DE_OS_IOS)
+# include "deThread.h" /*!< for deSleep() */
+#endif
+
+#if defined(QP_USE_SIGNAL_HANDLER)
+# include <signal.h>
+#endif
static void exitProcess (void)
{
+#if (DE_OS == DE_OS_IOS)
/* Since tests are in the same process as execserver, we want to give it
a chance to stream complete log data before terminating. */
deSleep(5000);
- exit(-1);
-}
+#endif
-#else
+#if defined(QP_USE_SIGNAL_HANDLER)
+ /* QP_USE_SIGNAL_HANDLER defined, this means this function could have
+ been called from a signal handler. Calling exit() inside a signal
+ handler is not safe. */
-static void exitProcess (void)
-{
+ /* Flush all open FILES */
+ fflush(DE_NULL);
+
+ /* Kill without calling any _at_exit handlers as those might hang */
+ raise(SIGKILL);
+#else
exit(-1);
+#endif
}
#endif