projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Remove ilxGen; part of trac #2243
[ghc-hetmet.git]
/
rts
/
posix
/
Itimer.c
diff --git
a/rts/posix/Itimer.c
b/rts/posix/Itimer.c
index
c4944aa
..
a60f8f1
100644
(file)
--- a/
rts/posix/Itimer.c
+++ b/
rts/posix/Itimer.c
@@
-1,6
+1,6
@@
/* -----------------------------------------------------------------------------
*
/* -----------------------------------------------------------------------------
*
- * (c) The GHC Team, 1995-1999
+ * (c) The GHC Team, 1995-2007
*
* Interval timer for profiling and pre-emptive scheduling.
*
*
* Interval timer for profiling and pre-emptive scheduling.
*
@@
-42,6
+42,8
@@
# include <signal.h>
#endif
# include <signal.h>
#endif
+#include <string.h>
+
/* Major bogosity:
*
* In the threaded RTS, we can't set the virtual timer because the
/* Major bogosity:
*
* In the threaded RTS, we can't set the virtual timer because the
@@
-95,9
+97,11
@@
#endif
#if defined(USE_TIMER_CREATE)
#endif
#if defined(USE_TIMER_CREATE)
-timer_t timer;
+static timer_t timer;
#endif
#endif
+static nat itimer_interval = 50;
+
static
void
install_vtalrm_handler(TickProc handle_tick)
static
void
install_vtalrm_handler(TickProc handle_tick)
@@
-127,7
+131,7
@@
install_vtalrm_handler(TickProc handle_tick)
}
void
}
void
-startTicker(nat ms, TickProc handle_tick)
+initTicker (nat ms, TickProc handle_tick)
{
install_vtalrm_handler(handle_tick);
{
install_vtalrm_handler(handle_tick);
@@
-135,23
+139,37
@@
startTicker(nat ms, TickProc handle_tick)
timestamp = getourtimeofday();
#endif
timestamp = getourtimeofday();
#endif
+ itimer_interval = ms;
+
#if defined(USE_TIMER_CREATE)
{
#if defined(USE_TIMER_CREATE)
{
- struct itimerspec it;
struct sigevent ev;
struct sigevent ev;
+ // Keep programs like valgrind happy
+ memset(&ev, 0, sizeof(ev));
+
ev.sigev_notify = SIGEV_SIGNAL;
ev.sigev_signo = ITIMER_SIGNAL;
ev.sigev_notify = SIGEV_SIGNAL;
ev.sigev_signo = ITIMER_SIGNAL;
-
- it.it_value.tv_sec = ms / 1000;
- it.it_value.tv_nsec = (ms % 1000) * 1000000;
- it.it_interval = it.it_value;
-
+
if (timer_create(TIMER_FLAVOUR, &ev, &timer) != 0) {
sysErrorBelch("timer_create");
stg_exit(EXIT_FAILURE);
}
if (timer_create(TIMER_FLAVOUR, &ev, &timer) != 0) {
sysErrorBelch("timer_create");
stg_exit(EXIT_FAILURE);
}
+ }
+#endif
+}
+void
+startTicker(void)
+{
+#if defined(USE_TIMER_CREATE)
+ {
+ struct itimerspec it;
+
+ it.it_value.tv_sec = itimer_interval / 1000;
+ it.it_value.tv_nsec = (itimer_interval % 1000) * 1000000;
+ it.it_interval = it.it_value;
+
if (timer_settime(timer, 0, &it, NULL) != 0) {
sysErrorBelch("timer_settime");
stg_exit(EXIT_FAILURE);
if (timer_settime(timer, 0, &it, NULL) != 0) {
sysErrorBelch("timer_settime");
stg_exit(EXIT_FAILURE);
@@
-161,8
+179,8
@@
startTicker(nat ms, TickProc handle_tick)
{
struct itimerval it;
{
struct itimerval it;
- it.it_value.tv_sec = ms / 1000;
- it.it_value.tv_usec = (ms % 1000) * 1000;
+ it.it_value.tv_sec = itimer_interval / 1000;
+ it.it_value.tv_usec = (itimer_interval % 1000) * 1000;
it.it_interval = it.it_value;
if (setitimer(ITIMER_FLAVOUR, &it, NULL) != 0) {
it.it_interval = it.it_value;
if (setitimer(ITIMER_FLAVOUR, &it, NULL) != 0) {
@@
-201,6
+219,15
@@
stopTicker(void)
#endif
}
#endif
}
+void
+exitTicker(void)
+{
+#if defined(USE_TIMER_CREATE)
+ timer_delete(timer);
+ // ignore errors - we don't really care if it fails.
+#endif
+}
+
#if 0
/* Currently unused */
void
#if 0
/* Currently unused */
void
@@
-233,8
+260,11
@@
lnat
getourtimeofday(void)
{
struct timeval tv;
getourtimeofday(void)
{
struct timeval tv;
+ nat interval;
+ interval = RtsFlags.MiscFlags.tickInterval;
+ if (interval == 0) { interval = 50; }
gettimeofday(&tv, (struct timezone *) NULL);
// cast to lnat because nat may be 64 bit when int is only 32 bit
gettimeofday(&tv, (struct timezone *) NULL);
// cast to lnat because nat may be 64 bit when int is only 32 bit
- return ((lnat)tv.tv_sec * 1000 / RtsFlags.MiscFlags.tickInterval +
- (lnat)tv.tv_usec / (RtsFlags.MiscFlags.tickInterval * 1000));
+ return ((lnat)tv.tv_sec * 1000 / interval +
+ (lnat)tv.tv_usec / (interval * 1000));
}
}