Apply the following patch:
--- itimer.ori Thu Jan 1 22:57:00 1998
+++ itimer.c Wed Feb 10 11:02:16 1999
@@ -5,8 +5,8 @@
Changed to work with SIGALRM & SIGPROF by Tom Demmer.
Gotchas:
- - It relies on uclock(), which does not work under Windows 95.
- - It screws up debuggers for reasons I cannot figure out.
+ - It relies on uclock(), which does not work as expected under Windows 9x.
+ - It screws up some debuggers (see DJGPP FAQ list 2.11, question 12.10).
- Both is true for the old version, too.
*/
@@ -16,6 +16,7 @@
#include <dpmi.h>
#include <signal.h>
#include <go32.h>
+#include <dos.h>
static uclock_t r_exp, r_rel, /* When REAL expires & reload value */
p_exp, p_rel; /* When PROF expires & reload value */
@@ -26,8 +27,15 @@
getitimer(int which, struct itimerval *value)
{
uclock_t rel;
+ int save_istate;
+ /* This is superfluous */
u_now = uclock();
+
+ /* Potential race condition here with timer_action.
+ This critical section must run with interrupts disabled */
+ save_istate = disable();
+
if (which == ITIMER_REAL)
{
if (r_exp)
@@ -36,7 +44,7 @@
rel = r_rel;
}
else
- r_exp = rel = 0;
+ u_now = rel = 0;
}
else if (which == ITIMER_PROF)
{
@@ -53,6 +61,10 @@
errno = EINVAL;
return -1;
}
+
+ if (save_istate)
+ enable();
+
value->it_value.tv_sec = u_now / UCLOCKS_PER_SEC;
value->it_value.tv_usec= (u_now - value->it_value.tv_sec*3433)/4096;
value->it_interval.tv_sec = rel / UCLOCKS_PER_SEC;
@@ -65,7 +77,7 @@
extern int __djgpp_timer_hdlr;
static char timer_on = 0;
-/* Set back IRQ2 handler to default values and disable own signal
+/* Set back IRQ0 handler to default values and disable own signal
handler */
static void
stop_timer(void)