NAME
EV - perl interface to libevent, monkey.org/~provos/libevent/
SYNOPSIS
use EV;
# TIMER
my $w = EV::timer 2, 0, sub {
warn "is called after 2s";
};
my $w = EV::timer 2, 1, sub {
warn "is called roughly every 2s (repeat = 1)";
};
undef $w; # destroy event watcher again
my $w = EV::timer_abs 0, 60, sub {
warn "is called every minute, on the minute, exactly";
};
# IO
my $w = EV::io \*STDIN, EV::READ | EV::PERSIST, sub {
my ($w, $events) = @_; # all callbacks get the watcher object and event mask
if ($events & EV::TIMEOUT) {
warn "nothing received on stdin for 10 seconds, retrying";
} else {
warn "stdin is readable, you entered: ", <STDIN>;
}
};
$w->timeout (10);
my $w = EV::timed_io \*STDIN, EV::READ, 30, sub {
my ($w, $events) = @_;
if ($_[1] & EV::TIMEOUT) {
warn "nothing entered within 30 seconds, bye bye.\n";
$w->stop;
} else {
my $line = <STDIN>;
warn "you entered something, you again have 30 seconds.\n";
}
};
# SIGNALS
my $w = EV::signal 'QUIT', sub {
warn "sigquit received\n";
};
my $w = EV::signal 3, sub {
warn "sigquit received (this is GNU/Linux, right?)\n";
};
# MAINLOOP
EV::dispatch; # loop as long as watchers are active
EV::loop; # the same thing
EV::loop EV::LOOP_ONCE; # block until some events could be handles
EV::loop EV::LOOP_NONBLOCK; # check and handle some events, but do not wait
DESCRIPTION
This module provides an interface to libevent (http://monkey.org/~provos/libevent/). You probably should acquaint yourself with its documentation and source code to be able to use this module fully.
Please note thta this module disables the libevent EPOLL method by default, see BUGS, below, if you need to enable it.
BASIC INTERFACE
- $EV::NPRI
-
How many priority levels are available.
- $EV::DIED
-
Must contain a reference to a function that is called when a callback throws an exception (with $@ containing thr error). The default prints an informative message and continues.
If this callback throws an exception it will be silently ignored.
- $time = EV::now
-
Returns the time in (fractional) seconds since the epoch.
- $version = EV::version
- $method = EV::method
-
Return version string and event polling method used.
- EV::loop $flags # EV::LOOP_ONCE, EV::LOOP_ONESHOT
- EV::loopexit $after
-
Exit any active loop or dispatch after
$after
seconds or immediately if$after
is missing or zero. - EV::dispatch
-
Same as
EV::loop 0
. - EV::event $callback
-
Creates a new event watcher waiting for nothing, calling the given callback.
- my $w = EV::io $fileno_or_fh, $eventmask, $callback
- my $w = EV::io_ns $fileno_or_fh, $eventmask, $callback
-
As long as the returned watcher object is alive, call the
$callback
when the events specified in$eventmask
happen. Initially, the timeout is disabled.You can additionall set a timeout to occur on the watcher, but note that this timeout will not be reset when you get an I/O event in the EV::PERSIST case, and reaching a timeout will always stop the watcher even in the EV::PERSIST case.
If you want a timeout to occur only after a specific time of inactivity, set a repeating timeout and do NOT use EV::PERSIST.
Eventmask can be one or more of these constants ORed together:
EV::READ wait until read() wouldn't block anymore EV::WRITE wait until write() wouldn't block anymore EV::PERSIST stay active after a (non-timeout) event occured
The
io_ns
variant doesn't add/start the newly created watcher. - my $w = EV::timed_io $fileno_or_fh, $eventmask, $timeout, $callback
- my $w = EV::timed_io_ns $fileno_or_fh, $eventmask, $timeout, $callback
-
Same as
io
andio_ns
, but also specifies a timeout (as if there was a call to$w->timeout ($timout, 1)
. The persist flag is not allowed and will automatically be cleared. The watcher will be restarted after each event.If the timeout is zero or undef, no timeout will be set, and a normal watcher (with the persist flag set!) will be created.
This has the effect of timing out after the specified period of inactivity has happened.
Due to the design of libevent, this is also relatively inefficient, having one or two io watchers and a separate timeout watcher that you reset on activity (by calling its
start
method) is usually more efficient. - my $w = EV::timer $after, $repeat, $callback
- my $w = EV::timer_ns $after, $repeat, $callback
-
Calls the callback after
$after
seconds. If$repeat
is true, the timer will be restarted after the callback returns. This means that the callback would be called roughly every$after
seconds, prolonged by the time the callback takes.The
timer_ns
variant doesn't add/start the newly created watcher. - my $w = EV::timer_abs $at, $interval, $callback
- my $w = EV::timer_abs_ns $at, $interval, $callback
-
Similar to EV::timer, but the time is given as an absolute point in time (
$at
), plus an optional$interval
.If the
$interval
is zero, then the callback will be called at the time$at
if that is in the future, or as soon as possible if its in the past. It will not automatically repeat.If the
$interval
is nonzero, then the watcher will always be scheduled to time out at the next$at + integer * $interval
time.This can be used to schedule a callback to run at very regular intervals, as long as the processing time is less then the interval (otherwise obviously events will be skipped).
Another way to think about it (for the mathematically inclined) is that
timer_abs
will try to tun the callback at the next possible time where$time = $at (mod $interval)
, regardless of any time jumps.The
timer_abs_ns
variant doesn't add/start the newly created watcher. - my $w = EV::signal $signal, $callback
- my $w = EV::signal_ns $signal, $callback
-
Call the callback when $signal is received (the signal can be specified by number or by name, just as with kill or %SIG). Signal watchers are persistent no natter what.
EV will grab the signal for the process (the kernel only allows one component to receive signals) when you start a signal watcher, and removes it again when you stop it. Pelr does the same when you add/remove callbacks to %SIG, so watch out.
Unfortunately, only one handler can be registered per signal. Screw libevent.
The
signal_ns
variant doesn't add/start the newly created watcher.
THE EV::Event CLASS
All EV functions creating an event watcher (designated by my $w =
above) support the following methods on the returned watcher object:
- $w->add ($timeout)
-
Stops and (re-)starts the event watcher, setting the optional timeout to the given value, or clearing the timeout if none is given.
- $w->start
-
Stops and (re-)starts the event watcher without touching the timeout.
- $w->del
- $w->stop
-
Stop the event watcher if it was started.
- $current_callback = $w->cb
- $old_callback = $w->cb ($new_callback)
-
Return the previously set callback and optionally set a new one.
- $current_fh = $w->fh
- $old_fh = $w->fh ($new_fh)
-
Returns the previously set filehandle and optionally set a new one (also clears the EV::SIGNAL flag when setting a filehandle).
- $current_signal = $w->signal
- $old_signal = $w->signal ($new_signal)
-
Returns the previously set signal number and optionally set a new one (also sets the EV::SIGNAL flag when setting a signal).
- $current_eventmask = $w->events
- $old_eventmask = $w->events ($new_eventmask)
-
Returns the previously set event mask and optionally set a new one.
- $w->timeout ($after, $repeat)
-
Resets the timeout (see
EV::timer
for details). - $w->timeout_abs ($at, $interval)
-
Resets the timeout (see
EV::timer_abs
for details). - $w->priority_set ($priority)
-
Set the priority of the watcher to
$priority
(0 <= $priority < $EV::NPRI).
BUGS
Lots. Libevent itself isn't well tested and rather buggy, and this module is quite new at the moment.
Please note that the epoll method is not, in general, reliable in programs that use fork (even if no libveent calls are being made in the forked process). If your program behaves erratically, try setting the environment variable EVENT_NOEPOLL
first when running the program.
In general, if you fork, then you can only use the EV module in one of the children.
SEE ALSO
L<EV::DNS>, L<event(3)>, L<event.h>, L<evdns.h>.
L<EV::AnyEvent>.
AUTHOR
Marc Lehmann <schmorp@schmorp.de>
http://home.schmorp.de/