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.199 by root, Fri Mar 27 10:49:50 2009 UTC vs.
Revision 1.202 by root, Wed Apr 1 15:29:00 2009 UTC

1070 1070
1071sub signal { 1071sub signal {
1072 my (undef, %arg) = @_; 1072 my (undef, %arg) = @_;
1073 1073
1074 unless ($SIGPIPE_R) { 1074 unless ($SIGPIPE_R) {
1075 require Fcntl;
1076
1075 if (AnyEvent::WIN32) { 1077 if (AnyEvent::WIN32) {
1078 require AnyEvent::Util;
1079
1076 ($SIGPIPE_R, $SIGPIPE_W) = AnyEvent::Util::portable_pipe (); 1080 ($SIGPIPE_R, $SIGPIPE_W) = AnyEvent::Util::portable_pipe ();
1077 AnyEvent::Util::fh_nonblocking ($SIGPIPE_R) if $SIGPIPE_R; 1081 AnyEvent::Util::fh_nonblocking ($SIGPIPE_R) if $SIGPIPE_R;
1078 AnyEvent::Util::fh_nonblocking ($SIGPIPE_W) if $SIGPIPE_W; # just in case 1082 AnyEvent::Util::fh_nonblocking ($SIGPIPE_W) if $SIGPIPE_W; # just in case
1079 } else { 1083 } else {
1080 pipe $SIGPIPE_R, $SIGPIPE_W; 1084 pipe $SIGPIPE_R, $SIGPIPE_W;
1081 require Fcntl;
1082 fcntl $SIGPIPE_R, &Fcntl::F_SETFL, &Fcntl::O_NONBLOCK if $SIGPIPE_R; 1085 fcntl $SIGPIPE_R, &Fcntl::F_SETFL, &Fcntl::O_NONBLOCK if $SIGPIPE_R;
1083 fcntl $SIGPIPE_W, &Fcntl::F_SETFL, &Fcntl::O_NONBLOCK if $SIGPIPE_W; # just in case 1086 fcntl $SIGPIPE_W, &Fcntl::F_SETFL, &Fcntl::O_NONBLOCK if $SIGPIPE_W; # just in case
1084 } 1087 }
1085 1088
1086 $SIGPIPE_R 1089 $SIGPIPE_R
1087 or Carp::croak "AnyEvent: unable to create a signal reporting pipe: $!\n"; 1090 or Carp::croak "AnyEvent: unable to create a signal reporting pipe: $!\n";
1088 1091
1092 # not strictly required, as $^F is normally 2, but let's make sure...
1093 fcntl $SIGPIPE_R, &Fcntl::F_SETFD, &Fcntl::FD_CLOEXEC;
1094 fcntl $SIGPIPE_W, &Fcntl::F_SETFD, &Fcntl::FD_CLOEXEC;
1095
1089 $SIG_IO = AnyEvent->io (fh => $SIGPIPE_R, poll => "r", cb => \&_signal_exec); 1096 $SIG_IO = AnyEvent->io (fh => $SIGPIPE_R, poll => "r", cb => \&_signal_exec);
1090 } 1097 }
1091 1098
1092 my $signal = uc $arg{signal} 1099 my $signal = uc $arg{signal}
1093 or Carp::croak "required option 'signal' is missing"; 1100 or Carp::croak "required option 'signal' is missing";
1094 1101
1095 $SIG_CB{$signal}{$arg{cb}} = $arg{cb}; 1102 $SIG_CB{$signal}{$arg{cb}} = $arg{cb};
1096 $SIG{$signal} ||= sub { 1103 $SIG{$signal} ||= sub {
1104 local $!;
1097 syswrite $SIGPIPE_W, "\x00", 1 unless %SIG_EV; 1105 syswrite $SIGPIPE_W, "\x00", 1 unless %SIG_EV;
1098 undef $SIG_EV{$signal}; 1106 undef $SIG_EV{$signal};
1099 }; 1107 };
1100 1108
1101 bless [$signal, $arg{cb}], "AnyEvent::Base::Signal" 1109 bless [$signal, $arg{cb}], "AnyEvent::Base::Signal"

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines