ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libev/ev.c
(Generate patch)

Comparing libev/ev.c (file contents):
Revision 1.264 by root, Mon Oct 13 23:20:12 2008 UTC vs.
Revision 1.272 by root, Mon Nov 3 12:17:40 2008 UTC

388{ 388{
389 syserr_cb = cb; 389 syserr_cb = cb;
390} 390}
391 391
392static void noinline 392static void noinline
393syserr (const char *msg) 393ev_syserr (const char *msg)
394{ 394{
395 if (!msg) 395 if (!msg)
396 msg = "(libev) system error"; 396 msg = "(libev) system error";
397 397
398 if (syserr_cb) 398 if (syserr_cb)
449typedef struct 449typedef struct
450{ 450{
451 WL head; 451 WL head;
452 unsigned char events; 452 unsigned char events;
453 unsigned char reify; 453 unsigned char reify;
454 unsigned char emask; /* the epoll backend stores the actual kernel mask in here */
455 unsigned char unused;
456#if EV_USE_EPOLL
457 unsigned int egen; /* generation counter to counter epoll bugs */
458#endif
454#if EV_SELECT_IS_WINSOCKET 459#if EV_SELECT_IS_WINSOCKET
455 SOCKET handle; 460 SOCKET handle;
456#endif 461#endif
457} ANFD; 462} ANFD;
458 463
611{ 616{
612 *cur = array_nextsize (elem, *cur, cnt); 617 *cur = array_nextsize (elem, *cur, cnt);
613 return ev_realloc (base, elem * *cur); 618 return ev_realloc (base, elem * *cur);
614} 619}
615 620
621#define array_init_zero(base,count) \
622 memset ((void *)(base), 0, sizeof (*(base)) * (count))
623
616#define array_needsize(type,base,cur,cnt,init) \ 624#define array_needsize(type,base,cur,cnt,init) \
617 if (expect_false ((cnt) > (cur))) \ 625 if (expect_false ((cnt) > (cur))) \
618 { \ 626 { \
619 int ocur_ = (cur); \ 627 int ocur_ = (cur); \
620 (base) = (type *)array_realloc \ 628 (base) = (type *)array_realloc \
662 for (i = 0; i < eventcnt; ++i) 670 for (i = 0; i < eventcnt; ++i)
663 ev_feed_event (EV_A_ events [i], type); 671 ev_feed_event (EV_A_ events [i], type);
664} 672}
665 673
666/*****************************************************************************/ 674/*****************************************************************************/
667
668void inline_size
669anfds_init (ANFD *base, int count)
670{
671 while (count--)
672 {
673 base->head = 0;
674 base->events = EV_NONE;
675 base->reify = 0;
676
677 ++base;
678 }
679}
680 675
681void inline_speed 676void inline_speed
682fd_event (EV_P_ int fd, int revents) 677fd_event (EV_P_ int fd, int revents)
683{ 678{
684 ANFD *anfd = anfds + fd; 679 ANFD *anfd = anfds + fd;
814 809
815 for (fd = 0; fd < anfdmax; ++fd) 810 for (fd = 0; fd < anfdmax; ++fd)
816 if (anfds [fd].events) 811 if (anfds [fd].events)
817 { 812 {
818 anfds [fd].events = 0; 813 anfds [fd].events = 0;
814 anfds [fd].emask = 0;
819 fd_change (EV_A_ fd, EV_IOFDSET | 1); 815 fd_change (EV_A_ fd, EV_IOFDSET | 1);
820 } 816 }
821} 817}
822 818
823/*****************************************************************************/ 819/*****************************************************************************/
975static ANSIG *signals; 971static ANSIG *signals;
976static int signalmax; 972static int signalmax;
977 973
978static EV_ATOMIC_T gotsig; 974static EV_ATOMIC_T gotsig;
979 975
980void inline_size
981signals_init (ANSIG *base, int count)
982{
983 while (count--)
984 {
985 base->head = 0;
986 base->gotsig = 0;
987
988 ++base;
989 }
990}
991
992/*****************************************************************************/ 976/*****************************************************************************/
993 977
994void inline_speed 978void inline_speed
995fd_intern (int fd) 979fd_intern (int fd)
996{ 980{
1017 } 1001 }
1018 else 1002 else
1019#endif 1003#endif
1020 { 1004 {
1021 while (pipe (evpipe)) 1005 while (pipe (evpipe))
1022 syserr ("(libev) error creating signal/async pipe"); 1006 ev_syserr ("(libev) error creating signal/async pipe");
1023 1007
1024 fd_intern (evpipe [0]); 1008 fd_intern (evpipe [0]);
1025 fd_intern (evpipe [1]); 1009 fd_intern (evpipe [1]);
1026 ev_io_set (&pipeev, evpipe [0], EV_READ); 1010 ev_io_set (&pipeev, evpipe [0], EV_READ);
1027 } 1011 }
1658{ 1642{
1659#if EV_MULTIPLICITY 1643#if EV_MULTIPLICITY
1660 struct ev_loop *loop = ev_default_loop_ptr; 1644 struct ev_loop *loop = ev_default_loop_ptr;
1661#endif 1645#endif
1662 1646
1647 ev_default_loop_ptr = 0;
1648
1663#ifndef _WIN32 1649#ifndef _WIN32
1664 ev_ref (EV_A); /* child watcher */ 1650 ev_ref (EV_A); /* child watcher */
1665 ev_signal_stop (EV_A_ &childev); 1651 ev_signal_stop (EV_A_ &childev);
1666#endif 1652#endif
1667 1653
1673{ 1659{
1674#if EV_MULTIPLICITY 1660#if EV_MULTIPLICITY
1675 struct ev_loop *loop = ev_default_loop_ptr; 1661 struct ev_loop *loop = ev_default_loop_ptr;
1676#endif 1662#endif
1677 1663
1678 if (backend)
1679 postfork = 1; /* must be in line with ev_loop_fork */ 1664 postfork = 1; /* must be in line with ev_loop_fork */
1680} 1665}
1681 1666
1682/*****************************************************************************/ 1667/*****************************************************************************/
1683 1668
1684void 1669void
2139 2124
2140 if (expect_false (ev_is_active (w))) 2125 if (expect_false (ev_is_active (w)))
2141 return; 2126 return;
2142 2127
2143 assert (("ev_io_start called with negative fd", fd >= 0)); 2128 assert (("ev_io_start called with negative fd", fd >= 0));
2129 assert (("ev_io start called with illegal event mask", !(w->events & ~(EV_IOFDSET | EV_READ | EV_WRITE))));
2144 2130
2145 EV_FREQUENT_CHECK; 2131 EV_FREQUENT_CHECK;
2146 2132
2147 ev_start (EV_A_ (W)w, 1); 2133 ev_start (EV_A_ (W)w, 1);
2148 array_needsize (ANFD, anfds, anfdmax, fd + 1, anfds_init); 2134 array_needsize (ANFD, anfds, anfdmax, fd + 1, array_init_zero);
2149 wlist_add (&anfds[fd].head, (WL)w); 2135 wlist_add (&anfds[fd].head, (WL)w);
2150 2136
2151 fd_change (EV_A_ fd, w->events & EV_IOFDSET | 1); 2137 fd_change (EV_A_ fd, w->events & EV_IOFDSET | 1);
2152 w->events &= ~EV_IOFDSET; 2138 w->events &= ~EV_IOFDSET;
2153 2139
2345 sigset_t full, prev; 2331 sigset_t full, prev;
2346 sigfillset (&full); 2332 sigfillset (&full);
2347 sigprocmask (SIG_SETMASK, &full, &prev); 2333 sigprocmask (SIG_SETMASK, &full, &prev);
2348#endif 2334#endif
2349 2335
2350 array_needsize (ANSIG, signals, signalmax, w->signum, signals_init); 2336 array_needsize (ANSIG, signals, signalmax, w->signum, array_init_zero);
2351 2337
2352#ifndef _WIN32 2338#ifndef _WIN32
2353 sigprocmask (SIG_SETMASK, &prev, 0); 2339 sigprocmask (SIG_SETMASK, &prev, 0);
2354#endif 2340#endif
2355 } 2341 }
2446 if (w->wd < 0) 2432 if (w->wd < 0)
2447 { 2433 {
2448 ev_timer_start (EV_A_ &w->timer); /* this is not race-free, so we still need to recheck periodically */ 2434 ev_timer_start (EV_A_ &w->timer); /* this is not race-free, so we still need to recheck periodically */
2449 2435
2450 /* monitor some parent directory for speedup hints */ 2436 /* monitor some parent directory for speedup hints */
2451 /* note that exceeding the hardcoded limit is not a correctness issue, */ 2437 /* note that exceeding the hardcoded path limit is not a correctness issue, */
2452 /* but an efficiency issue only */ 2438 /* but an efficiency issue only */
2453 if ((errno == ENOENT || errno == EACCES) && strlen (w->path) < 4096) 2439 if ((errno == ENOENT || errno == EACCES) && strlen (w->path) < 4096)
2454 { 2440 {
2455 char path [4096]; 2441 char path [4096];
2456 strcpy (path, w->path); 2442 strcpy (path, w->path);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines