ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/EV/EV.xs
(Generate patch)

Comparing EV/EV.xs (file contents):
Revision 1.114 by root, Sat Jul 12 22:19:22 2008 UTC vs.
Revision 1.118 by root, Wed Nov 19 10:20:25 2008 UTC

23#include "libev/ev.c" 23#include "libev/ev.c"
24 24
25#ifndef _WIN32 25#ifndef _WIN32
26# include <pthread.h> 26# include <pthread.h>
27#endif 27#endif
28
29/* 5.10.0 */
30#ifndef SvREFCNT_inc_NN
31# define SvREFCNT_inc_NN(sv) SvREFCNT_inc (sv)
32#endif
33
34/* 5.6.x */
35#ifndef SvRV_set
36# define SvRV_set(a,b) SvRV ((a)) = (b)
37#endif
38
39#if __GNUC__ >= 3
40# define expect(expr,value) __builtin_expect ((expr),(value))
41#else
42# define expect(expr,value) (expr)
43#endif
44
45#define expect_false(expr) expect ((expr) != 0, 0)
46#define expect_true(expr) expect ((expr) != 0, 1)
28 47
29#define e_loop(w) INT2PTR (struct ev_loop *, SvIVX ((w)->loop)) 48#define e_loop(w) INT2PTR (struct ev_loop *, SvIVX ((w)->loop))
30 49
31#define WFLAG_KEEPALIVE 1 50#define WFLAG_KEEPALIVE 1
32 51
191 } 210 }
192 211
193 return rv; 212 return rv;
194} 213}
195 214
196static SV *sv_events_cache; 215static SV *sv_self_cache, *sv_events_cache;
197 216
198static void 217static void
199e_cb (EV_P_ ev_watcher *w, int revents) 218e_cb (EV_P_ ev_watcher *w, int revents)
200{ 219{
201 dSP; 220 dSP;
202 I32 mark = SP - PL_stack_base; 221 I32 mark = SP - PL_stack_base;
203 SV *sv_self, *sv_events; 222 SV *sv_self, *sv_events;
204 223
224 if (expect_true (sv_self_cache))
225 {
226 sv_self = sv_self_cache; sv_self_cache = 0;
227 SvRV_set (sv_self, SvREFCNT_inc_NN (w->self));
228 }
229 else
230 {
205 sv_self = newRV_inc (w->self); /* w->self MUST be blessed by now */ 231 sv_self = newRV_inc (w->self); /* w->self MUST be blessed by now */
232 SvREADONLY_on (sv_self);
233 }
206 234
207 if (sv_events_cache) 235 if (expect_true (sv_events_cache))
208 { 236 {
209 sv_events = sv_events_cache; sv_events_cache = 0; 237 sv_events = sv_events_cache; sv_events_cache = 0;
210 SvIV_set (sv_events, revents); 238 SvIV_set (sv_events, revents);
211 } 239 }
212 else 240 else
241 {
213 sv_events = newSViv (revents); 242 sv_events = newSViv (revents);
243 SvREADONLY_on (sv_events);
244 }
214 245
215 PUSHMARK (SP); 246 PUSHMARK (SP);
216 EXTEND (SP, 2); 247 EXTEND (SP, 2);
217 PUSHs (sv_self); 248 PUSHs (sv_self);
218 PUSHs (sv_events); 249 PUSHs (sv_events);
219 250
220 PUTBACK; 251 PUTBACK;
221 call_sv (w->cb_sv, G_DISCARD | G_VOID | G_EVAL); 252 call_sv (w->cb_sv, G_DISCARD | G_VOID | G_EVAL);
222 253
254 if (expect_false (sv_self_cache))
223 SvREFCNT_dec (sv_self); 255 SvREFCNT_dec (sv_self);
256 else
257 {
258 SvREFCNT_dec (SvRV (sv_self));
259 SvRV_set (sv_self, &PL_sv_undef);
260 sv_self_cache = sv_self;
261 }
224 262
225 if (sv_events_cache) 263 if (expect_false (sv_events_cache))
226 SvREFCNT_dec (sv_events); 264 SvREFCNT_dec (sv_events);
227 else 265 else
228 sv_events_cache = sv_events; 266 sv_events_cache = sv_events;
229 267
230 if (SvTRUE (ERRSV)) 268 if (SvTRUE (ERRSV))
411 evapi.loop_new = ev_loop_new; 449 evapi.loop_new = ev_loop_new;
412 evapi.loop_destroy = ev_loop_destroy; 450 evapi.loop_destroy = ev_loop_destroy;
413 evapi.loop_fork = ev_loop_fork; 451 evapi.loop_fork = ev_loop_fork;
414 evapi.loop_count = ev_loop_count; 452 evapi.loop_count = ev_loop_count;
415 evapi.now = ev_now; 453 evapi.now = ev_now;
454 evapi.now_update = ev_now_update;
416 evapi.backend = ev_backend; 455 evapi.backend = ev_backend;
417 evapi.unloop = ev_unloop; 456 evapi.unloop = ev_unloop;
418 evapi.ref = ev_ref; 457 evapi.ref = ev_ref;
419 evapi.unref = ev_unref; 458 evapi.unref = ev_unref;
420 evapi.loop = ev_loop; 459 evapi.loop = ev_loop;
486 525
487unsigned int ev_recommended_backends () 526unsigned int ev_recommended_backends ()
488 527
489unsigned int ev_embeddable_backends () 528unsigned int ev_embeddable_backends ()
490 529
530void ev_sleep (NV interval)
531
491NV ev_time () 532NV ev_time ()
492 533
493NV ev_now () 534NV ev_now ()
535 C_ARGS: evapi.default_loop
536
537void ev_now_update ()
494 C_ARGS: evapi.default_loop 538 C_ARGS: evapi.default_loop
495 539
496unsigned int ev_backend () 540unsigned int ev_backend ()
497 C_ARGS: evapi.default_loop 541 C_ARGS: evapi.default_loop
498 542
1209 1253
1210void ev_loop_verify (struct ev_loop *loop) 1254void ev_loop_verify (struct ev_loop *loop)
1211 1255
1212NV ev_now (struct ev_loop *loop) 1256NV ev_now (struct ev_loop *loop)
1213 1257
1258void ev_now_update (struct ev_loop *loop)
1259
1214void ev_set_io_collect_interval (struct ev_loop *loop, NV interval) 1260void ev_set_io_collect_interval (struct ev_loop *loop, NV interval)
1215 1261
1216void ev_set_timeout_collect_interval (struct ev_loop *loop, NV interval) 1262void ev_set_timeout_collect_interval (struct ev_loop *loop, NV interval)
1217 1263
1218unsigned int ev_backend (struct ev_loop *loop) 1264unsigned int ev_backend (struct ev_loop *loop)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines