EV
view release on metacpan or search on metacpan
libev/ev.pod view on Meta::CPAN
179180181182183184185186187188189190191192193194195196197198199=item ev_tstamp ev_time ()
Returns the current time as libev would use it. Please note that the
C<ev_now> function is usually faster and also often returns the timestamp
you actually want to know. Also interesting is the combination of
C<ev_now_update> and C<ev_now>.
=item ev_sleep (ev_tstamp interval)
Sleep for the given interval: The current thread will be blocked
until either it is interrupted or the given time interval has
passed (approximately - it might return a bit earlier even if not
interrupted). Returns immediately if C<< interval <= 0 >>.
Basically this is a sub-second-resolution C<sleep ()>.
The range of the C<interval> is limited - libev only guarantees to work
with sleep times of up to one day (C<< interval <= 86400 >>).
=item int ev_version_major ()
libev/ev.pod view on Meta::CPAN
465466467468469470471472473474475476477478479480481482483484485handling
with
threads, as long as you properly block signals in your
threads that are not interested in handling them.
Signalfd will not be used by
default
as this changes your signal mask, and
there are a lot of shoddy libraries and programs (glib's threadpool
for
example) that can't properly initialise their signal masks.
=item C<EVFLAG_NOSIGMASK>
When this flag is specified, then libev will avoid to modify the signal
mask. Specifically, this means you have to make sure signals are unblocked
when you want to receive them.
This behaviour is useful when you want to do your own signal handling, or
want to handle signals only in specific threads and want to avoid libev
unblocking the signals.
It's also required by POSIX in a threaded program, as libev calls
C<sigprocmask>, whose behaviour is officially unspecified.
=item C<EVFLAG_NOTIMERFD>
libev/ev.pod view on Meta::CPAN
164816491650165116521653165416551656165716581659166016611662166316641665166616671668
// we have handled the event
ev_io_start (EV_P_
&io
);
}
// initialisation
ev_idle_init (
&idle
, idle_cb);
ev_io_init (
&io
, io_cb, STDIN_FILENO, EV_READ);
ev_io_start (EV_DEFAULT_
&io
);
In the
"real"
world, it might also be beneficial to start a timer, so that
low-priority connections can not be locked out forever under load. This
enables your program to keep a lower latency
for
important connections
during short periods of high load,
while
not completely locking out less
important ones.
=head1 WATCHER TYPES
This section describes each watcher in detail, but will not repeat
information given in the last section. Any initialisation/set macros,
functions and members specific to the watcher type are explained.
libev/ev.pod view on Meta::CPAN
257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607Both the signal mask (C<sigprocmask>) and the signal disposition
(C<sigaction>) are unspecified
after
starting a signal watcher (and
after
stopping it again), that is, libev might or might not block the signal,
and might or might not set or restore the installed signal handler (but
see C<EVFLAG_NOSIGMASK>).
While this does not matter
for
the signal disposition (libev never
sets signals to C<SIG_IGN>, so handlers will be
reset
to C<SIG_DFL> on
C<execve>), this matters
for
the signal mask: many programs
do
not expect
certain signals to be blocked.
This means that
before
calling C<
exec
> (from the child) you should
reset
the signal mask to whatever
"default"
you expect (all clear is a good
choice usually).
The simplest way to ensure that the signal mask is
reset
in the child is
to install a
fork
handler
with
C<pthread_atfork> that resets it. That will
catch
fork
calls done by libraries (such as the libc) as well.
In current versions of libev, the signal will not be blocked indefinitely
the window of opportunity
for
problems, it will not go away, as libev
I<
has
> to modify the signal mask, at least temporarily.
So I can't stress this enough: I<If you
do
not
reset
your signal mask
when
you expect it to be empty, you have a race condition in your code>. This
is not a libev-specific thing, this is true
for
most event libraries.
=head3 The special problem of threads signal handling
libev/ev.pod view on Meta::CPAN
362436253626362736283629363036313632363336343635363636373638363936403641364236433644Unlike C<ev_feed_event>, this call is safe to
do
from other threads,
signal or similar contexts (see the discussion of C<EV_ATOMIC_T> in the
embedding section below on what exactly this means).
Note that, as
with
other watchers in libev, multiple events might get
compressed into a single callback invocation (another way to look at
this is that C<ev_async> watchers are level-triggered: they are set on
C<ev_async_send>,
reset
when
the event loop detects that).
This call incurs the overhead of at most one extra
system
call per event
loop iteration,
if
the event loop is blocked, and
no
syscall
at all
if
the event loop (or your program) is processing events. That means that
repeated calls are basically free (there is
no
need to avoid calls
for
performance reasons) and that the overhead becomes smaller (typically
zero) under load.
=item bool = ev_async_pending (ev_async *)
Returns a non-zero value when C<ev_async_send> has been called on the
watcher but the event has not yet been processed (or even noted) by the
event loop.
libev/ev.pod view on Meta::CPAN
382638273828382938303831383238333834383538363837383838393840384138423843384438453846=head2 MODEL/NESTED EVENT LOOP INVOCATIONS AND EXIT CONDITIONS
Often (especially in GUI toolkits) there are places where you have
I<modal> interaction, which is most easily implemented by recursively
invoking C<ev_run>.
This brings the problem of exiting - a callback might want to finish the
main C<ev_run> call, but not the nested one (e.g. user clicked "Quit", but
a modal "Are you sure?" dialog is still waiting), or just the nested one
and not the main one (e.g. user clocked "Ok" in a modal dialog), or some
other combination: In these cases, a simple C<ev_break> will not work.
The solution is to maintain "break this loop" variable for each C<ev_run>
invocation, and use a loop around C<ev_run> until the condition is
triggered, using C<EVRUN_ONCE>:
// main loop
int exit_main_loop = 0;
while (!exit_main_loop)
libev/ev.pod view on Meta::CPAN
560556065607560856095610561156125613561456155616561756185619562056215622562356245625watchers becomes O(1)
with
respect to priority handling.
=item Sending an ev_async: O(1)
=item Processing ev_async_send: O(number_of_async_watchers)
=item Processing signals: O(max_signal_number)
Sending involves a system call I<iff> there were no other C<ev_async_send>
calls in the current loop iteration and the loop is currently
blocked. Checking for async and signal events involves iterating over all
running async watchers or all signal numbers.
=back
=head1 PORTING FROM LIBEV 3.X TO 4.X
The major version 4 introduced some incompatible changes to the API.
At the moment, the C<ev.h> header file provides compatibility definitions
( run in 0.722 second using v1.01-cache-2.11-cpan-26ccb49234f )