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

Comparing libev/ev.c (file contents):
Revision 1.78 by root, Thu Nov 8 21:08:56 2007 UTC vs.
Revision 1.84 by root, Fri Nov 9 23:04:35 2007 UTC

126#define MIN_TIMEJUMP 1. /* minimum timejump that gets detected (if monotonic clock available) */ 126#define MIN_TIMEJUMP 1. /* minimum timejump that gets detected (if monotonic clock available) */
127#define MAX_BLOCKTIME 59.731 /* never wait longer than this time (to detect time jumps) */ 127#define MAX_BLOCKTIME 59.731 /* never wait longer than this time (to detect time jumps) */
128#define PID_HASHSIZE 16 /* size of pid hash table, must be power of two */ 128#define PID_HASHSIZE 16 /* size of pid hash table, must be power of two */
129/*#define CLEANUP_INTERVAL 300. /* how often to try to free memory and re-check fds */ 129/*#define CLEANUP_INTERVAL 300. /* how often to try to free memory and re-check fds */
130 130
131#ifdef EV_H
132# include EV_H
133#else
131#include "ev.h" 134# include "ev.h"
135#endif
132 136
133#if __GNUC__ >= 3 137#if __GNUC__ >= 3
134# define expect(expr,value) __builtin_expect ((expr),(value)) 138# define expect(expr,value) __builtin_expect ((expr),(value))
135# define inline inline 139# define inline inline
136#else 140#else
215 int events; 219 int events;
216} ANPENDING; 220} ANPENDING;
217 221
218#if EV_MULTIPLICITY 222#if EV_MULTIPLICITY
219 223
220struct ev_loop 224 struct ev_loop
221{ 225 {
222# define VAR(name,decl) decl; 226 #define VAR(name,decl) decl;
223# include "ev_vars.h" 227 #include "ev_vars.h"
224};
225# undef VAR 228 #undef VAR
229 };
226# include "ev_wrap.h" 230 #include "ev_wrap.h"
231
232 struct ev_loop default_loop_struct;
233 static struct ev_loop *default_loop;
227 234
228#else 235#else
229 236
230# define VAR(name,decl) static decl; 237 #define VAR(name,decl) static decl;
231# include "ev_vars.h" 238 #include "ev_vars.h"
232# undef VAR 239 #undef VAR
240
241 static int default_loop;
233 242
234#endif 243#endif
235 244
236/*****************************************************************************/ 245/*****************************************************************************/
237 246
342 351
343 for (i = 0; i < eventcnt; ++i) 352 for (i = 0; i < eventcnt; ++i)
344 ev_feed_event (EV_A_ events [i], type); 353 ev_feed_event (EV_A_ events [i], type);
345} 354}
346 355
347static void 356inline void
348fd_event (EV_P_ int fd, int events) 357fd_event (EV_P_ int fd, int revents)
349{ 358{
350 ANFD *anfd = anfds + fd; 359 ANFD *anfd = anfds + fd;
351 struct ev_io *w; 360 struct ev_io *w;
352 361
353 for (w = (struct ev_io *)anfd->head; w; w = (struct ev_io *)((WL)w)->next) 362 for (w = (struct ev_io *)anfd->head; w; w = (struct ev_io *)((WL)w)->next)
354 { 363 {
355 int ev = w->events & events; 364 int ev = w->events & revents;
356 365
357 if (ev) 366 if (ev)
358 ev_feed_event (EV_A_ (W)w, ev); 367 ev_feed_event (EV_A_ (W)w, ev);
359 } 368 }
369}
370
371void
372ev_feed_fd_event (EV_P_ int fd, int revents)
373{
374 fd_event (EV_A_ fd, revents);
360} 375}
361 376
362/*****************************************************************************/ 377/*****************************************************************************/
363 378
364static void 379static void
503 518
504 heap [k] = w; 519 heap [k] = w;
505 ((W)heap [k])->active = k + 1; 520 ((W)heap [k])->active = k + 1;
506} 521}
507 522
523inline void
524adjustheap (WT *heap, int N, int k, ev_tstamp at)
525{
526 ev_tstamp old_at = heap [k]->at;
527 heap [k]->at = at;
528
529 if (old_at < at)
530 downheap (heap, N, k);
531 else
532 upheap (heap, k);
533}
534
508/*****************************************************************************/ 535/*****************************************************************************/
509 536
510typedef struct 537typedef struct
511{ 538{
512 WL head; 539 WL head;
552#endif 579#endif
553 errno = old_errno; 580 errno = old_errno;
554 } 581 }
555} 582}
556 583
584void
585ev_feed_signal_event (EV_P_ int signum)
586{
587 WL w;
588
589#if EV_MULTIPLICITY
590 assert (("feeding signal events is only supported in the default loop", loop == default_loop));
591#endif
592
593 --signum;
594
595 if (signum < 0 || signum >= signalmax)
596 return;
597
598 signals [signum].gotsig = 0;
599
600 for (w = signals [signum].head; w; w = w->next)
601 ev_feed_event (EV_A_ (W)w, EV_SIGNAL);
602}
603
557static void 604static void
558sigcb (EV_P_ struct ev_io *iow, int revents) 605sigcb (EV_P_ struct ev_io *iow, int revents)
559{ 606{
560 WL w;
561 int signum; 607 int signum;
562 608
563#ifdef WIN32 609#ifdef WIN32
564 recv (sigpipe [0], &revents, 1, MSG_DONTWAIT); 610 recv (sigpipe [0], &revents, 1, MSG_DONTWAIT);
565#else 611#else
567#endif 613#endif
568 gotsig = 0; 614 gotsig = 0;
569 615
570 for (signum = signalmax; signum--; ) 616 for (signum = signalmax; signum--; )
571 if (signals [signum].gotsig) 617 if (signals [signum].gotsig)
572 { 618 ev_feed_signal_event (EV_A_ signum + 1);
573 signals [signum].gotsig = 0;
574
575 for (w = signals [signum].head; w; w = w->next)
576 ev_feed_event (EV_A_ (W)w, EV_SIGNAL);
577 }
578} 619}
579 620
580static void 621static void
581siginit (EV_P) 622siginit (EV_P)
582{ 623{
722#endif 763#endif
723#if EV_USE_SELECT 764#if EV_USE_SELECT
724 if (!method && (methods & EVMETHOD_SELECT)) method = select_init (EV_A_ methods); 765 if (!method && (methods & EVMETHOD_SELECT)) method = select_init (EV_A_ methods);
725#endif 766#endif
726 767
727 ev_watcher_init (&sigev, sigcb); 768 ev_init (&sigev, sigcb);
728 ev_set_priority (&sigev, EV_MAXPRI); 769 ev_set_priority (&sigev, EV_MAXPRI);
729 } 770 }
730} 771}
731 772
732void 773void
822} 863}
823 864
824#endif 865#endif
825 866
826#if EV_MULTIPLICITY 867#if EV_MULTIPLICITY
827struct ev_loop default_loop_struct;
828static struct ev_loop *default_loop;
829
830struct ev_loop * 868struct ev_loop *
831#else 869#else
832static int default_loop;
833
834int 870int
835#endif 871#endif
836ev_default_loop (int methods) 872ev_default_loop (int methods)
837{ 873{
838 if (sigpipe [0] == sigpipe [1]) 874 if (sigpipe [0] == sigpipe [1])
924 ANPENDING *p = pendings [pri] + --pendingcnt [pri]; 960 ANPENDING *p = pendings [pri] + --pendingcnt [pri];
925 961
926 if (p->w) 962 if (p->w)
927 { 963 {
928 p->w->pending = 0; 964 p->w->pending = 0;
929 p->w->cb (EV_A_ p->w, p->events); 965 EV_CB_INVOKE (p->w, p->events);
930 } 966 }
931 } 967 }
932} 968}
933 969
934static void 970static void
1297ev_timer_again (EV_P_ struct ev_timer *w) 1333ev_timer_again (EV_P_ struct ev_timer *w)
1298{ 1334{
1299 if (ev_is_active (w)) 1335 if (ev_is_active (w))
1300 { 1336 {
1301 if (w->repeat) 1337 if (w->repeat)
1302 {
1303 ((WT)w)->at = mn_now + w->repeat;
1304 downheap ((WT *)timers, timercnt, ((W)w)->active - 1); 1338 adjustheap ((WT *)timers, timercnt, ((W)w)->active - 1, mn_now + w->repeat);
1305 }
1306 else 1339 else
1307 ev_timer_stop (EV_A_ w); 1340 ev_timer_stop (EV_A_ w);
1308 } 1341 }
1309 else if (w->repeat) 1342 else if (w->repeat)
1310 ev_timer_start (EV_A_ w); 1343 ev_timer_start (EV_A_ w);
1352} 1385}
1353 1386
1354void 1387void
1355ev_periodic_again (EV_P_ struct ev_periodic *w) 1388ev_periodic_again (EV_P_ struct ev_periodic *w)
1356{ 1389{
1390 /* TODO: use adjustheap and recalculation */
1357 ev_periodic_stop (EV_A_ w); 1391 ev_periodic_stop (EV_A_ w);
1358 ev_periodic_start (EV_A_ w); 1392 ev_periodic_start (EV_A_ w);
1359} 1393}
1360 1394
1361void 1395void
1540 else 1574 else
1541 { 1575 {
1542 once->cb = cb; 1576 once->cb = cb;
1543 once->arg = arg; 1577 once->arg = arg;
1544 1578
1545 ev_watcher_init (&once->io, once_cb_io); 1579 ev_init (&once->io, once_cb_io);
1546 if (fd >= 0) 1580 if (fd >= 0)
1547 { 1581 {
1548 ev_io_set (&once->io, fd, events); 1582 ev_io_set (&once->io, fd, events);
1549 ev_io_start (EV_A_ &once->io); 1583 ev_io_start (EV_A_ &once->io);
1550 } 1584 }
1551 1585
1552 ev_watcher_init (&once->to, once_cb_to); 1586 ev_init (&once->to, once_cb_to);
1553 if (timeout >= 0.) 1587 if (timeout >= 0.)
1554 { 1588 {
1555 ev_timer_set (&once->to, timeout, 0.); 1589 ev_timer_set (&once->to, timeout, 0.);
1556 ev_timer_start (EV_A_ &once->to); 1590 ev_timer_start (EV_A_ &once->to);
1557 } 1591 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines