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

Comparing libev/ev.c (file contents):
Revision 1.424 by root, Tue May 1 22:01:40 2012 UTC vs.
Revision 1.427 by root, Sun May 6 19:29:59 2012 UTC

1430 w_->pending = ++pendingcnt [pri]; 1430 w_->pending = ++pendingcnt [pri];
1431 array_needsize (ANPENDING, pendings [pri], pendingmax [pri], w_->pending, EMPTY2); 1431 array_needsize (ANPENDING, pendings [pri], pendingmax [pri], w_->pending, EMPTY2);
1432 pendings [pri][w_->pending - 1].w = w_; 1432 pendings [pri][w_->pending - 1].w = w_;
1433 pendings [pri][w_->pending - 1].events = revents; 1433 pendings [pri][w_->pending - 1].events = revents;
1434 } 1434 }
1435
1436 pendingpri = NUMPRI - 1;
1435} 1437}
1436 1438
1437inline_speed void 1439inline_speed void
1438feed_reverse (EV_P_ W w) 1440feed_reverse (EV_P_ W w)
1439{ 1441{
1874 write (evfd, &counter, sizeof (uint64_t)); 1876 write (evfd, &counter, sizeof (uint64_t));
1875 } 1877 }
1876 else 1878 else
1877#endif 1879#endif
1878 { 1880 {
1879 /* win32 people keep sending patches that change this write() to send() */ 1881#ifdef _WIN32
1880 /* and then run away. but send() is wrong, it wants a socket handle on win32 */ 1882 WSABUF buf;
1881 /* so when you think this write should be a send instead, please find out */ 1883 DWORD sent;
1882 /* where your send() is from - it's definitely not the microsoft send, and */ 1884 buf.buf = &buf;
1883 /* tell me. thank you. */ 1885 buf.len = 1;
1884 /* it might be that your problem is that your environment needs EV_USE_WSASOCKET */ 1886 WSASend (EV_FD_TO_WIN32_HANDLE (evpipe [1]), &buf, 1, &sent, 0, 0, 0);
1885 /* check the ev documentation on how to use this flag */ 1887#else
1886 write (evpipe [1], &(evpipe [1]), 1); 1888 write (evpipe [1], &(evpipe [1]), 1);
1889#endif
1887 } 1890 }
1888 1891
1889 errno = old_errno; 1892 errno = old_errno;
1890 } 1893 }
1891} 1894}
1906 read (evfd, &counter, sizeof (uint64_t)); 1909 read (evfd, &counter, sizeof (uint64_t));
1907 } 1910 }
1908 else 1911 else
1909#endif 1912#endif
1910 { 1913 {
1911 char dummy; 1914 char dummy[4];
1912 /* see discussion in evpipe_write when you think this read should be recv in win32 */ 1915#ifdef _WIN32
1916 WSABUF buf;
1917 DWORD recvd;
1918 buf.buf = dummy;
1919 buf.len = sizeof (dummy);
1920 WSARecv (EV_FD_TO_WIN32_HANDLE (evpipe [0]), &buf, 1, &recvd, 0, 0, 0);
1921#else
1913 read (evpipe [0], &dummy, 1); 1922 read (evpipe [0], &dummy, sizeof (dummy));
1923#endif
1914 } 1924 }
1915 } 1925 }
1916 1926
1917 pipe_write_skipped = 0; 1927 pipe_write_skipped = 0;
1918 1928
2552#if EV_FEATURE_API 2562#if EV_FEATURE_API
2553void ecb_cold 2563void ecb_cold
2554ev_verify (EV_P) EV_THROW 2564ev_verify (EV_P) EV_THROW
2555{ 2565{
2556#if EV_VERIFY 2566#if EV_VERIFY
2557 int i; 2567 int i, j;
2558 WL w; 2568 WL w, w2;
2559 2569
2560 assert (activecnt >= -1); 2570 assert (activecnt >= -1);
2561 2571
2562 assert (fdchangemax >= fdchangecnt); 2572 assert (fdchangemax >= fdchangecnt);
2563 for (i = 0; i < fdchangecnt; ++i) 2573 for (i = 0; i < fdchangecnt; ++i)
2564 assert (("libev: negative fd in fdchanges", fdchanges [i] >= 0)); 2574 assert (("libev: negative fd in fdchanges", fdchanges [i] >= 0));
2565 2575
2566 assert (anfdmax >= 0); 2576 assert (anfdmax >= 0);
2567 for (i = 0; i < anfdmax; ++i) 2577 for (i = j = 0; i < anfdmax; ++i)
2568 for (w = anfds [i].head; w; w = w->next) 2578 for (w = w2 = anfds [i].head; w; w = w->next)
2569 { 2579 {
2570 verify_watcher (EV_A_ (W)w); 2580 verify_watcher (EV_A_ (W)w);
2581
2582 if (++j & 1)
2583 w2 = w2->next;
2584
2585 assert (("libev: io watcher list contains a loop", w != w2));
2571 assert (("libev: inactive fd watcher on anfd list", ev_active (w) == 1)); 2586 assert (("libev: inactive fd watcher on anfd list", ev_active (w) == 1));
2572 assert (("libev: fd mismatch between watcher and anfd", ((ev_io *)w)->fd == i)); 2587 assert (("libev: fd mismatch between watcher and anfd", ((ev_io *)w)->fd == i));
2573 } 2588 }
2574 2589
2575 assert (timermax >= timercnt); 2590 assert (timermax >= timercnt);
2685} 2700}
2686 2701
2687void noinline 2702void noinline
2688ev_invoke_pending (EV_P) 2703ev_invoke_pending (EV_P)
2689{ 2704{
2690 int pri; 2705 for (pendingpri = NUMPRI; pendingpri--; ) /* pendingpri is modified during the loop */
2691
2692 for (pri = NUMPRI; pri--; )
2693 while (pendingcnt [pri]) 2706 while (pendingcnt [pendingpri])
2694 { 2707 {
2695 ANPENDING *p = pendings [pri] + --pendingcnt [pri]; 2708 ANPENDING *p = pendings [pendingpri] + --pendingcnt [pendingpri];
2696 2709
2697 p->w->pending = 0; 2710 p->w->pending = 0;
2698 EV_CB_INVOKE (p->w, p->events); 2711 EV_CB_INVOKE (p->w, p->events);
2699 EV_FREQUENT_CHECK; 2712 EV_FREQUENT_CHECK;
2700 } 2713 }
3249 EV_FREQUENT_CHECK; 3262 EV_FREQUENT_CHECK;
3250 3263
3251 ev_start (EV_A_ (W)w, 1); 3264 ev_start (EV_A_ (W)w, 1);
3252 array_needsize (ANFD, anfds, anfdmax, fd + 1, array_init_zero); 3265 array_needsize (ANFD, anfds, anfdmax, fd + 1, array_init_zero);
3253 wlist_add (&anfds[fd].head, (WL)w); 3266 wlist_add (&anfds[fd].head, (WL)w);
3267
3268 /* common bug, apparently */
3269 assert (("libev: ev_io_start called with corrupted watcher", ((WL)w)->next != (WL)w));
3254 3270
3255 fd_change (EV_A_ fd, w->events & EV__IOFDSET | EV_ANFD_REIFY); 3271 fd_change (EV_A_ fd, w->events & EV__IOFDSET | EV_ANFD_REIFY);
3256 w->events &= ~EV__IOFDSET; 3272 w->events &= ~EV__IOFDSET;
3257 3273
3258 EV_FREQUENT_CHECK; 3274 EV_FREQUENT_CHECK;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines