rev 0.2.4 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -37,8 +37,8 @@
37
37
  * either the BSD or the GPL.
38
38
  */
39
39
 
40
- #ifndef EV_H__
41
- #define EV_H__
40
+ #ifndef EV_H_
41
+ #define EV_H_
42
42
 
43
43
  #ifdef __cplusplus
44
44
  extern "C" {
@@ -82,6 +82,10 @@ typedef double ev_tstamp;
82
82
  # define EV_ASYNC_ENABLE 1
83
83
  #endif
84
84
 
85
+ #ifndef EV_WALK_ENABLE
86
+ # define EV_WALK_ENABLE 0 /* not yet */
87
+ #endif
88
+
85
89
  #ifndef EV_ATOMIC_T
86
90
  # include <signal.h>
87
91
  # define EV_ATOMIC_T sig_atomic_t volatile
@@ -133,8 +137,10 @@ struct ev_loop;
133
137
  #define EV_NONE 0x00 /* no events */
134
138
  #define EV_READ 0x01 /* ev_io detected read will not block */
135
139
  #define EV_WRITE 0x02 /* ev_io detected write will not block */
136
- #define EV_IOFDSET 0x80 /* internal use only */
140
+ #define EV__IOFDSET 0x80 /* internal use only */
141
+ #define EV_IO EV_READ /* alias for type-detection */
137
142
  #define EV_TIMEOUT 0x00000100 /* timer timed out */
143
+ #define EV_TIMER EV_TIMEOUT /* alias for type-detection */
138
144
  #define EV_PERIODIC 0x00000200 /* periodic timer timed out */
139
145
  #define EV_SIGNAL 0x00000400 /* signal was received */
140
146
  #define EV_CHILD 0x00000800 /* child/pid had status change */
@@ -145,6 +151,7 @@ struct ev_loop;
145
151
  #define EV_EMBED 0x00010000 /* embedded event loop needs sweep */
146
152
  #define EV_FORK 0x00020000 /* event loop resumed in child */
147
153
  #define EV_ASYNC 0x00040000 /* async intra-loop signal */
154
+ #define EV_CUSTOM 0x01000000 /* for use by user code */
148
155
  #define EV_ERROR 0x80000000 /* sent when an error occurs */
149
156
 
150
157
  /* can be used to add custom fields to all watchers, while losing binary compatibility */
@@ -156,7 +163,7 @@ struct ev_loop;
156
163
  #endif
157
164
 
158
165
  #define EV_VERSION_MAJOR 3
159
- #define EV_VERSION_MINOR 0
166
+ #define EV_VERSION_MINOR 8
160
167
 
161
168
  #ifndef EV_CB_DECLARE
162
169
  # define EV_CB_DECLARE(type) void (*cb)(EV_P_ struct type *w, int revents);
@@ -182,11 +189,17 @@ struct ev_loop;
182
189
  * or the array index + 1 in the pendings array.
183
190
  */
184
191
 
192
+ #if EV_MINPRI == EV_MAXPRI
193
+ # define EV_DECL_PRIORITY
194
+ #else
195
+ # define EV_DECL_PRIORITY int priority;
196
+ #endif
197
+
185
198
  /* shared by all watchers */
186
199
  #define EV_WATCHER(type) \
187
200
  int active; /* private */ \
188
201
  int pending; /* private */ \
189
- int priority; /* private */ \
202
+ EV_DECL_PRIORITY /* private */ \
190
203
  EV_COMMON /* rw */ \
191
204
  EV_CB_DECLARE (type) /* private */
192
205
 
@@ -391,6 +404,9 @@ union ev_any_watcher
391
404
  /* flag bits */
392
405
  #define EVFLAG_NOENV 0x01000000U /* do NOT consult environment */
393
406
  #define EVFLAG_FORKCHECK 0x02000000U /* check for a fork in each iteration */
407
+ /* debugging/feature disable */
408
+ #define EVFLAG_NOINOTIFY 0x00100000U /* do not attempt to use inotify */
409
+ #define EVFLAG_NOSIGFD 0x00200000U /* do not attempt to use signalfd */
394
410
  /* method bits to be ored together */
395
411
  #define EVBACKEND_SELECT 0x00000001U /* about anywhere */
396
412
  #define EVBACKEND_POLL 0x00000002U /* !win */
@@ -454,10 +470,8 @@ ev_default_loop (unsigned int flags)
454
470
  struct ev_loop *ev_loop_new (unsigned int flags);
455
471
  void ev_loop_destroy (EV_P);
456
472
  void ev_loop_fork (EV_P);
457
- void ev_loop_verify (EV_P);
458
473
 
459
474
  ev_tstamp ev_now (EV_P); /* time w.r.t. timers and the eventloop, updated after each poll */
460
- void ev_now_update (EV_P);
461
475
 
462
476
  #else
463
477
 
@@ -491,8 +505,17 @@ void ev_default_destroy (void); /* destroy the default loop */
491
505
  /* you can actually call it at any time, anywhere :) */
492
506
  void ev_default_fork (void);
493
507
 
494
- unsigned int ev_backend (EV_P); /* backend in use by loop */
495
- unsigned int ev_loop_count (EV_P); /* number of loop iterations */
508
+ unsigned int ev_backend (EV_P); /* backend in use by loop */
509
+
510
+ void ev_now_update (EV_P); /* update event loop time */
511
+
512
+ #if EV_WALK_ENABLE
513
+ /* walk (almost) all watchers in the loop of a given type, invoking the */
514
+ /* callback on every such watcher. The callback might stop the watcher, */
515
+ /* but do nothing else with the loop */
516
+ void ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w));
517
+ #endif
518
+
496
519
  #endif /* prototypes */
497
520
 
498
521
  #define EVLOOP_NONBLOCK 1 /* do not block/wait */
@@ -505,68 +528,98 @@ unsigned int ev_loop_count (EV_P); /* number of loop iterations */
505
528
  void ev_loop (EV_P_ int flags);
506
529
  void ev_unloop (EV_P_ int how); /* set to 1 to break out of event loop, set to 2 to break out of all event loops */
507
530
 
508
- void ev_set_io_collect_interval (EV_P_ ev_tstamp interval); /* sleep at least this time, default 0 */
509
- void ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval); /* sleep at least this time, default 0 */
510
-
511
531
  /*
512
532
  * ref/unref can be used to add or remove a refcount on the mainloop. every watcher
513
- * keeps one reference. if you have a long-runing watcher you never unregister that
533
+ * keeps one reference. if you have a long-running watcher you never unregister that
514
534
  * should not keep ev_loop from running, unref() after starting, and ref() before stopping.
515
535
  */
516
536
  void ev_ref (EV_P);
517
537
  void ev_unref (EV_P);
518
538
 
519
- /* convenience function, wait for a single event, without registering an event watcher */
520
- /* if timeout is < 0, do wait indefinitely */
539
+ /*
540
+ * convenience function, wait for a single event, without registering an event watcher
541
+ * if timeout is < 0, do wait indefinitely
542
+ */
521
543
  void ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg);
544
+
545
+ # if EV_MINIMAL < 2
546
+ unsigned int ev_loop_count (EV_P); /* number of loop iterations */
547
+ unsigned int ev_loop_depth (EV_P); /* #ev_loop enters - #ev_loop leaves */
548
+ void ev_loop_verify (EV_P); /* abort if loop data corrupted */
549
+
550
+ void ev_set_io_collect_interval (EV_P_ ev_tstamp interval); /* sleep at least this time, default 0 */
551
+ void ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval); /* sleep at least this time, default 0 */
552
+
553
+ /* advanced stuff for threading etc. support, see docs */
554
+ void ev_set_userdata (EV_P_ void *data);
555
+ void *ev_userdata (EV_P);
556
+ void ev_set_invoke_pending_cb (EV_P_ void (*invoke_pending_cb)(EV_P));
557
+ void ev_set_loop_release_cb (EV_P_ void (*release)(EV_P), void (*acquire)(EV_P));
558
+
559
+ unsigned int ev_pending_count (EV_P); /* number of pending events, if any */
560
+ void ev_invoke_pending (EV_P); /* invoke all pending watchers */
561
+
562
+ /*
563
+ * stop/start the timer handling.
564
+ */
565
+ void ev_suspend (EV_P);
566
+ void ev_resume (EV_P);
567
+ #endif
568
+
522
569
  #endif
523
570
 
524
571
  /* these may evaluate ev multiple times, and the other arguments at most once */
