- set_event_handler ($conn->{sock}, read => undef);
- return $_[0] ? $conn->{disable_read} = $_[0] : $_[0];
-}
-
-#
-#----------------------------------------------------
-# Event loop routines used by both client and server
-
-sub set_event_handler {
- shift unless ref($_[0]); # shift if first arg is package name
- my ($handle, %args) = @_;
- my $callback;
- if (exists $args{'write'}) {
- $callback = $args{'write'};
- if ($callback) {
- $wt_callbacks{$handle} = $callback;
- $wt_handles->add($handle);
- } else {
- delete $wt_callbacks{$handle};
- $wt_handles->remove($handle);
- }
- }
- if (exists $args{'read'}) {
- $callback = $args{'read'};
- if ($callback) {
- $rd_callbacks{$handle} = $callback;
- $rd_handles->add($handle);
- } else {
- delete $rd_callbacks{$handle};
- $rd_handles->remove($handle);
- }
- }
- if (exists $args{'error'}) {
- $callback = $args{'error'};
- if ($callback) {
- $er_callbacks{$handle} = $callback;
- $er_handles->add($handle);
- } else {
- delete $er_callbacks{$handle};
- $er_handles->remove($handle);
- }
- }
-}
-
-sub event_loop {
- my ($pkg, $loop_count, $timeout, $wronly) = @_; # event_loop(1) to process events once
- my ($conn, $r, $w, $e, $rset, $wset, $eset);
- while (1) {
-
- # Quit the loop if no handles left to process
- if ($wronly) {
- last unless $wt_handles->count();
-
- ($rset, $wset, $eset) = IO::Select->select(undef, $wt_handles, undef, $timeout);
-
- foreach $w (@$wset) {
- &{$wt_callbacks{$w}}($w) if exists $wt_callbacks{$w};
- }
- } else {
-
- last unless ($rd_handles->count() || $wt_handles->count());
-
- ($rset, $wset, $eset) = IO::Select->select($rd_handles, $wt_handles, $er_handles, $timeout);
-
- foreach $e (@$eset) {
- &{$er_callbacks{$e}}($e) if exists $er_callbacks{$e};
- }
- foreach $r (@$rset) {
- &{$rd_callbacks{$r}}($r) if exists $rd_callbacks{$r};
- }
- foreach $w (@$wset) {
- &{$wt_callbacks{$w}}($w) if exists $wt_callbacks{$w};
- }
- }
-
- Timer::handler;
-
- if (defined($loop_count)) {
- last unless --$loop_count;
- }
- }