NAME
IO::EventQueue - Darwin Event Queue - wait for events on multiple sockets simultaneously - UNTESTED
SYNOPSIS
# THIS MODULE HAS NOT YET BEEN TESTED AT ALL
use IO::EventQueue ':all';
watchevent EV_FD, fileno SOCK1, EV_RE;
watchevent EV_FD, fileno SOCK2, EV_RE | EV_WR | EV_EX;
my ($type, $fd, $rcnt, $wcnt, $ecnt, $eventbits) = waitevent;
print "$rcnt bytes available on fd $fd\n" if $eventbits & EV_RBYTES;
if (my @ev = waitevent 2.5) { } # wait at most 2.5 seconds
modwatch EV_FD, $fd, EV_RE; # change/reactivate event watch
modwatch EV_FD, $fd, EV_RM; # remove event watch
DESCRIPTION
Provides perl access to the Event Queue on Mac OS X or Darwin, as an efficient and scalable replacement for 4-arg select().
Early draft, completely untested. It could probably use a cleaner interface too.. something that doesn't involve manually managing fd numbers :-)
FUNCTIONS
- watchevent TYPE, REFNUM, EVENTMASK
-
Add an event watch for given event source. The only type currently supported is EV_FD, with the
REFNUM
being the file descriptor of a socket. Returns true if successful, otherwise sets $! and returns false.The event mask consists of one or more of the bits EV_RD, RV_WR, EV_EX or'ed together; their meaning is analogous to 4-arg select().
Calling watchevent when an event has already been installed will cause an error (EINVAL).
- modwatch TYPE, REFNUM, EVENTMASK
-
Change the eventmask of an event watch. You need this to re-activate an event watch after receiving an event using
waitevent
, which clears the event mask. You can also remove an event watch entirely by passing EV_RM as the event mask. - waitevent TIMEOUT
- waitevent
-
Wait for any watched event to occur, or until the timeout expires. The timeout is in seconds and may be fractional. If the timeout is undef or omitted, waitevent waits forever (or until interrupted by a signal).
If an error or timeout occurs, waitevent returns an empty list and sets $! (to 0 for timeout). Otherwise it returns a 6-element list: (TYPE, REFNUM, RCNT, WCNT, ECNT, EVENTMASK). TYPE and REFNUM identify the event source (TYPE is always EV_FD currently).
The returned event mask has one of the bits EV_RD, EV_WR, EV_EX set, and may optionally have one or more other event bits set, described below.
The RCNT and WCNT might indicate something like how many bytes can be read / written (and perhaps RCNT might indicate how many connections are pending for the EV_RD|EV_RCONN event) but I haven't checked. ECNT is currently unused.
Event bits
- EV_RBYTES
-
Data is available for reading data.
- EV_WBYTES
-
Buffer space is available for writing data.
- EV_OOB
-
Out of band data is available to be read.
- EV_RCLOSED
-
Socket has been shutdown for reading.
- EV_WCLOSED
-
Socket has been shutdown for writing.
- EV_RCONN
-
An incoming connection is available to be accepted.
- EV_WCONN
-
An asynchronous connect has successfully completed.
- EV_FIN
-
The remote side has closed the connection. Data may still be available for reading, and you may still write data.
- EV_RESET
-
The connection has been refused or ungracefully closed.
- EV_TIMEOUT
-
An asynchronous operation has timed out.
KNOWN ISSUES
Once again, this code is completely untested. As in, I haven't even called any of the functions a single time. I was just in the mood to write it.
It compiles. :-)
AUTHOR
Matthijs van Duin <xmath@cpan.org>
Copyright (C) 2003 Matthijs van Duin. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.