You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by co...@apache.org on 2002/05/29 00:50:04 UTC

cvs commit: jakarta-tomcat-connectors/jk/java/org/apache/jk/common ChannelUn.java

costin      02/05/28 15:50:04

  Modified:    jk/java/org/apache/jk/apr AprImpl.java
               jk/java/org/apache/jk/common ChannelUn.java
  Log:
  Update signatures.
  
  Remove old/duplicated code, now HandlerJni is used for all java components with
  a C peer.
  
  Revision  Changes    Path
  1.17      +1 -1      jakarta-tomcat-connectors/jk/java/org/apache/jk/apr/AprImpl.java
  
  Index: AprImpl.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/java/org/apache/jk/apr/AprImpl.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- AprImpl.java	26 May 2002 07:13:02 -0000	1.16
  +++ AprImpl.java	28 May 2002 22:50:04 -0000	1.17
  @@ -145,7 +145,7 @@
        *  do things like continuations.
        */
       public static native int jkInvoke(long xEnv, long componentP, long endpointP,
  -                                      int code, byte data[], int len);
  +                                      int code, byte data[], int off, int len, int raw);
   
       /** Recycle an endpoint after use.
        */
  
  
  
  1.19      +70 -160   jakarta-tomcat-connectors/jk/java/org/apache/jk/common/ChannelUn.java
  
  Index: ChannelUn.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/java/org/apache/jk/common/ChannelUn.java,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- ChannelUn.java	26 May 2002 07:13:59 -0000	1.18
  +++ ChannelUn.java	28 May 2002 22:50:04 -0000	1.19
  @@ -77,12 +77,14 @@
    *
    * @author Costin Manolache
    */
  -public class ChannelUn extends JkHandler {
  +public class ChannelUn extends JniHandler {
  +    static final int CH_OPEN=4;
  +    static final int CH_CLOSE=5;
  +    static final int CH_READ=6;
  +    static final int CH_WRITE=7;
   
       String file;
       ThreadPool tp;
  -    String jkHome;
  -    String aprHome;
   
       /* ==================== Tcp socket options ==================== */
   
  @@ -94,51 +96,36 @@
           file=f;
       }
   
  -    /** Set the base dir of the jk webapp. This is used to locate
  -     *  the (fixed) path to the native lib.
  -     */
  -    public void setJkHome( String s ) {
  -        jkHome=s;
  -    }
  -
  -    /** Directory where APR and jni_connect are installed.
  -     */
  -    public void setAprHome( String s ) {
  -        aprHome=s;
  -    }
  -
       /* ==================== ==================== */
  -    long unixListenSocket;
       int socketNote=1;
       int isNote=2;
       int osNote=3;
  -    AprImpl apr;
       
  -    public void accept( MsgContext ep ) throws IOException {
  -        long l= apr.unAccept(unixListenSocket);
  -        /* We could create a real java.net.Socket, or a UnixSocket, etc
  -         */
  -        ep.setNote( socketNote, new Long( l ) );
  -
  -        if( log.isDebugEnabled() )
  -            log.debug("Accepted socket " + l );
  -    }
  -
       public void init() throws IOException {
  -        apr=(AprImpl)wEnv.getHandler("apr");
  -        if( apr==null || ! apr.isLoaded() ) {
  -            log.debug("Apr is not available, disabling unix channel ");
  -            apr=null;
  -            return;
  -        }
           if( file==null ) {
               log.error("No file, disabling unix channel");
  -            return;
  +            throw new IOException( "No file for the unix socket channel");
           }
           if( wEnv.getLocalId() != 0 ) {
               file=file+ wEnv.getLocalId();
           }
  +
  +        super.initNative( "channel.un:" + file );
  +
  +        if( apr==null || ! apr.isLoaded() ) {
  +            log.debug("Apr is not available, disabling unix channel ");
  +            apr=null;
  +            return;
  +        }
           
  +        // Set properties and call init.
  +        setNativeAttribute( "file", file );
  +        // unixListenSocket=apr.unSocketListen( file, 10 );
  +
  +        setNativeAttribute( "listen", "10" );
  +        setNativeAttribute( "debug", "10" );
  +
  +        // Initialize the thread pool and execution chain
           if( next==null ) {
               if( nextName!=null ) 
                   setNext( wEnv.getHandler( nextName ) );
  @@ -156,9 +143,8 @@
               if (!socketFile.delete())
                     throw(new IOException("Cannot remove " + file));
           }
  -        unixListenSocket=apr.unSocketListen( file, 10 );
  -        if (unixListenSocket<0)
  -            throw(new IOException("Cannot create listening socket " + file));
  +
  +        super.initJkComponent();
   
           log.info("JK: listening on unix socket: " + file );
           
  @@ -168,161 +154,79 @@
           tp.runIt( acceptAjp);
       }
   
  -    public void open(MsgContext ep) throws IOException {
  -    }
  -
  -    
  -    public void close(MsgContext ep) throws IOException {
  -        if( apr==null ) return;
  -        Long s=(Long)ep.getNote( socketNote );
  -        apr.unSocketClose(s.longValue(),3);
  -    }
  -
       public void destroy() throws IOException {
           if( apr==null ) return;
           try {
               if( tp != null )
                   tp.shutdown();
               
  -            if(apr !=null ) 
  -                apr.unSocketClose( unixListenSocket,3);
  +            //apr.unSocketClose( unixListenSocket,3);
  +            super.destroyJkComponent();
  +            
           } catch(Exception e) {
               e.printStackTrace();
           }
       }
  +
  +    /** Open a connection - since we're listening that will block in
  +        accept
  +    */
  +    public void open(MsgContext ep) throws IOException {
  +        // Will associate a jk_endpoint with ep and call open() on it.
  +        // jk_channel_un will accept a connection and set the socket info
  +        // in the endpoint. MsgContext will represent an active connection.
  +        super.nativeDispatch( ep.getMsg(0), ep, CH_OPEN, 1 );
  +    }
  +    
  +    public void close(MsgContext ep) throws IOException {
  +        super.nativeDispatch( ep.getMsg(0), ep, CH_CLOSE, 1 );
  +    }
  +
       public int send( Msg msg, MsgContext ep)
           throws IOException
       {
  -        msg.end(); // Write the packet header
  -        byte buf[]=msg.getBuffer();
  -        int len=msg.getLen();
  -        
  -        if(log.isDebugEnabled() )
  -            log.debug("send() " + len + " " + buf[4] );
  -
  -        Long s=(Long)ep.getNote( socketNote );
  -
  -        apr.unWrite(  s.longValue(), buf, 0, len );
  -        return len;
  +        return super.nativeDispatch( msg, ep, CH_WRITE, 0 );
       }
   
       public int receive( Msg msg, MsgContext ep )
           throws IOException
       {
  -        if (log.isDebugEnabled()) {
  -            log.debug("receive()");
  -        }
  +        int rc=super.nativeDispatch( msg, ep, CH_READ, 1 );
   
  -        byte buf[]=msg.getBuffer();
  -        int hlen=msg.getHeaderLength();
  -        
  -	// XXX If the length in the packet header doesn't agree with the
  -	// actual number of bytes read, it should probably return an error
  -	// value.  Also, callers of this method never use the length
  -	// returned -- should probably return true/false instead.
  -
  -        int rd = this.read(ep, buf, 0, hlen );
  -        
  -        if(rd < 0) {
  -            // Most likely normal apache restart.
  -            return rd;
  -        }
  -
  -        msg.processHeader();
  -
  -        /* After processing the header we know the body
  -           length
  -        */
  -        int blen=msg.getLen();
  -        
  -	// XXX check if enough space - it's assert()-ed !!!
  -        
  - 	int total_read = 0;
  -        
  -        total_read = this.read(ep, buf, hlen, blen);
  -        
  -        if (total_read <= 0) {
  -            log.warn("can't read body, waited #" + blen);
  -            return  -1;
  +        if( rc!=0 ) {
  +            log.error("receive error:   " + rc);
  +            return -1;
           }
           
  -        if (total_read != blen) {
  -             log.warn( "incomplete read, waited #" + blen +
  -                        " got only " + total_read);
  -            return -2;
  -        }
  +        msg.processHeader();
           
           if (log.isDebugEnabled())
  -             log.debug("receive:  total read = " + total_read);
  -	return total_read;
  -    }
  -    
  -    /**
  -     * Read N bytes from the InputStream, and ensure we got them all
  -     * Under heavy load we could experience many fragmented packets
  -     * just read Unix Network Programming to recall that a call to
  -     * read didn't ensure you got all the data you want
  -     *
  -     * from read() Linux manual
  -     *
  -     * On success, the number of bytes read is returned (zero indicates end of file),
  -     * and the file position is advanced by this number.
  -     * It is not an error if this number is smaller than the number of bytes requested;
  -     * this may happen for example because fewer bytes
  -     * are actually available right now (maybe because we were close to end-of-file,
  -     * or because we are reading from a pipe, or  from  a
  -     * terminal),  or  because  read()  was interrupted by a signal.
  -     * On error, -1 is returned, and errno is set appropriately. In this
  -     * case it is left unspecified whether the file position (if any) changes.
  -     *
  -     **/
  -    public int read( MsgContext ep, byte[] b, int offset, int len) throws IOException {
  -        Long s=(Long)ep.getNote( socketNote );
  -        int pos = 0;
  -        int got;
  -
  -        while(pos < len) {
  -            got=apr.unRead( s.longValue(),
  -                            b, pos + offset, len - pos);
  -
  -            if (log.isDebugEnabled()) {
  -                log.debug("reading  # " + b + " " + (b==null ? 0: b.length) + " " +
  -                  offset + " " + len + " got # " + got);
  -            }
  -            // connection just closed by remote. 
  -            if (got <= 0) {
  -                return got;
  -            }
  +             log.debug("receive:  total read = " + msg.getLen());
   
  -            pos += got;
  -        }
  -        return pos;
  +	return msg.getLen();
       }
  -
       
  -//     public MsgContext createEndpoint() {
  -//         MsgContext mc=new MsgContext();
  -//         mc.setChannel( this );
  -//         mc.setWorkerEnv( wEnv );
  -//         return mc;
  -//     }
  -
       boolean running=true;
       
       /** Accept incoming connections, dispatch to the thread pool
        */
       void acceptConnections() {
  +        if( apr==null ) return;
  +
           if( log.isDebugEnabled() )
               log.debug("Accepting ajp connections on " + file);
  -        if( apr==null ) return;
  +        
           while( running ) {
               try {
  -                MsgContext ep=new MsgContext();
  -                ep.setSource( this );
  -                ep.setWorkerEnv( wEnv );
  -                this.accept(ep);
  -                AprConnection ajpConn=
  -                    new AprConnection(this, ep);
  +                MsgContext ep=this.createMsgContext();
  +
  +                // blocking - opening a server connection.
  +                this.open(ep);
  +
  +                //    if( log.isDebugEnabled() )
  +                //     log.debug("Accepted ajp connections ");
  +        
  +                AprConnection ajpConn= new AprConnection(this, ep);
                   tp.runIt( ajpConn );
               } catch( Exception ex ) {
                   ex.printStackTrace();
  @@ -344,8 +248,11 @@
                       break;
                   }
                   ep.setType(0);
  -                int status=this.invoke( recv, ep );
  +                log.debug( "Process msg ");
  +                int status=next.invoke( recv, ep );
               }
  +            if( log.isDebugEnabled() )
  +                log.debug( "Closing un channel");
               this.close( ep );
           } catch( Exception ex ) {
               ex.printStackTrace();
  @@ -360,9 +267,12 @@
               return receive( msg, ep );
           case JkHandler.HANDLE_SEND_PACKET:
               return send( msg, ep );
  +        case JkHandler.HANDLE_FLUSH:
  +            return OK;
           }
   
  -        return next.invoke( msg, ep );
  +        // return next.invoke( msg, ep );
  +        return OK;
       }
   
       private static org.apache.commons.logging.Log log=
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>