mturk       2002/06/27 10:19:09

  Modified:    jk/native2/common jk_channel_apr_socket.c
  Log:
  Added socket keepalive and send/recv timeout options.
  keepalive=1/0 (enabled/disabled)
  timeout=nn (seconds) defaults to unlimited
  Added nodelay option (default disabled)
  nodelay=1/0 (enabled/disabled)
  
  Revision  Changes    Path
  1.23      +42 -11    
jakarta-tomcat-connectors/jk/native2/common/jk_channel_apr_socket.c
  
  Index: jk_channel_apr_socket.c
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_channel_apr_socket.c,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- jk_channel_apr_socket.c   10 Jun 2002 21:55:06 -0000      1.22
  +++ jk_channel_apr_socket.c   27 Jun 2002 17:19:09 -0000      1.23
  @@ -88,6 +88,8 @@
       apr_sockaddr_t *addr;
       char *host;
       short port;
  +    int keepalive;
  +    int timeout;
   };
   
   typedef struct jk_channel_apr_private jk_channel_apr_private_t;
  @@ -121,6 +123,12 @@
           socketInfo->host=value;
       } else if( strcmp( "port", name ) == 0 ) {
           socketInfo->port=atoi( value );
  +    } else if( strcmp( "keepalive", name ) == 0 ) {
  +        socketInfo->keepalive=atoi( value );
  +    } else if( strcmp( "timeout", name ) == 0 ) {
  +        socketInfo->timeout=atoi( value );
  +    } else if( strcmp( "nodelay", name ) == 0 ) {
  +        socketInfo->timeout=atoi( value );
       } else {
           return jk2_channel_setAttribute( env, mbean, name, valueP );
       }
  @@ -206,10 +214,11 @@
   
       apr_sockaddr_t *remote_sa=socketInfo->addr;
       int ndelay=socketInfo->ndelay;
  +    int keepalive=socketInfo->keepalive;
   
       apr_socket_t *sock=endpoint->channelData;
       apr_status_t ret;
  -    apr_interval_time_t timeout = 2 * APR_USEC_PER_SEC;
  +    apr_int32_t timeout = socketInfo->timeout * APR_USEC_PER_SEC;
       char msg[128];
   
       if (apr_socket_create(&sock, remote_sa->family, SOCK_STREAM,
  @@ -223,6 +232,11 @@
       env->l->jkLog(env, env->l, JK_LOG_INFO,
                     "channelApr.open(): create tcp socket %d\n", sock );
   
  +    /* the default timeout (0) will set the socket to blocking with
  +       infinite timeouts.
  +     */
  +    if (timeout <= 0)
  +        timeout = -1;
       if (apr_setsocketopt(sock, APR_SO_TIMEOUT, timeout)!= APR_SUCCESS) {
           env->l->jkLog(env, env->l, JK_LOG_ERROR,
                    "channelApr.open(): can't set timeout %d %s\n",
  @@ -235,7 +249,7 @@
           env->l->jkLog(env, env->l, JK_LOG_INFO,
                         "channelApr.open() connect on %d\n",sock);
           ret = apr_connect(sock, remote_sa);
  -        env->l->jkLog(env, env->l, JK_LOG_ERROR,
  +        env->l->jkLog(env, env->l, JK_LOG_INFO,
                         "jk2_channel_apr_open: %d %s %s\n",ret, strerror( errno ),
                         socketInfo->host);
   
  @@ -245,20 +259,38 @@
       if(ret != APR_SUCCESS ) {
           apr_socket_close(sock);
           env->l->jkLog(env, env->l, JK_LOG_ERROR,
  -                      "channelApr.connect() connect failed %d %s\n",
  +                      "channelApr.open() connect failed %d %s\n",
                         ret, apr_strerror( ret, msg, sizeof(msg) ) );
           return JK_ERR;
       }
  +    
  +    /* enable the use of keep-alive packets on TCP connection */
  +    if(keepalive) {
  +        int set = 1;
  +        if((ret = apr_setsocketopt(sock, APR_SO_KEEPALIVE, set)) != APR_SUCCESS ) {
  +            apr_socket_close(sock);
  +            env->l->jkLog(env, env->l, JK_LOG_ERROR,
  +                          "channelApr.open() keepalive failed %d %s\n",
  +                          ret, apr_strerror( ret, msg, sizeof(msg) ) );
  +            return JK_ERR;                        
  +        }
  +    }
   
  -    /* XXX needed?
  +    /* Disable the Nagle algorithm if ndelay is set */
       if(ndelay) {
           int set = 1;
  -        setsockopt(sock, IPPROTO_TCP, TCP_NODELAY,(char *)&set,sizeof(set));
  +        if((ret = apr_setsocketopt(sock, APR_TCP_NODELAY, set)) != APR_SUCCESS ) {
  +            apr_socket_close(sock);
  +            env->l->jkLog(env, env->l, JK_LOG_ERROR,
  +                          "channelApr.open() nodelay failed %d %s\n",
  +                          ret, apr_strerror( ret, msg, sizeof(msg) ) );
  +            return JK_ERR;                        
  +        }
       }
           
  -    env->l->jkLog(env, env->l, JK_LOG_INFO,
  -                  "channelApr.connect(), sock = %d\n", sock);
  -    */
  +    if( ch->mbean->debug > 0 )
  +        env->l->jkLog(env, env->l, JK_LOG_INFO,
  +                      "channelApr.open(), sock = %d\n", sock);
   
       /* store the channel information */
       endpoint->channelData=sock;
  @@ -421,11 +453,11 @@
                                                const char *type, const char *name)
   {
       jk_channel_t *ch;
  -    
  +
       ch=(jk_channel_t *)pool->calloc(env, pool, sizeof( jk_channel_t));
       
       ch->_privatePtr= (jk_channel_apr_private_t *)
  -        pool->calloc( env, pool, sizeof( jk_channel_apr_private_t));
  +                     pool->calloc( env, pool, sizeof( jk_channel_apr_private_t));
   
       ch->recv= jk2_channel_apr_recv; 
       ch->send= jk2_channel_apr_send; 
  @@ -456,6 +488,5 @@
   
       return JK_OK;
   }
  -
   
   #endif
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to