static int have_monotonic; /* did clock_gettime (CLOCK_MONOTONIC) work? */
+#if WIN32
+/* note: the comment below could not be substantiated, but what would I care */
+/* MSDN says this is required to handle SIGFPE */
+volatile double SIGFPE_REQ = 0.0f;
+#endif
+
/*****************************************************************************/
typedef struct
cur = newcnt; \
}
+#define array_slim(stem) \
+ if (stem ## max < array_roundsize (stem ## cnt >> 2)) \
+ { \
+ stem ## max = array_roundsize (stem ## cnt >> 1); \
+ base = realloc (base, sizeof (*base) * (stem ## max)); \
+ fprintf (stderr, "slimmed down " # stem " to %d\n", stem ## max);/*D*/\
+ }
+
+#define array_free(stem, idx) \
+ free (stem ## s idx); stem ## cnt idx = stem ## max idx = 0;
+
/*****************************************************************************/
static void
static void
sighandler (int signum)
{
+#if WIN32
+ signal (signum, sighandler);
+#endif
+
signals [signum - 1].gotsig = 1;
if (!gotsig)
void
loop_destroy (EV_P)
{
+ int i;
+
#if EV_USE_WIN32
if (method == EVMETHOD_WIN32 ) win32_destroy (EV_A);
#endif
if (method == EVMETHOD_SELECT) select_destroy (EV_A);
#endif
+ for (i = NUMPRI; i--; )
+ array_free (pending, [i]);
+
+ array_free (fdchange, );
+ array_free (timer, );
+ array_free (periodic, );
+ array_free (idle, );
+ array_free (prepare, );
+ array_free (check, );
+
method = 0;
/*TODO*/
}
if (p->w)
{
p->w->pending = 0;
-
- (*(void (**)(EV_P_ W, int))&p->w->cb) (EV_A_ p->w, p->events);
+ p->w->cb (EV_A_ p->w, p->events);
}
}
}
if (!((WL)w)->next)
{
+#if WIN32
+ signal (w->signum, sighandler);
+#else
struct sigaction sa;
sa.sa_handler = sighandler;
sigfillset (&sa.sa_mask);
sa.sa_flags = SA_RESTART; /* if restarting works we save one iteration */
sigaction (w->signum, &sa, 0);
+#endif
}
}