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.198 by root, Thu Mar 26 20:17:44 2009 UTC vs.
Revision 1.202 by root, Wed Apr 1 15:29:00 2009 UTC

168=head2 I/O WATCHERS 168=head2 I/O WATCHERS
169 169
170You can create an I/O watcher by calling the C<< AnyEvent->io >> method 170You can create an I/O watcher by calling the C<< AnyEvent->io >> method
171with the following mandatory key-value pairs as arguments: 171with the following mandatory key-value pairs as arguments:
172 172
173C<fh> the Perl I<file handle> (I<not> file descriptor) to watch for events 173C<fh> is the Perl I<file handle> (I<not> file descriptor) to watch
174(AnyEvent might or might not keep a reference to this file handle). C<poll> 174for events (AnyEvent might or might not keep a reference to this file
175handle). Note that only file handles pointing to things for which
176non-blocking operation makes sense are allowed. This includes sockets,
177most character devices, pipes, fifos and so on, but not for example files
178or block devices.
179
175must be a string that is either C<r> or C<w>, which creates a watcher 180C<poll> must be a string that is either C<r> or C<w>, which creates a
176waiting for "r"eadable or "w"ritable events, respectively. C<cb> is the 181watcher waiting for "r"eadable or "w"ritable events, respectively.
182
177callback to invoke each time the file handle becomes ready. 183C<cb> is the callback to invoke each time the file handle becomes ready.
178 184
179Although the callback might get passed parameters, their value and 185Although the callback might get passed parameters, their value and
180presence is undefined and you cannot rely on them. Portable AnyEvent 186presence is undefined and you cannot rely on them. Portable AnyEvent
181callbacks cannot use arguments passed to I/O watcher callbacks. 187callbacks cannot use arguments passed to I/O watcher callbacks.
182 188
867no warnings; 873no warnings;
868use strict qw(vars subs); 874use strict qw(vars subs);
869 875
870use Carp; 876use Carp;
871 877
872our $VERSION = 4.341; 878our $VERSION = 4.35;
873our $MODEL; 879our $MODEL;
874 880
875our $AUTOLOAD; 881our $AUTOLOAD;
876our @ISA; 882our @ISA;
877 883
1064 1070
1065sub signal { 1071sub signal {
1066 my (undef, %arg) = @_; 1072 my (undef, %arg) = @_;
1067 1073
1068 unless ($SIGPIPE_R) { 1074 unless ($SIGPIPE_R) {
1075 require Fcntl;
1076
1069 if (AnyEvent::WIN32) { 1077 if (AnyEvent::WIN32) {
1078 require AnyEvent::Util;
1079
1070 ($SIGPIPE_R, $SIGPIPE_W) = AnyEvent::Util::portable_pipe (); 1080 ($SIGPIPE_R, $SIGPIPE_W) = AnyEvent::Util::portable_pipe ();
1071 AnyEvent::Util::fh_nonblocking ($SIGPIPE_R) if $SIGPIPE_R; 1081 AnyEvent::Util::fh_nonblocking ($SIGPIPE_R) if $SIGPIPE_R;
1072 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
1073 } else { 1083 } else {
1074 pipe $SIGPIPE_R, $SIGPIPE_W; 1084 pipe $SIGPIPE_R, $SIGPIPE_W;
1075 require Fcntl;
1076 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;
1077 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
1078 } 1087 }
1079 1088
1080 $SIGPIPE_R 1089 $SIGPIPE_R
1081 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";
1082 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
1083 $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);
1084 } 1097 }
1085 1098
1086 my $signal = uc $arg{signal} 1099 my $signal = uc $arg{signal}
1087 or Carp::croak "required option 'signal' is missing"; 1100 or Carp::croak "required option 'signal' is missing";
1088 1101
1089 $SIG_CB{$signal}{$arg{cb}} = $arg{cb}; 1102 $SIG_CB{$signal}{$arg{cb}} = $arg{cb};
1090 $SIG{$signal} ||= sub { 1103 $SIG{$signal} ||= sub {
1104 local $!;
1091 syswrite $SIGPIPE_W, "\x00", 1 unless %SIG_EV; 1105 syswrite $SIGPIPE_W, "\x00", 1 unless %SIG_EV;
1092 undef $SIG_EV{$signal}; 1106 undef $SIG_EV{$signal};
1093 }; 1107 };
1094 1108
1095 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