X-Git-Url: https://git.llucax.com/software/libev.git/blobdiff_plain/cc491ddade261fb0e1755c6da29a95f1c66e8b32..8ee1afd13859937076f9a9ff5e3420d3304f524e:/ev.c?ds=sidebyside diff --git a/ev.c b/ev.c index b2e48f8..e09fc84 100644 --- a/ev.c +++ b/ev.c @@ -115,7 +115,13 @@ get_clock (void) #define array_needsize(base,cur,cnt,init) \ if ((cnt) > cur) \ { \ - int newcnt = cur ? cur << 1 : 16; \ + int newcnt = cur; \ + do \ + { \ + newcnt = (newcnt << 1) | 4 & ~3; \ + } \ + while ((cnt) > newcnt); \ + \ base = realloc (base, sizeof (*base) * (newcnt)); \ init (base + cur, newcnt - cur); \ cur = newcnt; \ @@ -193,7 +199,7 @@ queue_events (W *events, int eventcnt, int type) /* called on EBADF to verify fds */ static void -fd_recheck () +fd_recheck (void) { int fd; @@ -201,7 +207,10 @@ fd_recheck () if (anfds [fd].wev) if (fcntl (fd, F_GETFD) == -1 && errno == EBADF) while (anfds [fd].head) - evio_stop (anfds [fd].head); + { + event ((W)anfds [fd].head, EV_ERROR); + evio_stop (anfds [fd].head); + } } /*****************************************************************************/ @@ -368,38 +377,53 @@ childcb (struct ev_signal *sw, int revents) # include "ev_select.c" #endif +int +ev_version_major (void) +{ + return EV_VERSION_MAJOR; +} + +int +ev_version_minor (void) +{ + return EV_VERSION_MINOR; +} + int ev_init (int flags) { + if (!ev_method) + { #if HAVE_MONOTONIC - { - struct timespec ts; - if (!clock_gettime (CLOCK_MONOTONIC, &ts)) - have_monotonic = 1; - } + { + struct timespec ts; + if (!clock_gettime (CLOCK_MONOTONIC, &ts)) + have_monotonic = 1; + } #endif - ev_now = ev_time (); - now = get_clock (); - diff = ev_now - now; + ev_now = ev_time (); + now = get_clock (); + diff = ev_now - now; - if (pipe (sigpipe)) - return 0; + if (pipe (sigpipe)) + return 0; - ev_method = EVMETHOD_NONE; + ev_method = EVMETHOD_NONE; #if HAVE_EPOLL - if (ev_method == EVMETHOD_NONE) epoll_init (flags); + if (ev_method == EVMETHOD_NONE) epoll_init (flags); #endif #if HAVE_SELECT - if (ev_method == EVMETHOD_NONE) select_init (flags); + if (ev_method == EVMETHOD_NONE) select_init (flags); #endif - if (ev_method) - { - evw_init (&sigev, sigcb); - siginit (); + if (ev_method) + { + evw_init (&sigev, sigcb); + siginit (); - evsignal_init (&childev, childcb, SIGCHLD); - evsignal_start (&childev); + evsignal_init (&childev, childcb, SIGCHLD); + evsignal_start (&childev); + } } return ev_method; @@ -407,17 +431,20 @@ int ev_init (int flags) /*****************************************************************************/ -void ev_prefork (void) +void +ev_prefork (void) { /* nop */ } -void ev_postfork_parent (void) +void +ev_postfork_parent (void) { /* nop */ } -void ev_postfork_child (void) +void +ev_postfork_child (void) { #if HAVE_EPOLL if (ev_method == EVMETHOD_EPOLL) @@ -460,7 +487,7 @@ fd_reify (void) } static void -call_pending () +call_pending (void) { while (pendingcnt) { @@ -475,7 +502,7 @@ call_pending () } static void -timers_reify () +timers_reify (void) { while (timercnt && timers [0]->at <= now) { @@ -496,7 +523,7 @@ timers_reify () } static void -periodics_reify () +periodics_reify (void) { while (periodiccnt && periodics [0]->at <= ev_now) { @@ -542,7 +569,7 @@ periodics_reschedule (ev_tstamp diff) } static void -time_update () +time_update (void) { int i; @@ -586,7 +613,7 @@ int ev_loop_done; void ev_loop (int flags) { double block; - ev_loop_done = flags & EVLOOP_ONESHOT ? 1 : 0; + ev_loop_done = flags & (EVLOOP_ONESHOT | EVLOOP_NONBLOCK) ? 1 : 0; do { @@ -715,11 +742,16 @@ evio_start (struct ev_io *w) ++fdchangecnt; array_needsize (fdchanges, fdchangemax, fdchangecnt, ); fdchanges [fdchangecnt - 1] = fd; + + if (w->fd == 9) + printf ("start %p:%x\n", w, w->events);//D } void evio_stop (struct ev_io *w) { + if (w->fd == 9) + printf ("stop %p:%x\n", w, w->events);//D ev_clear ((W)w); if (!ev_is_active (w)) return;