#include <stdarg.h>
#include <stdio.h>
+#if defined(openbsd_TARGET_OS)
+# ifdef HAVE_SIGNAL_H
+# include <signal.h>
+# endif
+# ifdef HAVE_PTHREAD_H
+# include <pthread.h>
+# endif
+#endif
+
/* -----------------------------------------------------------------------------
Result-checking malloc wrappers.
-------------------------------------------------------------------------- */
}
#endif
+/*
+ * It seems that pthreads and signals interact oddly in OpenBSD
+ * pthreads (and possibly FreeBSD). When linking with -lpthreads, we
+ * have to use pthread_kill to send blockable signals. So use that
+ * when we have a threaded rts. So System.Posix.Signals will call
+ * genericRaise(), rather than raise(3).
+ */
+#if defined(openbsd_TARGET_OS)
+int genericRaise(int sig) {
+# if defined(THREADED_RTS)
+ return pthread_kill(pthread_self(), sig);
+# else
+ return raise(sig);
+# endif
+}
+#endif
extern void* __hscore_get_saved_termios(int fd);
extern void __hscore_set_saved_termios(int fd, void* ts);
+#if defined(openbsd_TARGET_OS)
+extern int genericRaise(int sig);
+#endif
+
#endif // RTSUTILS_H