/*****************************************************************************/
-static void (*syserr_cb)(void);
+static void (*syserr_cb)(const char *msg);
-void ev_set_syserr_cb (void (*cb)(void))
+void ev_set_syserr_cb (void (*cb)(const char *msg))
{
syserr_cb = cb;
}
static void
-syserr (void)
+syserr (const char *msg)
{
+ if (!msg)
+ msg = "(libev) system error";
+
if (syserr_cb)
- syserr_cb ();
+ syserr_cb (msg);
else
{
- perror ("libev");
+ perror (msg);
abort ();
}
}
static void
fd_change (EV_P_ int fd)
{
- if (anfds [fd].reify || fdchangecnt < 0)
+ if (anfds [fd].reify)
return;
anfds [fd].reify = 1;
}
}
-/* susually called after fork if method needs to re-arm all fds from scratch */
+/* usually called after fork if method needs to re-arm all fds from scratch */
static void
fd_rearm_all (EV_P)
{
#if EV_USE_SELECT
if (!method && (methods & EVMETHOD_SELECT)) method = select_init (EV_A_ methods);
#endif
+
+ ev_watcher_init (&sigev, sigcb);
+ ev_set_priority (&sigev, EV_MAXPRI);
}
}
array_free (check, );
method = 0;
- /*TODO*/
}
-void
+static void
loop_fork (EV_P)
{
- /*TODO*/
#if EV_USE_EPOLL
if (method == EVMETHOD_EPOLL ) epoll_fork (EV_A);
#endif
#if EV_USE_KQUEUE
if (method == EVMETHOD_KQUEUE) kqueue_fork (EV_A);
#endif
+
+ if (ev_is_active (&sigev))
+ {
+ /* default loop */
+
+ ev_ref (EV_A);
+ ev_io_stop (EV_A_ &sigev);
+ close (sigpipe [0]);
+ close (sigpipe [1]);
+
+ while (pipe (sigpipe))
+ syserr ("(libev) error creating pipe");
+
+ siginit (EV_A);
+ }
+
+ postfork = 0;
}
#if EV_MULTIPLICITY
void
ev_loop_fork (EV_P)
{
- loop_fork (EV_A);
+ postfork = 1;
}
#endif
if (ev_method (EV_A))
{
- ev_watcher_init (&sigev, sigcb);
- ev_set_priority (&sigev, EV_MAXPRI);
siginit (EV_A);
#ifndef WIN32
struct ev_loop *loop = default_loop;
#endif
- loop_fork (EV_A);
-
- ev_io_stop (EV_A_ &sigev);
- close (sigpipe [0]);
- close (sigpipe [1]);
- pipe (sigpipe);
-
- ev_ref (EV_A); /* signal watcher */
- siginit (EV_A);
+ if (method)
+ postfork = 1;
}
/*****************************************************************************/
call_pending (EV_A);
}
+ /* we might have forked, so reify kernel state if necessary */
+ if (expect_false (postfork))
+ loop_fork (EV_A);
+
/* update fd-related kernel structures */
fd_reify (EV_A);