Hi Stas, Here's the patch for APR::Poll, complete with some documentation. I haven't included your non-blocking protocol handler tests -- could you paste them in when you make the commit to the tree?
Index: docs/api/APR/Socket.pod =================================================================== RCS file: /home/cvspublic/modperl-docs/src/docs/2.0/api/APR/Socket.pod,v retrieving revision 1.12 diff -d -u -r1.12 Socket.pod --- docs/api/APR/Socket.pod 18 Aug 2004 01:39:32 -0000 1.12 +++ docs/api/APR/Socket.pod 3 Sep 2004 18:09:21 -0000 @@ -599,6 +599,63 @@ +=head2 C<poll> + + $ret = $sock->poll($pool, $timeout, $events); + +=over 4 + +=item obj: C<$sock> +( C<L<APR::Socket object|docs::2.0::api::APR::Socket>> ) + +The socket to poll + +=item arg1: C<$pool> +( C<L<APR::Pool object|docs::2.0::api::APR::Pool>> ) + +An apr_pool_t object -- in most applications, just use the pool +provided by the +C<L<Apache::Connection object|docs::2.0::api::Apache::Connection>>. + +=item arg2: C<$timeout> ( integer ) + +The amount of time to wait (in milliseconds) for the specified events +to occur. + +=item arg3: C<$events> ( integer ) + +The events for which to wait. To wait for incoming data to be available, +use APR::POLLIN. To wait until it's possible to write data to the socket, +use APR::POLLOUT. And finally, to wait for priority data to become available, +use APR::POLLPRI. + +=item ret: C<$ret> ( integer ) + +=item since: 1.99_17-dev + +=back + +Examples: + + use APR::Socket (); + use APR::Const -compile => qw(POLLIN SUCCESS TIMEUP); + use APR::Connection (); + + my $rc = $sock->poll($connection->pool(), 1_000_000, APR::POLLIN); + if ($rc == APR::SUCCESS) { + # Data is waiting on the socket to be read. + } + elsif ($rc == APR::TIMEUP) { + # One second elapsed and still there is no data waiting to be + # read. + } + else { + die "something weird happened: " . APR::Error::strerror($rc); + } + +=back + + Index: xs/APR/Socket/APR__Socket.h =================================================================== RCS file: /home/cvspublic/modperl-2.0/xs/APR/Socket/APR__Socket.h,v retrieving revision 1.11 diff -d -u -r1.11 APR__Socket.h --- xs/APR/Socket/APR__Socket.h 9 Jun 2004 14:46:22 -0000 1.11 +++ xs/APR/Socket/APR__Socket.h 3 Sep 2004 18:09:22 -0000 @@ -96,3 +96,23 @@ MP_RUN_CROAK(apr_socket_opt_set(socket, opt, val), "APR::Socket::opt_set"); } + +static MP_INLINE +apr_int32_t mpxs_APR__Socket_poll(pTHX_ apr_socket_t *socket, + apr_pool_t *pool, + apr_interval_time_t timeout, + apr_int16_t reqevents) +{ + apr_pollfd_t fd; + apr_int32_t nsds; + + /* Set up the aprset parameter, which tells apr_poll what to poll */ + fd.desc_type = APR_POLL_SOCKET; + fd.reqevents = reqevents; + fd.rtnevents = 0; /* XXX: not really necessary to set this */ + fd.p = pool; + fd.desc.s = socket; + + /* Poll the socket */ + return apr_poll(&fd, 1, &nsds, timeout); +} Index: xs/APR/aprext/Makefile.PL =================================================================== RCS file: /home/cvspublic/modperl-2.0/xs/APR/aprext/Makefile.PL,v retrieving revision 1.5 diff -d -u -r1.5 Makefile.PL --- xs/APR/aprext/Makefile.PL 1 Aug 2004 19:44:01 -0000 1.5 +++ xs/APR/aprext/Makefile.PL 3 Sep 2004 18:09:22 -0000 @@ -19,7 +19,7 @@ $src{$cfile} = "$srcdir/$cfile"; } -my @skip = qw(dynamic test); +my @skip = qw(test); push @skip, q{static} unless (Apache::Build::BUILD_APREXT); Index: xs/maps/apr_functions.map =================================================================== RCS file: /home/cvspublic/modperl-2.0/xs/maps/apr_functions.map,v retrieving revision 1.85 diff -d -u -r1.85 apr_functions.map --- xs/maps/apr_functions.map 25 Aug 2004 22:32:01 -0000 1.85 +++ xs/maps/apr_functions.map 3 Sep 2004 18:09:22 -0000 @@ -3,16 +3,16 @@ # for mapping see %ModPerl::MapUtil::disabled_map in # lib/ModPerl/MapUtil.pm -!MODULE=APR::Poll - apr_poll_socket_add - apr_poll_socket_clear - apr_poll_data_get - apr_poll_revents_get - apr_poll_socket_mask - apr_poll - apr_poll_socket_remove - apr_poll_data_set - apr_poll_setup +MODULE=APR::Poll +? apr_poll_poll +? apr_poll_socket_add +? apr_poll_socket_clear +? apr_poll_data_get +? apr_poll_revents_get +? apr_poll_socket_mask +? apr_poll_socket_remove +? apr_poll_data_set +? apr_poll_setup !MODULE=APR::Time -apr_ctime @@ -72,6 +72,8 @@ -apr_socket_sendfile -apr_socket_sendv !apr_socket_from_file + mpxs_APR__Socket_poll | | apr_socket_t *:socket, apr_pool_t *:pool, \ + apr_interval_time_t:timeout, apr_int16_t:reqevents MODULE=APR::SockAddr !apr_sockaddr_info_get Index: xs/tables/current/Apache/ConstantsTable.pm =================================================================== RCS file: /home/cvspublic/modperl-2.0/xs/tables/current/Apache/ConstantsTable.pm,v retrieving revision 1.42 diff -d -u -r1.42 ConstantsTable.pm --- xs/tables/current/Apache/ConstantsTable.pm 13 Aug 2004 00:13:18 -0000 1.42 +++ xs/tables/current/Apache/ConstantsTable.pm 3 Sep 2004 18:09:22 -0000 @@ -2,7 +2,7 @@ # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # ! WARNING: generated by Apache::ParseSource/0.02 -# ! Thu Aug 12 17:10:15 2004 +# ! Mon Aug 30 11:29:14 2004 # ! do NOT edit, any changes will be lost ! # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -388,6 +388,7 @@ 'APR_DELONCLOSE' ], 'error' => [ + 'APR_END', 'APR_ENOSTAT', 'APR_ENOPOOL', 'APR_EBADDATE', @@ -443,8 +444,7 @@ 'APR_EFTYPE', 'APR_EPIPE', 'APR_EXDEV', - 'APR_ENOTEMPTY', - 'APR_END' + 'APR_ENOTEMPTY' ], 'common' => [ 'APR_SUCCESS' Index: xs/tables/current/ModPerl/FunctionTable.pm =================================================================== RCS file: /home/cvspublic/modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm,v retrieving revision 1.176 diff -d -u -r1.176 FunctionTable.pm --- xs/tables/current/ModPerl/FunctionTable.pm 25 Aug 2004 22:32:01 -0000 1.176 +++ xs/tables/current/ModPerl/FunctionTable.pm 3 Sep 2004 18:09:23 -0000 @@ -7660,6 +7660,28 @@ 'name' => 'func' } ] + }, + { + 'return_type' => 'apr_int32_t', + 'name' => 'mpxs_APR__Socket_poll', + 'args' => [ + { + 'type' => 'apr_socket_t *', + 'name' => 'socket' + }, + { + 'type' => 'apr_pool_t *', + 'name' => 'pool' + }, + { + 'type' => 'apr_interval_time_t', + 'name' => 'timeout' + }, + { + 'type' => 'apr_int16_t', + 'name' => 'reqevents' + } + ] } ]; TTUL Ken Stas Bekman [31/08/04 00:01 -0400]: > > Another thing is the test. First of all it's quite possible that on a slow > machine the first subtest will fail, so it should probably wait much > longer on the first call. > > Second, I'd like to see is replacing sleep 2 with something faster. The > test suite is already huge and adding extra sleeps adds up to a long run > time. I think the test can be rewritten as so: > > > --- /dev/null 1969-12-31 19:00:00.000000000 -0500 > +++ t/protocol/echo_nonblock.t 2004-08-30 23:57:44.606577082 -0400 > @@ -0,0 +1,27 @@ > +use strict; > +use warnings FATAL => 'all'; > + > +use Test; > +use Apache::TestUtil; > +use Apache::TestRequest (); > + > +plan tests => 3; > + > +my $socket = > Apache::TestRequest::vhost_socket('TestProtocol::echo_nonblock'); > + > +ok $socket; > + > +my $received; > +my $expected; > + > +$expected = "nonblocking"; > +print $socket "$expected\n"; > +chomp($received = <$socket> || ''); > +ok t_cmp $received, $expected, "no timeout"; > + > +# now get a timed out request > +$expected = "TIMEUP"; > +print $socket "should timeout\n"; > +chomp($received = <$socket> || ''); > +ok t_cmp $received, $expected, "timed out"; > + > > --- /dev/null 1969-12-31 19:00:00.000000000 -0500 > +++ t/protocol/TestProtocol/echo_nonblock.pm 2004-08-30 > 23:59:25.512107442 -0400 > @@ -0,0 +1,59 @@ > +package TestProtocol::echo_nonblock; > + > +# this test reads from/writes to the socket doing nonblocking IO > + > +use strict; > +use warnings FATAL => 'all'; > + > +use Apache::Connection (); > +use APR::Socket (); > + > +use Apache::TestTrace; > + > +use Apache::Const -compile => 'OK'; > +use APR::Const -compile => qw(SO_NONBLOCK TIMEUP SUCCESS POLLIN); > + > +use constant BUFF_LEN => 1024; > + > +sub handler { > + my $c = shift; > + my $socket = $c->client_socket; > + > + $socket->opt_set(APR::SO_NONBLOCK => 1); > + > + my $counter = 0; > + my $timeout = 0; > + while (1) { > + if ($counter != 1) { > + # Wait up to ten seconds for data to arrive. > + $timeout = 10_000_000; > + $counter++; > + } elsif ($counter == 1) { > + # this will certainly fail > + $timeout = 0; > + $counter++; > + } > + > + my $rc = $socket->poll($c->pool, $timeout, APR::POLLIN); > + if ($rc == APR::SUCCESS) { > + if ($socket->recv(my $buf, BUFF_LEN)) { > + debug "no timeout"; > + $socket->send($buf); > + } > + else { > + last; > + } > + } > + elsif ($rc == APR::TIMEUP) { > + debug "timeout"; > + $socket->send("TIMEUP\n"); > + } > + else { > + die "poll error: $rc: " . APR::Error::strerror($rc); > + } > + } > + > + Apache::OK; > +} > + > +1; > > -- > __________________________________________________________________ > Stas Bekman JAm_pH ------> Just Another mod_perl Hacker > http://stason.org/ mod_perl Guide ---> http://perl.apache.org > mailto:[EMAIL PROTECTED] http://use.perl.org http://apacheweek.com > http://modperlbook.org http://apache.org http://ticketmaster.com > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > -- MailChannels: Imagine no more spam -- http://www.mailchannels.com MailChannels Corporation Suite 1600, 1188 West Georgia St. Vancouver, BC, Canada Ken Simpson, CEO +1-604-729-1741 --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]