Merge remote-tracking branch 'origin/swift-4.0-branch' into stable
diff --git a/lib/profile/InstrProfilingFile.c b/lib/profile/InstrProfilingFile.c
index 3ee34b9..ba717ee 100644
--- a/lib/profile/InstrProfilingFile.c
+++ b/lib/profile/InstrProfilingFile.c
@@ -269,16 +269,9 @@
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 d116041..9b96309 100644
--- a/lib/profile/InstrProfilingUtil.c
+++ b/lib/profile/InstrProfilingUtil.c
@@ -26,6 +26,7 @@
#include <sys/utsname.h>
#endif
+#include <signal.h>
#include <stdlib.h>
#include <string.h>
@@ -245,3 +246,21 @@
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 9698599..f4b5b7d 100644
--- a/lib/profile/InstrProfilingUtil.h
+++ b/lib/profile/InstrProfilingUtil.h
@@ -59,4 +59,6 @@
/* Restore previously suspended SIGKILL. */
void lprofRestoreSigKill();
+void lprofInstallSignalHandler(int sig, void(*handler)(int));
+
#endif /* PROFILE_INSTRPROFILINGUTIL_H */