525
572
  /* either use ev_init + ev_TYPE_set, or the ev_TYPE_init macro, below, to first initialise a watcher */
526
573
  #define ev_init(ev,cb_) do { \
527
- ((ev_watcher *)(void *)(ev))->active = \
528
- ((ev_watcher *)(void *)(ev))->pending = \
529
- ((ev_watcher *)(void *)(ev))->priority = 0; \
574
+ ((ev_watcher *)(void *)(ev))->active = \
575
+ ((ev_watcher *)(void *)(ev))->pending = 0; \
576
+ ev_set_priority ((ev), 0); \
530
577
  ev_set_cb ((ev), cb_); \
531
578
  } while (0)
532
579
 
533
- #define ev_io_set(ev,fd_,events_) do { (ev)->fd = (fd_); (ev)->events = (events_) | EV_IOFDSET; } while (0)
534
- #define ev_timer_set(ev,after_,repeat_) do { ((ev_watcher_time *)(ev))->at = (after_); (ev)->repeat = (repeat_); } while (0)
535
- #define ev_periodic_set(ev,ofs_,ival_,res_) do { (ev)->offset = (ofs_); (ev)->interval = (ival_); (ev)->reschedule_cb= (res_); } while (0)
536
- #define ev_signal_set(ev,signum_) do { (ev)->signum = (signum_); } while (0)
537
- #define ev_child_set(ev,pid_,trace_) do { (ev)->pid = (pid_); (ev)->flags = !!(trace_); } while (0)
538
- #define ev_stat_set(ev,path_,interval_) do { (ev)->path = (path_); (ev)->interval = (interval_); (ev)->wd = -2; } while (0)
539
- #define ev_idle_set(ev) /* nop, yes, this is a serious in-joke */
540
- #define ev_prepare_set(ev) /* nop, yes, this is a serious in-joke */
541
- #define ev_check_set(ev) /* nop, yes, this is a serious in-joke */
542
- #define ev_embed_set(ev,other_) do { (ev)->other = (other_); } while (0)
543
- #define ev_fork_set(ev) /* nop, yes, this is a serious in-joke */
544
- #define ev_async_set(ev) do { (ev)->sent = 0; } while (0)
545
-
546
- #define ev_io_init(ev,cb,fd,events) do { ev_init ((ev), (cb)); ev_io_set ((ev),(fd),(events)); } while (0)
547
- #define ev_timer_init(ev,cb,after,repeat) do { ev_init ((ev), (cb)); ev_timer_set ((ev),(after),(repeat)); } while (0)
548
- #define ev_periodic_init(ev,cb,at,ival,res) do { ev_init ((ev), (cb)); ev_periodic_set ((ev),(at),(ival),(res)); } while (0)
549
- #define ev_signal_init(ev,cb,signum) do { ev_init ((ev), (cb)); ev_signal_set ((ev), (signum)); } while (0)
550
- #define ev_child_init(ev,cb,pid,trace) do { ev_init ((ev), (cb)); ev_child_set ((ev),(pid),(trace)); } while (0)
551
- #define ev_stat_init(ev,cb,path,interval) do { ev_init ((ev), (cb)); ev_stat_set ((ev),(path),(interval)); } while (0)
552
- #define ev_idle_init(ev,cb) do { ev_init ((ev), (cb)); ev_idle_set ((ev)); } while (0)
553
- #define ev_prepare_init(ev,cb) do { ev_init ((ev), (cb)); ev_prepare_set ((ev)); } while (0)
554
- #define ev_check_init(ev,cb) do { ev_init ((ev), (cb)); ev_check_set ((ev)); } while (0)
555
- #define ev_embed_init(ev,cb,other) do { ev_init ((ev), (cb)); ev_embed_set ((ev),(other)); } while (0)
556
- #define ev_fork_init(ev,cb) do { ev_init ((ev), (cb)); ev_fork_set ((ev)); } while (0)
557
- #define ev_async_init(ev,cb) do { ev_init ((ev), (cb)); ev_async_set ((ev)); } while (0)
558
-
559
- #define ev_is_pending(ev) (0 + ((ev_watcher *)(void *)(ev))->pending) /* ro, true when watcher is waiting for callback invocation */
560
- #define ev_is_active(ev) (0 + ((ev_watcher *)(void *)(ev))->active) /* ro, true when the watcher has been started */
561
-
562
- #define ev_priority(ev) ((((ev_watcher *)(void *)(ev))->priority) + 0)
563
- #define ev_cb(ev) (ev)->cb /* rw */
564
- #define ev_set_priority(ev,pri) ((ev_watcher *)(void *)(ev))->priority = (pri)
565
-
566
- #define ev_periodic_at(ev) (((ev_watcher_time *)(ev))->at + 0.)
580
+ #define ev_io_set(ev,fd_,events_) do { (ev)->fd = (fd_); (ev)->events = (events_) | EV__IOFDSET; } while (0)
581
+ #define ev_timer_set(ev,after_,repeat_) do { ((ev_watcher_time *)(ev))->at = (after_); (ev)->repeat = (repeat_); } while (0)
582
+ #define ev_periodic_set(ev,ofs_,ival_,rcb_) do { (ev)->offset = (ofs_); (ev)->interval = (ival_); (ev)->reschedule_cb = (rcb_); } while (0)
583
+ #define ev_signal_set(ev,signum_) do { (ev)->signum = (signum_); } while (0)
584
+ #define ev_child_set(ev,pid_,trace_) do { (ev)->pid = (pid_); (ev)->flags = !!(trace_); } while (0)
585
+ #define ev_stat_set(ev,path_,interval_) do { (ev)->path = (path_); (ev)->interval = (interval_); (ev)->wd = -2; } while (0)
586
+ #define ev_idle_set(ev) /* nop, yes, this is a serious in-joke */
587
+ #define ev_prepare_set(ev) /* nop, yes, this is a serious in-joke */
588
+ #define ev_check_set(ev) /* nop, yes, this is a serious in-joke */
589
+ #define ev_embed_set(ev,other_) do { (ev)->other = (other_); } while (0)
590
+ #define ev_fork_set(ev) /* nop, yes, this is a serious in-joke */
591
+ #define ev_async_set(ev) do { (ev)->sent = 0; } while (0)
592
+
593
+ #define ev_io_init(ev,cb,fd,events) do { ev_init ((ev), (cb)); ev_io_set ((ev),(fd),(events)); } while (0)
594
+ #define ev_timer_init(ev,cb,after,repeat) do { ev_init ((ev), (cb)); ev_timer_set ((ev),(after),(repeat)); } while (0)
595
+ #define ev_periodic_init(ev,cb,ofs,ival,rcb) do { ev_init ((ev), (cb)); ev_periodic_set ((ev),(ofs),(ival),(rcb)); } while (0)
596
+ #define ev_signal_init(ev,cb,signum) do { ev_init ((ev), (cb)); ev_signal_set ((ev), (signum)); } while (0)
597
+ #define ev_child_init(ev,cb,pid,trace) do { ev_init ((ev), (cb)); ev_child_set ((ev),(pid),(trace)); } while (0)
598
+ #define ev_stat_init(ev,cb,path,interval) do { ev_init ((ev), (cb)); ev_stat_set ((ev),(path),(interval)); } while (0)
599
+ #define ev_idle_init(ev,cb) do { ev_init ((ev), (cb)); ev_idle_set ((ev)); } while (0)
600
+ #define ev_prepare_init(ev,cb) do { ev_init ((ev), (cb)); ev_prepare_set ((ev)); } while (0)
601
+ #define ev_check_init(ev,cb) do { ev_init ((ev), (cb)); ev_check_set ((ev)); } while (0)
602
+ #define ev_embed_init(ev,cb,other) do { ev_init ((ev), (cb)); ev_embed_set ((ev),(other)); } while (0)
603
+ #define ev_fork_init(ev,cb) do { ev_init ((ev), (cb)); ev_fork_set ((ev)); } while (0)
604
+ #define ev_async_init(ev,cb) do { ev_init ((ev), (cb)); ev_async_set ((ev)); } while (0)
605
+
606
+ #define ev_is_pending(ev) (0 + ((ev_watcher *)(void *)(ev))->pending) /* ro, true when watcher is waiting for callback invocation */
607
+ #define ev_is_active(ev) (0 + ((ev_watcher *)(void *)(ev))->active) /* ro, true when the watcher has been started */
608
+
609
+ #define ev_cb(ev) (ev)->cb /* rw */
610
+
611
+ #if EV_MINPRI == EV_MAXPRI
612
+ # define ev_priority(ev) ((ev), EV_MINPRI)
613
+ # define ev_set_priority(ev,pri) ((ev), (pri))
614
+ #else
615
+ # define ev_priority(ev) ((((ev_watcher *)(void *)(ev))->priority) + 0)
616
+ # define ev_set_priority(ev,pri) ( (ev_watcher *)(void *)(ev))->priority = (pri)
617
+ #endif
618
+
619
+ #define ev_periodic_at(ev) (((ev_watcher_time *)(ev))->at + 0.)
567
620
 
