ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/lib/AnyEvent.pm
(Generate patch)

Comparing AnyEvent/lib/AnyEvent.pm (file contents):
Revision 1.194 by root, Sun Mar 22 03:56:37 2009 UTC vs.
Revision 1.195 by root, Wed Mar 25 17:33:11 2009 UTC

861no warnings; 861no warnings;
862use strict qw(vars subs); 862use strict qw(vars subs);
863 863
864use Carp; 864use Carp;
865 865
866our $VERSION = 4.34; 866our $VERSION = 4.341;
867our $MODEL; 867our $MODEL;
868 868
869our $AUTOLOAD; 869our $AUTOLOAD;
870our @ISA; 870our @ISA;
871 871
1004# to support binding more than one watcher per filehandle (they usually 1004# to support binding more than one watcher per filehandle (they usually
1005# allow only one watcher per fd, so we dup it to get a different one). 1005# allow only one watcher per fd, so we dup it to get a different one).
1006sub _dupfh($$$$) { 1006sub _dupfh($$$$) {
1007 my ($poll, $fh, $r, $w) = @_; 1007 my ($poll, $fh, $r, $w) = @_;
1008 1008
1009 require Fcntl;
1010
1011 # cygwin requires the fh mode to be matching, unix doesn't 1009 # cygwin requires the fh mode to be matching, unix doesn't
1012 my ($rw, $mode) = $poll eq "r" ? ($r, "<") 1010 my ($rw, $mode) = $poll eq "r" ? ($r, "<")
1013 : $poll eq "w" ? ($w, ">") 1011 : $poll eq "w" ? ($w, ">")
1014 : Carp::croak "AnyEvent->io requires poll set to either 'r' or 'w'"; 1012 : Carp::croak "AnyEvent->io requires poll set to either 'r' or 'w'";
1015 1013
1043 bless { @_ == 3 ? (_ae_cb => $_[2]) : () }, AnyEvent::CondVar:: 1041 bless { @_ == 3 ? (_ae_cb => $_[2]) : () }, AnyEvent::CondVar::
1044} 1042}
1045 1043
1046# default implementation for ->signal 1044# default implementation for ->signal
1047 1045
1048our %SIG_CB; 1046our ($SIGPIPE_R, $SIGPIPE_W, %SIG_CB, %SIG_EV, $SIG_IO);
1047
1048sub _signal_exec {
1049 while (%SIG_EV) {
1050 sysread $SIGPIPE_R, my $dummy, 4;
1051 for (keys %SIG_EV) {
1052 delete $SIG_EV{$_};
1053 $_->() for values %{ $SIG_CB{$_} || {} };
1054 }
1055 }
1056}
1049 1057
1050sub signal { 1058sub signal {
1051 my (undef, %arg) = @_; 1059 my (undef, %arg) = @_;
1052 1060
1061 unless ($SIGPIPE_R) {
1062 if (AnyEvent::WIN32) {
1063 ($SIGPIPE_R, $SIGPIPE_W) = AnyEvent::Util::portable_pipe ();
1064 AnyEvent::Util::fh_nonblocking ($SIGPIPE_R) if $SIGPIPE_R;
1065 AnyEvent::Util::fh_nonblocking ($SIGPIPE_W) if $SIGPIPE_W; # just in case
1066 } else {
1067 pipe $SIGPIPE_R, $SIGPIPE_W;
1068 require Fcntl;
1069 fcntl $SIGPIPE_R, &Fcntl::F_SETFL, &Fcntl::O_NONBLOCK if $SIGPIPE_R;
1070 fcntl $SIGPIPE_W, &Fcntl::F_SETFL, &Fcntl::O_NONBLOCK if $SIGPIPE_W; # just in case
1071 }
1072
1073 $SIGPIPE_R
1074 or Carp::croak "AnyEvent: unable to create a signal reporting pipe: $!\n";
1075
1076 $SIG_IO = AnyEvent->io (fh => $SIGPIPE_R, poll => "r", cb => \&_signal_exec);
1077 }
1078
1053 my $signal = uc $arg{signal} 1079 my $signal = uc $arg{signal}
1054 or Carp::croak "required option 'signal' is missing"; 1080 or Carp::croak "required option 'signal' is missing";
1055 1081
1056 $SIG_CB{$signal}{$arg{cb}} = $arg{cb}; 1082 $SIG_CB{$signal}{$arg{cb}} = $arg{cb};
1057 $SIG{$signal} ||= sub { 1083 $SIG{$signal} ||= sub {
1058 $_->() for values %{ $SIG_CB{$signal} || {} }; 1084 syswrite $SIGPIPE_W, "\x00", 1 unless %SIG_EV;
1085 undef $SIG_EV{$signal};
1059 }; 1086 };
1060 1087
1061 bless [$signal, $arg{cb}], "AnyEvent::Base::Signal" 1088 bless [$signal, $arg{cb}], "AnyEvent::Base::Signal"
1062} 1089}
1063 1090

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines