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]
   
  
  
  

Reply via email to