# define EV_USE_REALTIME 0
#endif
-#if EV_SELECT_IS_WINSOCKET
-# include <winsock.h>
-#endif
-
#if !EV_STAT_ENABLE
+# undef EV_USE_INOTIFY
# define EV_USE_INOTIFY 0
#endif
# include <sys/inotify.h>
#endif
+#if EV_SELECT_IS_WINSOCKET
+# include <winsock.h>
+#endif
+
/**/
/*
#define MAX_BLOCKTIME 59.743 /* never wait longer than this time (to detect time jumps) */
/*#define CLEANUP_INTERVAL (MAX_BLOCKTIME * 5.) /* how often to try to free memory and re-check fds, TODO */
-#if __GNUC__ >= 3
+#if __GNUC__ >= 4
# define expect(expr,value) __builtin_expect ((expr),(value))
# define noinline __attribute__ ((noinline))
#else
ANFD *anfd = anfds + fd;
ev_io *w;
- int events = 0;
+ unsigned char events = 0;
for (w = (ev_io *)anfd->head; w; w = (ev_io *)((WL)w)->next)
- events |= w->events;
+ events |= (unsigned char)w->events;
#if EV_SELECT_IS_WINSOCKET
if (events)
}
#endif
- anfd->reify = 0;
+ {
+ unsigned char o_events = anfd->events;
+ unsigned char o_reify = anfd->reify;
+
+ anfd->reify = 0;
+ anfd->events = events;
- backend_modify (EV_A_ fd, anfd->events, events);
- anfd->events = events;
+ if (o_events != events || o_reify & EV_IOFDSET)
+ backend_modify (EV_A_ fd, o_events, events);
+ }
}
fdchangecnt = 0;
fd_change (EV_P_ int fd, int flags)
{
unsigned char reify = anfds [fd].reify;
- anfds [fd].reify |= flags | 1;
+ anfds [fd].reify |= flags;
if (expect_true (!reify))
{
if (anfds [fd].events)
{
anfds [fd].events = 0;
- fd_change (EV_A_ fd, EV_IOFDSET);
+ fd_change (EV_A_ fd, EV_IOFDSET | 1);
}
}
#endif
}
+ ev_free (anfds); anfdmax = 0;
+
/* have to use the microsoft-never-gets-it-right macro */
array_free (fdchange, EMPTY);
array_free (timer, EMPTY);
#if EV_PERIODIC_ENABLE
array_free (periodic, EMPTY);
+#endif
+#if EV_FORK_ENABLE
+ array_free (fork, EMPTY);
#endif
array_free (prepare, EMPTY);
array_free (check, EMPTY);
array_needsize (ANFD, anfds, anfdmax, fd + 1, anfds_init);
wlist_add (&anfds[fd].head, (WL)w);
- fd_change (EV_A_ fd, w->events & EV_IOFDSET);
- w->events &= ~ EV_IOFDSET;
+ fd_change (EV_A_ fd, w->events & EV_IOFDSET | 1);
+ w->events &= ~EV_IOFDSET;
}
void noinline
wlist_del (&anfds[w->fd].head, (WL)w);
ev_stop (EV_A_ (W)w);
- fd_change (EV_A_ w->fd, 0);
+ fd_change (EV_A_ w->fd, 1);
}
void noinline