diff --git a/lib/profile/InstrProfilingFile.c b/lib/profile/InstrProfilingFile.c index 3ee34b9d8..ba717eeda 100644 --- a/lib/profile/InstrProfilingFile.c +++ b/lib/profile/InstrProfilingFile.c @@ -269,16 +269,9 @@ static void exitSignalHandler(int sig) { static void installExitSignalHandlers(void) { unsigned I; - struct sigaction sigact; - int err; for (I = 0; I < lprofCurFilename.NumExitSignals; ++I) { - memset(&sigact, 0, sizeof(sigact)); - sigact.sa_handler = exitSignalHandler; - err = sigaction(lprofCurFilename.ExitOnSignals[I], &sigact, NULL); - if (err) - PROF_WARN( - "Unable to install an exit signal handler for %d (errno = %d).\n", - lprofCurFilename.ExitOnSignals[I], err); + lprofInstallSignalHandler(lprofCurFilename.ExitOnSignals[I], + exitSignalHandler); } } diff --git a/lib/profile/InstrProfilingUtil.c b/lib/profile/InstrProfilingUtil.c index d1160411f..9b96309b8 100644 --- a/lib/profile/InstrProfilingUtil.c +++ b/lib/profile/InstrProfilingUtil.c @@ -26,6 +26,7 @@ #include #endif +#include #include #include @@ -245,3 +246,21 @@ COMPILER_RT_VISIBILITY void lprofRestoreSigKill() { prctl(PR_SET_PDEATHSIG, SIGKILL); #endif } + +COMPILER_RT_VISIBILITY void lprofInstallSignalHandler(int sig, + void (*handler)(int)) { +#ifdef _WIN32 + void (*err)(int) = signal(sig, handler); + if (err == SIG_ERR) + PROF_WARN("Unable to install an exit signal handler for %d (errno = %d).\n", + sig, errno); +#else + struct sigaction sigact; + memset(&sigact, 0, sizeof(sigact)); + sigact.sa_handler = handler; + int err = sigaction(sig, &sigact, NULL); + if (err) + PROF_WARN("Unable to install an exit signal handler for %d (errno = %d).\n", + sig, err); +#endif +} diff --git a/lib/profile/InstrProfilingUtil.h b/lib/profile/InstrProfilingUtil.h index 969859960..f4b5b7de6 100644 --- a/lib/profile/InstrProfilingUtil.h +++ b/lib/profile/InstrProfilingUtil.h @@ -59,4 +59,6 @@ int lprofSuspendSigKill(); /* Restore previously suspended SIGKILL. */ void lprofRestoreSigKill(); +void lprofInstallSignalHandler(int sig, void(*handler)(int)); + #endif /* PROFILE_INSTRPROFILINGUTIL_H */