--- AnyEvent/lib/AnyEvent.pm 2009/03/27 10:49:50 1.199 +++ AnyEvent/lib/AnyEvent.pm 2009/04/01 15:29:00 1.202 @@ -1072,13 +1072,16 @@ my (undef, %arg) = @_; unless ($SIGPIPE_R) { + require Fcntl; + if (AnyEvent::WIN32) { + require AnyEvent::Util; + ($SIGPIPE_R, $SIGPIPE_W) = AnyEvent::Util::portable_pipe (); AnyEvent::Util::fh_nonblocking ($SIGPIPE_R) if $SIGPIPE_R; AnyEvent::Util::fh_nonblocking ($SIGPIPE_W) if $SIGPIPE_W; # just in case } else { pipe $SIGPIPE_R, $SIGPIPE_W; - require Fcntl; fcntl $SIGPIPE_R, &Fcntl::F_SETFL, &Fcntl::O_NONBLOCK if $SIGPIPE_R; fcntl $SIGPIPE_W, &Fcntl::F_SETFL, &Fcntl::O_NONBLOCK if $SIGPIPE_W; # just in case } @@ -1086,6 +1089,10 @@ $SIGPIPE_R or Carp::croak "AnyEvent: unable to create a signal reporting pipe: $!\n"; + # not strictly required, as $^F is normally 2, but let's make sure... + fcntl $SIGPIPE_R, &Fcntl::F_SETFD, &Fcntl::FD_CLOEXEC; + fcntl $SIGPIPE_W, &Fcntl::F_SETFD, &Fcntl::FD_CLOEXEC; + $SIG_IO = AnyEvent->io (fh => $SIGPIPE_R, poll => "r", cb => \&_signal_exec); } @@ -1094,6 +1101,7 @@ $SIG_CB{$signal}{$arg{cb}} = $arg{cb}; $SIG{$signal} ||= sub { + local $!; syswrite $SIGPIPE_W, "\x00", 1 unless %SIG_EV; undef $SIG_EV{$signal}; };