static void (*syserr_cb)(const char *msg);
-void ev_set_syserr_cb (void (*cb)(const char *msg))
+void
+ev_set_syserr_cb (void (*cb)(const char *msg))
{
syserr_cb = cb;
}
-static void
+static void noinline
syserr (const char *msg)
{
if (!msg)
static void *(*alloc)(void *ptr, long size);
-void ev_set_allocator (void *(*cb)(void *ptr, long size))
+void
+ev_set_allocator (void *(*cb)(void *ptr, long size))
{
alloc = cb;
}
/*****************************************************************************/
-ev_tstamp noinline
+ev_tstamp
ev_time (void)
{
#if EV_USE_REALTIME
/*****************************************************************************/
-void inline_size
-anfds_init (ANFD *base, int count)
-{
- while (count--)
- {
- base->head = 0;
- base->events = EV_NONE;
- base->reify = 0;
-
- ++base;
- }
-}
-
void noinline
ev_feed_event (EV_P_ void *w, int revents)
{
pendings [ABSPRI (w_)][w_->pending - 1].events = revents;
}
-static void
+void inline_size
queue_events (EV_P_ W *events, int eventcnt, int type)
{
int i;
ev_feed_event (EV_A_ events [i], type);
}
+/*****************************************************************************/
+
+void inline_size
+anfds_init (ANFD *base, int count)
+{
+ while (count--)
+ {
+ base->head = 0;
+ base->events = EV_NONE;
+ base->reify = 0;
+
+ ++base;
+ }
+}
+
void inline_speed
fd_event (EV_P_ int fd, int revents)
{
fd_event (EV_A_ fd, revents);
}
-/*****************************************************************************/
-
void inline_size
fd_reify (EV_P)
{
static ev_signal childev;
-#ifndef WCONTINUED
-# define WCONTINUED 0
-#endif
-
void inline_speed
child_reap (EV_P_ ev_signal *sw, int chain, int pid, int status)
{
}
}
+#ifndef WCONTINUED
+# define WCONTINUED 0
+#endif
+
static void
childcb (EV_P_ ev_signal *sw, int revents)
{
int pid, status;
- if (0 < (pid = waitpid (-1, &status, WNOHANG | WUNTRACED | WCONTINUED)))
- {
- /* make sure we are called again until all childs have been reaped */
- /* we need to do it this way so that the callback gets called before we continue */
- ev_feed_event (EV_A_ (W)sw, EV_SIGNAL);
+ /* some systems define WCONTINUED but then fail to support it (linux 2.4) */
+ if (0 >= (pid = waitpid (-1, &status, WNOHANG | WUNTRACED | WCONTINUED)))
+ if (!WCONTINUED
+ || errno != EINVAL
+ || 0 >= (pid = waitpid (-1, &status, WNOHANG | WUNTRACED)))
+ return;
- child_reap (EV_A_ sw, pid, pid, status);
- child_reap (EV_A_ sw, 0, pid, status); /* this might trigger a watcher twice, but feed_event catches that */
- }
+ /* make sure we are called again until all childs have been reaped */
+ /* we need to do it this way so that the callback gets called before we continue */
+ ev_feed_event (EV_A_ (W)sw, EV_SIGNAL);
+
+ child_reap (EV_A_ sw, pid, pid, status);
+ child_reap (EV_A_ sw, 0, pid, status); /* this might trigger a watcher twice, but feed_event catches that */
}
#endif
# define lstat(a,b) stat(a,b)
# endif
+#define DEF_STAT_INTERVAL 5.0074891
+#define MIN_STAT_INTERVAL 0.1074891
+
void
ev_stat_stat (EV_P_ ev_stat *w)
{
ev_stat_stat (EV_A_ w);
+ if (w->interval < MIN_STAT_INTERVAL)
+ w->interval = w->interval ? MIN_STAT_INTERVAL : DEF_STAT_INTERVAL;
+
ev_timer_init (&w->timer, stat_timer_cb, w->interval, w->interval);
ev_set_priority (&w->timer, ev_priority (w));
ev_timer_start (EV_A_ &w->timer);