summaryrefslogtreecommitdiff
path: root/rts/posix/itimer/Setitimer.c
diff options
context:
space:
mode:
Diffstat (limited to 'rts/posix/itimer/Setitimer.c')
-rw-r--r--rts/posix/itimer/Setitimer.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/rts/posix/itimer/Setitimer.c b/rts/posix/itimer/Setitimer.c
new file mode 100644
index 0000000000..c44e8d8c22
--- /dev/null
+++ b/rts/posix/itimer/Setitimer.c
@@ -0,0 +1,88 @@
+/* -----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team, 1995-2007
+ *
+ * Interval timer for profiling and pre-emptive scheduling.
+ *
+ * ---------------------------------------------------------------------------*/
+
+#include "PosixSource.h"
+#include "Rts.h"
+
+#include "Ticker.h"
+#include "posix/Itimer.h"
+#include "Proftimer.h"
+#include "Schedule.h"
+#include "posix/Clock.h"
+#include "posix/Signals.h"
+
+/* As recommended in the autoconf manual */
+# ifdef TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+# else
+# ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+# endif
+
+#ifdef HAVE_SIGNAL_H
+# include <signal.h>
+#endif
+
+#include <string.h>
+
+static Time itimer_interval = DEFAULT_TICK_INTERVAL;
+
+void
+initTicker (Time interval, TickProc handle_tick)
+{
+ itimer_interval = interval;
+ install_vtalrm_handler(SIGALRM, handle_tick);
+}
+
+void
+startTicker(void)
+{
+ struct itimerval it;
+
+ it.it_value.tv_sec = TimeToSeconds(itimer_interval);
+ it.it_value.tv_usec = TimeToUS(itimer_interval) % 1000000;
+ it.it_interval = it.it_value;
+
+ if (setitimer(ITIMER_REAL, &it, NULL) != 0) {
+ sysErrorBelch("setitimer");
+ stg_exit(EXIT_FAILURE);
+ }
+}
+
+void
+stopTicker(void)
+{
+ struct itimerval it;
+
+ it.it_value.tv_sec = 0;
+ it.it_value.tv_usec = 0;
+ it.it_interval = it.it_value;
+
+ if (setitimer(ITIMER_REAL, &it, NULL) != 0) {
+ sysErrorBelch("setitimer");
+ stg_exit(EXIT_FAILURE);
+ }
+}
+
+void
+exitTicker (rtsBool wait STG_UNUSED)
+{
+ return;
+}
+
+int
+rtsTimerSignal(void)
+{
+ return SIGALRM;
+ // Using SIGALRM can leads to problems, see #850. But we have no
+ // option if timer_create() is not available.
+}