568
621
  #ifndef ev_set_cb
569
- # define ev_set_cb(ev,cb_) ev_cb (ev) = (cb_)
622
+ # define ev_set_cb(ev,cb_) ev_cb (ev) = (cb_)
570
623
  #endif
571
624
 
572
625
  /* stopping (enabling, adding) a watcher does nothing if it is already running */
@@ -588,6 +641,8 @@ void ev_timer_start (EV_P_ ev_timer *w);
588
641
  void ev_timer_stop (EV_P_ ev_timer *w);
589
642
  /* stops if active and no repeat, restarts if active and repeating, starts if inactive and repeating */
590
643
  void ev_timer_again (EV_P_ ev_timer *w);
644
+ /* return remaining time */
645
+ ev_tstamp ev_timer_remaining (EV_P_ ev_timer *w);
591
646
 
592
647
  #if EV_PERIODIC_ENABLE
593
648
  void ev_periodic_start (EV_P_ ev_periodic *w);
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libev epoll fd activity backend
3
3
  *
4
- * Copyright (c) 2007,2008 Marc Alexander Lehmann <libev@schmorp.de>
4
+ * Copyright (c) 2007,2008,2009 Marc Alexander Lehmann <libev@schmorp.de>
5
5
  * All rights reserved.
6
6
  *
7
7
  * Redistribution and use in source and binary forms, with or without modifica-
@@ -119,7 +119,13 @@ static void
119
119
  epoll_poll (EV_P_ ev_tstamp timeout)
120
120
  {
121
121
  int i;
122
- int eventcnt = epoll_wait (backend_fd, epoll_events, epoll_eventmax, (int)ceil (timeout * 1000.));
122
+ int eventcnt;
123
+
124
+ /* epoll wait times cannot be larger than (LONG_MAX - 999UL) / HZ msecs, which is below */
125
+ /* the default libev max wait time, however. */
126
+ EV_RELEASE_CB;
127
+ eventcnt = epoll_wait (backend_fd, epoll_events, epoll_eventmax, (int)ceil (timeout * 1000.));
128
+ EV_ACQUIRE_CB;
123
129
 
124
130
  if (expect_false (eventcnt < 0))
125
131
  {
@@ -177,7 +183,12 @@ epoll_poll (EV_P_ ev_tstamp timeout)
177
183
  int inline_size
178
184
  epoll_init (EV_P_ int flags)
179
185
  {
180
- backend_fd = epoll_create (256);
186
+ #ifdef EPOLL_CLOEXEC
187
+ backend_fd = epoll_create1 (EPOLL_CLOEXEC);
188
+
189
+ if (backend_fd <= 0)
190
+ #endif
191
+ backend_fd = epoll_create (256);
181
192
 
182
193
  if (backend_fd < 0)
183
194
  return 0;
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libev kqueue backend
3
3
  *
4
- * Copyright (c) 2007,2008 Marc Alexander Lehmann <libev@schmorp.de>
4
+ * Copyright (c) 2007,2008,2009 Marc Alexander Lehmann <libev@schmorp.de>
5
5
  * All rights reserved.
6
6
  *
7
7
  * Redistribution and use in source and binary forms, with or without modifica-
@@ -93,9 +93,11 @@ kqueue_poll (EV_P_ ev_tstamp timeout)
93
93
  kqueue_events = (struct kevent *)ev_malloc (sizeof (struct kevent) * kqueue_eventmax);
94
94
  }
95
95
 
96
+ EV_RELEASE_CB;
96
97
  ts.tv_sec = (time_t)timeout;
97
98
  ts.tv_nsec = (long)((timeout - (ev_tstamp)ts.tv_sec) * 1e9);
98
99
  res = kevent (backend_fd, kqueue_changes, kqueue_changecnt, kqueue_events, kqueue_eventmax, &ts);
100
+ EV_ACQUIRE_CB;
99
101
  kqueue_changecnt = 0;
100
102
 
101
103
  if (expect_false (res < 0))
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libev poll fd activity backend
3
3
  *
4
- * Copyright (c) 2007,2008 Marc Alexander Lehmann <libev@schmorp.de>
4
+ * Copyright (c) 2007,2008,2009 Marc Alexander Lehmann <libev@schmorp.de>
5
5
  * All rights reserved.
6
6
  *
7
7
  * Redistribution and use in source and binary forms, with or without modifica-
@@ -89,7 +89,11 @@ static void
89
89
  poll_poll (EV_P_ ev_tstamp timeout)
90
90
  {
91
91
  struct pollfd *p;
92
- int res = poll (polls, pollcnt, (int)ceil (timeout * 1000.));
92
+ int res;
93
+
94
+ EV_RELEASE_CB;
95
+ res = poll (polls, pollcnt, (int)ceil (timeout * 1000.));
96
+ EV_ACQUIRE_CB;
93
97
 
94
98
  if (expect_false (res < 0))
95
99
  {
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * libev solaris event port backend
3
3
  *
4
- * Copyright (c) 2007,2008 Marc Alexander Lehmann <libev@schmorp.de>
4
+ * Copyright (c) 2007,2008,2009 Marc Alexander Lehmann <libev@schmorp.de>
5
5
  * All rights reserved.
6
6
  *
7
7
  * Redistribution and use in source and binary forms, with or without modifica-
@@ -85,9 +85,11 @@ port_poll (EV_P_ ev_tstamp timeout)
85
85
  struct timespec ts;
86
86
  uint_t nget = 1;
87
87
 
88
+ EV_RELEASE_CB;
88
89
  ts.tv_sec = (time_t)timeout;
89
90
  ts.tv_nsec = (long)(timeout - (ev_tstamp)ts.tv_sec) * 1e9;
90
91
  res = port_getn (backend_fd, port_events, port_eventmax, &nget, &ts);
92
+ EV_ACQUIRE_CB;
91
93
 
92
94
  if (res == -1)
93
95
  {
@@ -140,6 +140,7 @@ select_poll (EV_P_ ev_tstamp timeout)
140
140
  int res;
141
141
  int fd_setsize;
142
142
 
143
+ EV_RELEASE_CB;
143
144
  tv.tv_sec = (long)timeout;
144
145
  tv.tv_usec = (long)((timeout - (ev_tstamp)tv.tv_sec) * 1e6);
145
146
 
@@ -166,6 +167,7 @@ select_poll (EV_P_ ev_tstamp timeout)
166
167
  #else
167
168
  res = select (vec_max * NFDBITS, (fd_set *)vec_ro, (fd_set *)vec_wo, 0, &tv);
168
169
  #endif
170
+ EV_ACQUIRE_CB;
169
171
 
170
172
  if (expect_false (res < 0))
171
173
  {
@@ -280,9 +282,12 @@ select_init (EV_P_ int flags)
280
282
  #else
281
283
  vec_max = 0;
282
284
  vec_ri = 0;
283
- vec_ri = 0;
284
- vec_wo = 0;
285
+ vec_ro = 0;
286
+ vec_wi = 0;
285
287
  vec_wo = 0;
288
+ #ifdef _WIN32
289
+ vec_eo = 0;
290
+ #endif
286
291
  #endif
287
292
 
288
293
  return EVBACKEND_SELECT;
@@ -295,6 +300,9 @@ select_destroy (EV_P)
295
300
  ev_free (vec_ro);
296
301
  ev_free (vec_wi);
297
302
  ev_free (vec_wo);
303
+ #ifdef _WIN32
304
+ ev_free (vec_eo);
305
+ #endif
298
306
  }
299
307
 
300
308
 
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * loop member variable declarations
3
3
  *
4
- * Copyright (c) 2007,2008 Marc Alexander Lehmann <libev@schmorp.de>
4
+ * Copyright (c) 2007,2008,2009 Marc Alexander Lehmann <libev@schmorp.de>
5
5
  * All rights reserved.
6
6
  *
7
7
  * Redistribution and use in source and binary forms, with or without modifica-
@@ -48,18 +48,31 @@ VARx(ev_tstamp, timeout_blocktime)
48
48
 
49
49
  VARx(int, backend)
50
50
  VARx(int, activecnt) /* total number of active events ("refcount") */
51
- VARx(unsigned int, loop_count) /* total number of loop iterations/blocks */
51
+ VARx(unsigned char, loop_done) /* signal by ev_unloop */
52
52
 
53
53
  VARx(int, backend_fd)
54
54
  VARx(ev_tstamp, backend_fudge) /* assumed typical timer resolution */
55
55
  VAR (backend_modify, void (*backend_modify)(EV_P_ int fd, int oev, int nev))
56
56
  VAR (backend_poll , void (*backend_poll)(EV_P_ ev_tstamp timeout))
57
57
 
58
+ VARx(ANFD *, anfds)
59
+ VARx(int, anfdmax)
60
+
61
+ VAR (pendings, ANPENDING *pendings [NUMPRI])
62
+ VAR (pendingmax, int pendingmax [NUMPRI])
63
+ VAR (pendingcnt, int pendingcnt [NUMPRI])
64
+ VARx(ev_prepare, pending_w) /* dummy pending watcher */
65
+
66
+ /* for reverse feeding of events */
67
+ VARx(W *, rfeeds)
68
+ VARx(int, rfeedmax)
69
+ VARx(int, rfeedcnt)
70
+
58
71
  #if EV_USE_EVENTFD || EV_GENWRAP
59
72
  VARx(int, evfd)
60
73
  #endif
61
74
  VAR (evpipe, int evpipe [2])
62
- VARx(ev_io, pipeev)
75
+ VARx(ev_io, pipe_w)
63
76
 
64
77
  #if !defined(_WIN32) || EV_GENWRAP
65
78
  VARx(pid_t, curpid)
@@ -104,13 +117,6 @@ VARx(struct port_event *, port_events)
104
117
  VARx(int, port_eventmax)
105
118
  #endif
106
119
 
107
- VARx(ANFD *, anfds)
108
- VARx(int, anfdmax)
109
-
110
- VAR (pendings, ANPENDING *pendings [NUMPRI])
111
- VAR (pendingmax, int pendingmax [NUMPRI])
112
- VAR (pendingcnt, int pendingcnt [NUMPRI])
113
-
114
120
  VARx(int *, fdchanges)
115
121
  VARx(int, fdchangemax)
116
122
  VARx(int, fdchangecnt)
@@ -146,8 +152,8 @@ VARx(int, forkmax)
146
152
  VARx(int, forkcnt)
147
153
  #endif
148
154
 
149
- VARx(EV_ATOMIC_T, gotasync)
150
155
  #if EV_ASYNC_ENABLE || EV_GENWRAP
156
+ VARx(EV_ATOMIC_T, async_pending)
151
157
  VARx(struct ev_async **, asyncs)
152
158
  VARx(int, asyncmax)
153
159
  VARx(int, asynccnt)
@@ -160,5 +166,22 @@ VARx(char, fs_2625) /* whether we are running in linux 2.6.25 or newer */
160
166
  VAR (fs_hash, ANFS fs_hash [EV_INOTIFY_HASHSIZE])
161
167
  #endif
162
168
 
169
+ VARx(EV_ATOMIC_T, sig_pending)
170
+ #if EV_USE_SIGNALFD || EV_GENWRAP
171
+ VARx(int, sigfd)
172
+ VARx(ev_io, sigfd_w)
173
+ VARx(sigset_t, sigfd_set)
174
+ #endif
175
+
176
+ #if EV_MINIMAL < 2 || EV_GENWRAP
177
+ VARx(unsigned int, loop_count) /* total number of loop iterations/blocks */
178
+ VARx(unsigned int, loop_depth) /* #ev_loop enters - #ev_loop leaves */
179
+
180
+ VARx(void *, userdata)
181
+ VAR (release_cb, void (*release_cb)(EV_P))
182
+ VAR (acquire_cb, void (*acquire_cb)(EV_P))
183
+ VAR (invoke_cb , void (*invoke_cb) (EV_P))
184
+ #endif
185
+
163
186
  #undef VARx
164
187