… | |
… | |
13 | #endif |
13 | #endif |
14 | |
14 | |
15 | #define EV_COMMON \ |
15 | #define EV_COMMON \ |
16 | int e_flags; /* cheap on 64 bit systems */ \ |
16 | int e_flags; /* cheap on 64 bit systems */ \ |
17 | SV *loop; \ |
17 | SV *loop; \ |
18 | SV *self; /* contains this struct */ \ |
18 | SV *self; /* contains this struct */ \ |
19 | SV *cb_sv, *fh, *data; |
19 | SV *cb_sv, *fh, *data; |
20 | |
20 | |
21 | #ifndef EV_PROTOTYPES |
21 | #ifndef EV_PROTOTYPES |
22 | # define EV_PROTOTYPES 0 |
22 | # define EV_PROTOTYPES 0 |
23 | #endif |
23 | #endif |
… | |
… | |
26 | # define EV_H <EV/ev.h> |
26 | # define EV_H <EV/ev.h> |
27 | #endif |
27 | #endif |
28 | |
28 | |
29 | #include EV_H |
29 | #include EV_H |
30 | |
30 | |
31 | #define EV_STANDALONE 1 |
|
|
32 | #define EV_MULTIPLICITY 1 |
|
|
33 | |
|
|
34 | struct EVAPI { |
31 | struct EVAPI { |
35 | I32 ver; |
32 | I32 ver; |
36 | I32 rev; |
33 | I32 rev; |
37 | #define EV_API_VERSION 4 |
34 | #define EV_API_VERSION 5 |
38 | #define EV_API_REVISION 5 |
35 | #define EV_API_REVISION 0 |
39 | |
36 | |
40 | struct ev_loop *default_loop; |
37 | struct ev_loop *default_loop; |
41 | unsigned int supported_backends; |
38 | unsigned int supported_backends; |
42 | unsigned int recommended_backends; |
39 | unsigned int recommended_backends; |
43 | unsigned int embeddable_backends; |
40 | unsigned int embeddable_backends; |
… | |
… | |
49 | int (*sv_signum) (SV *fh); |
46 | int (*sv_signum) (SV *fh); |
50 | |
47 | |
51 | /* same as libev functions */ |
48 | /* same as libev functions */ |
52 | ev_tstamp (*time_)(void); |
49 | ev_tstamp (*time_)(void); |
53 | void (*sleep_)(ev_tstamp); |
50 | void (*sleep_)(ev_tstamp); |
54 | ev_tstamp (*now)(EV_P); |
51 | |
55 | struct ev_loop *(*loop_new)(unsigned int); |
52 | struct ev_loop *(*loop_new)(unsigned int); |
56 | void (*loop_destroy)(EV_P); |
53 | void (*loop_destroy)(EV_P); |
57 | void (*loop_fork)(EV_P); |
54 | void (*loop_fork)(EV_P); |
|
|
55 | unsigned int (*backend)(EV_P); |
58 | unsigned int (*loop_count)(EV_P); |
56 | unsigned int (*loop_count)(EV_P); |
59 | unsigned int (*backend)(EV_P); |
57 | unsigned int (*loop_depth)(EV_P); |
|
|
58 | ev_tstamp (*now)(EV_P); |
|
|
59 | void (*now_update)(EV_P); |
60 | void (*loop)(EV_P_ int flags); |
60 | void (*loop)(EV_P_ int flags); |
61 | void (*unloop)(EV_P_ int how); |
61 | void (*unloop)(EV_P_ int how); |
|
|
62 | void (*suspend)(EV_P); |
|
|
63 | void (*resume) (EV_P); |
62 | void (*ref)(EV_P); |
64 | void (*ref) (EV_P); |
63 | void (*unref)(EV_P); |
65 | void (*unref)(EV_P); |
|
|
66 | void (*set_userdata)(EV_P_ void *data); |
|
|
67 | void *(*userdata) (EV_P); |
|
|
68 | void (*set_loop_release_cb) (EV_P_ void (*release)(EV_P), void (*acquire)(EV_P)); |
|
|
69 | void (*set_invoke_pending_cb)(EV_P_ void (*invoke_pending_cb)(EV_P)); |
|
|
70 | unsigned int (*pending_count)(EV_P); |
|
|
71 | void (*invoke_pending) (EV_P); |
|
|
72 | |
64 | void (*once)(EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg); |
73 | void (*once)(EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg); |
|
|
74 | |
|
|
75 | void (*invoke)(EV_P_ void *, int); |
65 | int (*clear_pending)(EV_P_ void *); |
76 | int (*clear_pending)(EV_P_ void *); |
66 | void (*invoke)(EV_P_ void *, int); |
77 | |
67 | void (*io_start)(EV_P_ ev_io *); |
78 | void (*io_start)(EV_P_ ev_io *); |
68 | void (*io_stop) (EV_P_ ev_io *); |
79 | void (*io_stop) (EV_P_ ev_io *); |
69 | void (*timer_start)(EV_P_ ev_timer *); |
80 | void (*timer_start)(EV_P_ ev_timer *); |
70 | void (*timer_stop) (EV_P_ ev_timer *); |
81 | void (*timer_stop) (EV_P_ ev_timer *); |
71 | void (*timer_again)(EV_P_ ev_timer *); |
82 | void (*timer_again)(EV_P_ ev_timer *); |
|
|
83 | ev_tstamp (*timer_remaining) (EV_P_ ev_timer *); |
72 | void (*periodic_start)(EV_P_ ev_periodic *); |
84 | void (*periodic_start)(EV_P_ ev_periodic *); |
73 | void (*periodic_stop) (EV_P_ ev_periodic *); |
85 | void (*periodic_stop) (EV_P_ ev_periodic *); |
74 | void (*signal_start)(EV_P_ ev_signal *); |
86 | void (*signal_start)(EV_P_ ev_signal *); |
75 | void (*signal_stop) (EV_P_ ev_signal *); |
87 | void (*signal_stop) (EV_P_ ev_signal *); |
76 | void (*child_start)(EV_P_ ev_child *); |
88 | void (*child_start)(EV_P_ ev_child *); |
… | |
… | |
90 | void (*fork_start) (EV_P_ ev_fork *); |
102 | void (*fork_start) (EV_P_ ev_fork *); |
91 | void (*fork_stop) (EV_P_ ev_fork *); |
103 | void (*fork_stop) (EV_P_ ev_fork *); |
92 | void (*async_start)(EV_P_ ev_async *); |
104 | void (*async_start)(EV_P_ ev_async *); |
93 | void (*async_stop) (EV_P_ ev_async *); |
105 | void (*async_stop) (EV_P_ ev_async *); |
94 | void (*async_send) (EV_P_ ev_async *); |
106 | void (*async_send) (EV_P_ ev_async *); |
95 | /* TODO: move up on next major API bump */ |
|
|
96 | void (*now_update) (EV_P); |
|
|
97 | void (*suspend) (EV_P); |
|
|
98 | void (*resume) (EV_P); |
|
|
99 | unsigned int (*loop_depth)(EV_P); |
|
|
100 | void (*set_userdata)(EV_P_ void *data); |
|
|
101 | void *(*userdata) (EV_P); |
|
|
102 | void (*set_loop_release_cb) (EV_P_ void (*release)(EV_P), void (*acquire)(EV_P)); |
|
|
103 | void (*set_invoke_pending_cb)(EV_P_ void (*invoke_pending_cb)(EV_P)); |
|
|
104 | void (*invoke_pending) (EV_P); |
|
|
105 | unsigned int (*pending_count)(EV_P); |
|
|
106 | ev_tstamp (*timer_remaining) (EV_P_ ev_timer *); |
|
|
107 | }; |
107 | }; |
108 | |
108 | |
109 | #if !EV_PROTOTYPES |
109 | #if !EV_PROTOTYPES |
110 | # undef EV_DEFAULT |
110 | # undef EV_DEFAULT |
111 | # undef EV_DEFAULT_ |
111 | # undef EV_DEFAULT_ |
… | |
… | |
118 | # define ev_recommended_backends() GEVAPI->recommended_backends |
118 | # define ev_recommended_backends() GEVAPI->recommended_backends |
119 | # define ev_embeddable_backends() GEVAPI->embeddable_backends |
119 | # define ev_embeddable_backends() GEVAPI->embeddable_backends |
120 | |
120 | |
121 | # define sv_fileno(sv) GEVAPI->sv_fileno (sv) |
121 | # define sv_fileno(sv) GEVAPI->sv_fileno (sv) |
122 | # define sv_signum(sv) GEVAPI->sv_signum (sv) |
122 | # define sv_signum(sv) GEVAPI->sv_signum (sv) |
|
|
123 | |
123 | # define ev_time() GEVAPI->time_ () |
124 | # define ev_time() GEVAPI->time_ () |
124 | # define ev_sleep(time) GEVAPI->sleep_ ((time)) |
125 | # define ev_sleep(time) GEVAPI->sleep_ ((time)) |
|
|
126 | |
125 | # define ev_loop_new(flags) GEVAPI->loop_new ((flags)) |
127 | # define ev_loop_new(flags) GEVAPI->loop_new ((flags)) |
126 | # define ev_loop_destroy(loop) GEVAPI->loop_destroy ((loop)) |
128 | # define ev_loop_destroy(loop) GEVAPI->loop_destroy ((loop)) |
127 | # define ev_loop_fork(loop) GEVAPI->loop_fork ((loop)) |
129 | # define ev_loop_fork(loop) GEVAPI->loop_fork ((loop)) |
|
|
130 | # define ev_backend(loop) GEVAPI->backend ((loop)) |
128 | # define ev_loop_count(loop) GEVAPI->loop_count ((loop)) |
131 | # define ev_loop_count(loop) GEVAPI->loop_count ((loop)) |
|
|
132 | # define ev_loop_depth(loop) GEVAPI->loop_count ((depth)) |
|
|
133 | # define ev_now(loop) GEVAPI->now ((loop)) |
|
|
134 | # define ev_now_update(loop) GEVAPI->now_update ((loop)) |
|
|
135 | # define ev_loop(l,flags) GEVAPI->loop ((l), (flags)) |
|
|
136 | # define ev_unloop(loop,how) GEVAPI->unloop ((loop), (how)) |
|
|
137 | # define ev_suspend(loop) GEVAPI->suspend ((loop)) |
|
|
138 | # define ev_resume(loop) GEVAPI->resume ((loop)) |
|
|
139 | # define ev_ref(loop) GEVAPI->ref (loop) |
|
|
140 | # define ev_unref(loop) GEVAPI->unref (loop) |
129 | # define ev_set_userdata(l,p) GEVAPI->set_userdata ((l), (p)) |
141 | # define ev_set_userdata(l,p) GEVAPI->set_userdata ((l), (p)) |
130 | # define ev_userdata(l) GEVAPI->userdata (l) |
142 | # define ev_userdata(l) GEVAPI->userdata (l) |
131 | # define ev_now(loop) GEVAPI->now ((loop)) |
143 | # define ev_set_loop_release_cb(l,r,a) GEVAPI->set_loop_release_cb ((l), (r), (a)) |
132 | # define ev_now_update(loop) GEVAPI->now_update ((loop)) |
144 | # define ev_set_invoke_pending_cb(l,c) GEVAPI->set_invoke_pending_cb ((l), (c)) |
133 | # define ev_suspend(loop) GEVAPI->suspend ((loop)) |
|
|
134 | # define ev_resume(loop) GEVAPI->resume ((loop)) |
|
|
135 | # define ev_backend(loop) GEVAPI->backend ((loop)) |
|
|
136 | # define ev_loop(l,flags) GEVAPI->loop ((l), (flags)) |
|
|
137 | # define ev_unloop(loop,how) GEVAPI->unloop ((loop), (how)) |
|
|
138 | # define ev_invoke_pending(l) GEVAPI->invoke_pending ((l)) |
145 | # define ev_invoke_pending(l) GEVAPI->invoke_pending ((l)) |
139 | # define ev_pending_count(l) GEVAPI->pending_count ((l)) |
146 | # define ev_pending_count(l) GEVAPI->pending_count ((l)) |
140 | # define ev_set_loop_release_cb(l,r,a) GEVAPI->set_loop_release_cb ((l), (r), (a)) |
147 | |
141 | # define ev_set_invoke_pending_cb(l,c) GEVAPI->set_invoke_pending_cb ((l), (c)) |
|
|
142 | # define ev_once(loop,fd,events,timeout,cb,arg) GEVAPI->once ((loop), (fd), (events), (timeout), (cb), (arg)) |
148 | # define ev_once(loop,fd,events,timeout,cb,arg) GEVAPI->once ((loop), (fd), (events), (timeout), (cb), (arg)) |
|
|
149 | |
|
|
150 | # define ev_invoke(l,w,rev) GEVAPI->invoke ((l), (w), (rev)) |
|
|
151 | # define ev_clear_pending(l,w) GEVAPI->clear_pending ((l), (w)) |
143 | # define ev_io_start(l,w) GEVAPI->io_start ((l), (w)) |
152 | # define ev_io_start(l,w) GEVAPI->io_start ((l), (w)) |
144 | # define ev_io_stop(l,w) GEVAPI->io_stop ((l), (w)) |
153 | # define ev_io_stop(l,w) GEVAPI->io_stop ((l), (w)) |
145 | # define ev_timer_start(l,w) GEVAPI->timer_start ((l), (w)) |
154 | # define ev_timer_start(l,w) GEVAPI->timer_start ((l), (w)) |
146 | # define ev_timer_stop(l,w) GEVAPI->timer_stop ((l), (w)) |
155 | # define ev_timer_stop(l,w) GEVAPI->timer_stop ((l), (w)) |
147 | # define ev_timer_again(l,w) GEVAPI->timer_again ((l), (w)) |
156 | # define ev_timer_again(l,w) GEVAPI->timer_again ((l), (w)) |
… | |
… | |
167 | # define ev_fork_start(l,w) GEVAPI->fork_start ((l), (w)) |
176 | # define ev_fork_start(l,w) GEVAPI->fork_start ((l), (w)) |
168 | # define ev_fork_stop(l,w) GEVAPI->fork_stop ((l), (w)) |
177 | # define ev_fork_stop(l,w) GEVAPI->fork_stop ((l), (w)) |
169 | # define ev_async_start(l,w) GEVAPI->async_start ((l), (w)) |
178 | # define ev_async_start(l,w) GEVAPI->async_start ((l), (w)) |
170 | # define ev_async_stop(l,w) GEVAPI->async_stop ((l), (w)) |
179 | # define ev_async_stop(l,w) GEVAPI->async_stop ((l), (w)) |
171 | # define ev_async_send(l,w) GEVAPI->async_send ((l), (w)) |
180 | # define ev_async_send(l,w) GEVAPI->async_send ((l), (w)) |
172 | # define ev_ref(loop) GEVAPI->ref (loop) |
|
|
173 | # define ev_unref(loop) GEVAPI->unref (loop) |
|
|
174 | # define ev_clear_pending(l,w) GEVAPI->clear_pending ((l), (w)) |
|
|
175 | # define ev_invoke(l,w,rev) GEVAPI->invoke ((l), (w), (rev)) |
|
|
176 | #endif |
181 | #endif |
177 | |
182 | |
178 | static struct EVAPI *GEVAPI; |
183 | static struct EVAPI *GEVAPI; |
179 | |
184 | |
180 | #define I_EV_API(YourName) \ |
185 | #define I_EV_API(YourName) \ |
181 | STMT_START { \ |
186 | STMT_START { \ |
182 | SV *sv = perl_get_sv ("EV::API", 0); \ |
187 | SV *sv = perl_get_sv ("EV::API", 0); \ |
183 | if (!sv) croak ("EV::API not found"); \ |
188 | if (!sv) croak ("EV::API not found"); \ |
184 | GEVAPI = (struct EVAPI*) SvIV (sv); \ |
189 | GEVAPI = (struct EVAPI*) SvIV (sv); \ |
185 | if (GEVAPI->ver != EV_API_VERSION \ |
190 | if (GEVAPI->ver != EV_API_VERSION \ |
186 | || GEVAPI->rev < EV_API_REVISION) \ |
191 | || GEVAPI->rev < EV_API_REVISION) \ |
187 | croak ("EV::API version mismatch (%d.%d vs. %d.%d) -- please recompile %s", \ |
192 | croak ("EV::API version mismatch (%d.%d vs. %d.%d) -- please recompile '%s'", \ |
188 | GEVAPI->ver, GEVAPI->rev, EV_API_VERSION, EV_API_REVISION, YourName); \ |
193 | GEVAPI->ver, GEVAPI->rev, EV_API_VERSION, EV_API_REVISION, YourName); \ |
189 | } STMT_END |
194 | } STMT_END |
190 | |
195 | |
191 | #endif |
196 | #endif |
192 | |
197 | |