stas 2004/04/08 13:47:42
Modified: src/modules/perl modperl_util.h
xs/APR/Socket APR__Socket.h
xs/maps apr_functions.map
xs/tables/current/ModPerl FunctionTable.pm
t/protocol/TestProtocol echo.pm
. Changes
Log:
make APR::Socket::opt_(set|get) working (and change the previous behavior)
Revision Changes Path
1.54 +12 -0 modperl-2.0/src/modules/perl/modperl_util.h
Index: modperl_util.h
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_util.h,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -u -r1.53 -r1.54
--- modperl_util.h 2 Apr 2004 02:17:45 -0000 1.53
+++ modperl_util.h 8 Apr 2004 20:47:41 -0000 1.54
@@ -72,6 +72,18 @@
} \
} while (0)
+
+/* runs a given code and if failed sets $APR::err to the error message
+ * and returns &PL_sv_undef */
+#define MP_APR_RETURN_ON_FAILURE(rc_run) do { \
+ apr_status_t rc = (rc_run); \
+ if (rc != APR_SUCCESS) { \
+ GV *gv = gv_fetchpv("APR::err", GV_ADDMULTI, SVt_PV); \
+ sv_setpv(GvSV(gv), modperl_apr_strerror(rc)); \
+ return &PL_sv_undef; \
+ } \
+ } while (0)
+
/* check whether the response phase has been initialized already */
#define MP_CHECK_WBUCKET_INIT(func) \
if (!rcfg->wbucket) { \
1.5 +17 -0 modperl-2.0/xs/APR/Socket/APR__Socket.h
Index: APR__Socket.h
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/APR/Socket/APR__Socket.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -u -r1.4 -r1.5
--- APR__Socket.h 4 Mar 2004 06:01:10 -0000 1.4
+++ APR__Socket.h 8 Apr 2004 20:47:41 -0000 1.5
@@ -64,3 +64,20 @@
return t;
}
+static MP_INLINE SV *
+mpxs_APR__Socket_opt_get(pTHX_ apr_socket_t *socket, apr_int32_t opt)
+{
+ apr_int32_t val;
+ MP_APR_RETURN_ON_FAILURE(apr_socket_opt_get(socket, opt, &val));
+ return newSViv(val);
+}
+
+static MP_INLINE SV *
+mpxs_APR__Socket_opt_set(pTHX_ apr_socket_t *socket, apr_int32_t opt,
+ apr_int32_t val)
+{
+ apr_int32_t oldval;
+ MP_APR_RETURN_ON_FAILURE(apr_socket_opt_get(socket, opt, &oldval));
+ MP_APR_RETURN_ON_FAILURE(apr_socket_opt_set(socket, opt, val));
+ return newSViv(oldval);
+}
1.71 +4 -2 modperl-2.0/xs/maps/apr_functions.map
Index: apr_functions.map
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/maps/apr_functions.map,v
retrieving revision 1.70
retrieving revision 1.71
diff -u -u -r1.70 -r1.71
--- apr_functions.map 31 Jan 2004 10:06:59 -0000 1.70
+++ apr_functions.map 8 Apr 2004 20:47:41 -0000 1.71
@@ -58,8 +58,10 @@
!apr_socket_addr_get
!apr_socket_data_get
!apr_socket_data_set
- apr_socket_opt_get
- apr_socket_opt_set
+-apr_socket_opt_get
+-apr_socket_opt_set
+ mpxs_APR__Socket_opt_get
+ mpxs_APR__Socket_opt_set
apr_socket_timeout_get | mpxs_ | ...
apr_socket_timeout_set
-apr_socket_sendfile
1.150 +48 -0 modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm
Index: FunctionTable.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm,v
retrieving revision 1.149
retrieving revision 1.150
diff -u -u -r1.149 -r1.150
--- FunctionTable.pm 2 Apr 2004 02:17:46 -0000 1.149
+++ FunctionTable.pm 8 Apr 2004 20:47:41 -0000 1.150
@@ -6829,6 +6829,54 @@
]
},
{
+ 'return_type' => 'SV *',
+ 'name' => 'mpxs_APR__Socket_opt_get',
+ 'attr' => [
+ 'static',
+ '__inline__'
+ ],
+ 'args' => [
+ {
+ 'type' => 'PerlInterpreter *',
+ 'name' => 'my_perl'
+ },
+ {
+ 'type' => 'apr_socket_t *',
+ 'name' => 'socket'
+ },
+ {
+ 'type' => 'apr_int32_t',
+ 'name' => 'opt'
+ },
+ ]
+ },
+ {
+ 'return_type' => 'SV *',
+ 'name' => 'mpxs_APR__Socket_opt_set',
+ 'attr' => [
+ 'static',
+ '__inline__'
+ ],
+ 'args' => [
+ {
+ 'type' => 'PerlInterpreter *',
+ 'name' => 'my_perl'
+ },
+ {
+ 'type' => 'apr_socket_t *',
+ 'name' => 'socket'
+ },
+ {
+ 'type' => 'apr_int32_t',
+ 'name' => 'opt'
+ },
+ {
+ 'type' => 'apr_int32_t',
+ 'name' => 'val'
+ },
+ ]
+ },
+ {
'return_type' => '',
'name' => 'mpxs_apr_sockaddr_ip_get',
'args' => [
1.5 +15 -3 modperl-2.0/t/protocol/TestProtocol/echo.pm
Index: echo.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/protocol/TestProtocol/echo.pm,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -u -r1.4 -r1.5
--- echo.pm 8 Apr 2004 00:11:25 -0000 1.4
+++ echo.pm 8 Apr 2004 20:47:41 -0000 1.5
@@ -15,13 +15,25 @@
my Apache::Connection $c = shift;
my APR::Socket $socket = $c->client_socket;
- my $buff;
-
# make sure the socket is in the blocking mode for recv().
# on some platforms (e.g. OSX/Solaris) httpd hands us a
# non-blocking socket
- $socket->opt_set(APR::SO_NONBLOCK, 0);
+ my $nonblocking = $socket->opt_get(APR::SO_NONBLOCK);
+ die "failed to \$socket->opt_get: $ARP::err"
+ unless defined $nonblocking;
+ if ($nonblocking) {
+ my $prev_value = $socket->opt_set(APR::SO_NONBLOCK => 0);
+ die "failed to \$socket->opt_set: $ARP::err"
+ unless defined $prev_value;
+ # test that we really are in the non-blocking mode
+ $nonblocking = $socket->opt_get(APR::SO_NONBLOCK);
+ die "failed to \$socket->opt_get: $ARP::err"
+ unless defined $nonblocking;
+ die "failed to set non-blocking mode" if $nonblocking;
+ }
+
+ my $buff;
for (;;) {
my($rlen, $wlen);
$rlen = BUFF_LEN;
1.358 +3 -0 modperl-2.0/Changes
Index: Changes
===================================================================
RCS file: /home/cvs/modperl-2.0/Changes,v
retrieving revision 1.357
retrieving revision 1.358
diff -u -u -r1.357 -r1.358
--- Changes 7 Apr 2004 23:44:21 -0000 1.357
+++ Changes 8 Apr 2004 20:47:41 -0000 1.358
@@ -12,6 +12,9 @@
=item 1.99_14-dev
+make APR::Socket::opt_(set|get) working (and change the previous
+behavior) [Stas]
+
make sure that our protocol module tests that interact with the socket
use a blocking read [Joe Orton]