… | |
… | |
10 | #define EV_COMMON \ |
10 | #define EV_COMMON \ |
11 | SV *self; /* contains this struct */ \ |
11 | SV *self; /* contains this struct */ \ |
12 | SV *cb_sv, *fh; |
12 | SV *cb_sv, *fh; |
13 | |
13 | |
14 | #include "EV/EVAPI.h" |
14 | #include "EV/EVAPI.h" |
|
|
15 | |
|
|
16 | #include "libev/ev.c" |
15 | |
17 | |
16 | typedef int Signal; |
18 | typedef int Signal; |
17 | |
19 | |
18 | static struct EVAPI evapi; |
20 | static struct EVAPI evapi; |
19 | |
21 | |
… | |
… | |
208 | } |
210 | } |
209 | |
211 | |
210 | LEAVE; |
212 | LEAVE; |
211 | } |
213 | } |
212 | #endif |
214 | #endif |
|
|
215 | |
|
|
216 | #define CHECK_REPEAT(repeat) if (repeat < 0.) \ |
|
|
217 | croak (# repeat " value must be >= 0"); |
213 | |
218 | |
214 | ///////////////////////////////////////////////////////////////////////////// |
219 | ///////////////////////////////////////////////////////////////////////////// |
215 | // XS interface functions |
220 | // XS interface functions |
216 | |
221 | |
217 | MODULE = EV PACKAGE = EV PREFIX = ev_ |
222 | MODULE = EV PACKAGE = EV PREFIX = ev_ |
… | |
… | |
271 | evapi.loop = ev_loop; |
276 | evapi.loop = ev_loop; |
272 | evapi.io_start = evio_start; |
277 | evapi.io_start = evio_start; |
273 | evapi.io_stop = evio_stop; |
278 | evapi.io_stop = evio_stop; |
274 | evapi.timer_start = evtimer_start; |
279 | evapi.timer_start = evtimer_start; |
275 | evapi.timer_stop = evtimer_stop; |
280 | evapi.timer_stop = evtimer_stop; |
|
|
281 | evapi.timer_again = evtimer_again; |
276 | evapi.periodic_start = evperiodic_start; |
282 | evapi.periodic_start = evperiodic_start; |
277 | evapi.periodic_stop = evperiodic_stop; |
283 | evapi.periodic_stop = evperiodic_stop; |
278 | evapi.signal_start = evsignal_start; |
284 | evapi.signal_start = evsignal_start; |
279 | evapi.signal_stop = evsignal_stop; |
285 | evapi.signal_stop = evsignal_stop; |
280 | evapi.idle_start = evidle_start; |
286 | evapi.idle_start = evidle_start; |
… | |
… | |
308 | void ev_loop_done (int value = 1) |
314 | void ev_loop_done (int value = 1) |
309 | CODE: |
315 | CODE: |
310 | ev_loop_done = value; |
316 | ev_loop_done = value; |
311 | |
317 | |
312 | struct ev_io *io (SV *fh, int events, SV *cb) |
318 | struct ev_io *io (SV *fh, int events, SV *cb) |
|
|
319 | PROTOTYPE: $$& |
313 | ALIAS: |
320 | ALIAS: |
314 | io_ns = 1 |
321 | io_ns = 1 |
315 | CODE: |
322 | CODE: |
316 | RETVAL = e_new (sizeof (struct ev_io), cb); |
323 | RETVAL = e_new (sizeof (struct ev_io), cb); |
317 | RETVAL->fh = newSVsv (fh); |
324 | RETVAL->fh = newSVsv (fh); |
… | |
… | |
319 | if (!ix) evio_start (RETVAL); |
326 | if (!ix) evio_start (RETVAL); |
320 | OUTPUT: |
327 | OUTPUT: |
321 | RETVAL |
328 | RETVAL |
322 | |
329 | |
323 | struct ev_timer *timer (NV after, NV repeat, SV *cb) |
330 | struct ev_timer *timer (NV after, NV repeat, SV *cb) |
|
|
331 | PROTOTYPE: $$& |
324 | ALIAS: |
332 | ALIAS: |
325 | timer_ns = 1 |
333 | timer_ns = 1 |
|
|
334 | INIT: |
|
|
335 | CHECK_REPEAT (repeat); |
326 | CODE: |
336 | CODE: |
327 | RETVAL = e_new (sizeof (struct ev_timer), cb); |
337 | RETVAL = e_new (sizeof (struct ev_timer), cb); |
328 | evtimer_set (RETVAL, after, repeat); |
338 | evtimer_set (RETVAL, after, repeat); |
329 | if (!ix) evtimer_start (RETVAL); |
339 | if (!ix) evtimer_start (RETVAL); |
330 | OUTPUT: |
340 | OUTPUT: |
331 | RETVAL |
341 | RETVAL |
332 | |
342 | |
333 | struct ev_periodic *periodic (NV at, NV interval, SV *cb) |
343 | struct ev_periodic *periodic (NV at, NV interval, SV *cb) |
|
|
344 | PROTOTYPE: $$& |
334 | ALIAS: |
345 | ALIAS: |
335 | periodic_ns = 1 |
346 | periodic_ns = 1 |
|
|
347 | INIT: |
|
|
348 | CHECK_REPEAT (interval); |
336 | CODE: |
349 | CODE: |
337 | RETVAL = e_new (sizeof (struct ev_periodic), cb); |
350 | RETVAL = e_new (sizeof (struct ev_periodic), cb); |
338 | evperiodic_set (RETVAL, at, interval); |
351 | evperiodic_set (RETVAL, at, interval); |
339 | if (!ix) evperiodic_start (RETVAL); |
352 | if (!ix) evperiodic_start (RETVAL); |
340 | OUTPUT: |
353 | OUTPUT: |
341 | RETVAL |
354 | RETVAL |
342 | |
355 | |
343 | struct ev_signal *signal (Signal signum, SV *cb) |
356 | struct ev_signal *signal (Signal signum, SV *cb) |
|
|
357 | PROTOTYPE: $& |
344 | ALIAS: |
358 | ALIAS: |
345 | signal_ns = 1 |
359 | signal_ns = 1 |
346 | CODE: |
360 | CODE: |
347 | RETVAL = e_new (sizeof (struct ev_signal), cb); |
361 | RETVAL = e_new (sizeof (struct ev_signal), cb); |
348 | evsignal_set (RETVAL, signum); |
362 | evsignal_set (RETVAL, signum); |
349 | if (!ix) evsignal_start (RETVAL); |
363 | if (!ix) evsignal_start (RETVAL); |
350 | OUTPUT: |
364 | OUTPUT: |
351 | RETVAL |
365 | RETVAL |
352 | |
366 | |
353 | struct ev_idle *idle (SV *cb) |
367 | struct ev_idle *idle (SV *cb) |
|
|
368 | PROTOTYPE: & |
354 | ALIAS: |
369 | ALIAS: |
355 | idle_ns = 1 |
370 | idle_ns = 1 |
356 | CODE: |
371 | CODE: |
357 | RETVAL = e_new (sizeof (struct ev_idle), cb); |
372 | RETVAL = e_new (sizeof (struct ev_idle), cb); |
358 | evidle_set (RETVAL); |
373 | evidle_set (RETVAL); |
359 | if (!ix) evidle_start (RETVAL); |
374 | if (!ix) evidle_start (RETVAL); |
360 | OUTPUT: |
375 | OUTPUT: |
361 | RETVAL |
376 | RETVAL |
362 | |
377 | |
363 | struct ev_check *check (SV *cb) |
378 | struct ev_check *check (SV *cb) |
|
|
379 | PROTOTYPE: & |
364 | ALIAS: |
380 | ALIAS: |
365 | check_ns = 1 |
381 | check_ns = 1 |
366 | CODE: |
382 | CODE: |
367 | RETVAL = e_new (sizeof (struct ev_check), cb); |
383 | RETVAL = e_new (sizeof (struct ev_check), cb); |
368 | evcheck_set (RETVAL); |
384 | evcheck_set (RETVAL); |
… | |
… | |
463 | MODULE = EV PACKAGE = EV::Time |
479 | MODULE = EV PACKAGE = EV::Time |
464 | |
480 | |
465 | MODULE = EV PACKAGE = EV::Timer PREFIX = evtimer_ |
481 | MODULE = EV PACKAGE = EV::Timer PREFIX = evtimer_ |
466 | |
482 | |
467 | void evtimer_start (struct ev_timer *w) |
483 | void evtimer_start (struct ev_timer *w) |
|
|
484 | INIT: |
|
|
485 | CHECK_REPEAT (w->repeat); |
468 | |
486 | |
469 | void evtimer_stop (struct ev_timer *w) |
487 | void evtimer_stop (struct ev_timer *w) |
470 | |
488 | |
|
|
489 | void evtimer_again (struct ev_timer *w) |
|
|
490 | INIT: |
|
|
491 | CHECK_REPEAT (w->repeat); |
|
|
492 | |
471 | void set (struct ev_timer *w, NV after, NV repeat = 0.) |
493 | void set (struct ev_timer *w, NV after, NV repeat = 0.) |
|
|
494 | INIT: |
|
|
495 | CHECK_REPEAT (repeat); |
472 | CODE: |
496 | CODE: |
473 | { |
497 | { |
474 | int active = w->active; |
498 | int active = w->active; |
475 | if (active) evtimer_stop (w); |
499 | if (active) evtimer_stop (w); |
476 | evtimer_set (w, after, repeat); |
500 | evtimer_set (w, after, repeat); |
… | |
… | |
478 | } |
502 | } |
479 | |
503 | |
480 | MODULE = EV PACKAGE = EV::Periodic PREFIX = evperiodic_ |
504 | MODULE = EV PACKAGE = EV::Periodic PREFIX = evperiodic_ |
481 | |
505 | |
482 | void evperiodic_start (struct ev_periodic *w) |
506 | void evperiodic_start (struct ev_periodic *w) |
|
|
507 | INIT: |
|
|
508 | CHECK_REPEAT (w->interval); |
483 | |
509 | |
484 | void evperiodic_stop (struct ev_periodic *w) |
510 | void evperiodic_stop (struct ev_periodic *w) |
485 | |
511 | |
486 | void set (struct ev_periodic *w, NV at, NV interval = 0.) |
512 | void set (struct ev_periodic *w, NV at, NV interval = 0.) |
|
|
513 | INIT: |
|
|
514 | CHECK_REPEAT (interval); |
487 | CODE: |
515 | CODE: |
488 | { |
516 | { |
489 | int active = w->active; |
517 | int active = w->active; |
490 | if (active) evperiodic_stop (w); |
518 | if (active) evperiodic_stop (w); |
491 | evperiodic_set (w, at, interval); |
519 | evperiodic_set (w, at, interval); |