costin 02/01/25 23:24:37 Modified: jk/java/org/apache/jk/common ChannelJni.java Log: Yes, it's working ( at least at hello world level ). And I bet it's going to be much better now ( I only tested with the dummy container, 3.3/4.0 should be easy to add but need some more work ) See the commits on the c side for details. Revision Changes Path 1.3 +129 -40 jakarta-tomcat-connectors/jk/java/org/apache/jk/common/ChannelJni.java Index: ChannelJni.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/java/org/apache/jk/common/ChannelJni.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- ChannelJni.java 16 Jan 2002 15:38:29 -0000 1.2 +++ ChannelJni.java 26 Jan 2002 07:24:37 -0000 1.3 @@ -77,60 +77,149 @@ * * @author Costin Manolache */ -public class ChannelJni extends JkChannel implements Channel { +public class ChannelJni extends Channel { + int receivedNote=1; + public ChannelJni() { + // we use static for now, it's easier on the C side. + // Easy to change after we get everything working + chJni=this; + } - /* ==================== ==================== */ - - static WorkerEnv wenv=null; + public void init() throws IOException { + // static field init, temp + wEnv=we; + } - public static int startup(String cmdLine, - String stdout, - String stderr) + public int receive( Msg msg, Endpoint ep ) + throws IOException { - System.out.println("In startup"); - System.err.println("In startup err"); - if( wenv!=null ) { - d("Second call, ignored "); - return 1; - } - - try { - if(null != stdout) { - PrintStream out=new PrintStream(new FileOutputStream(stdout)); - System.setOut(out); - if( stderr==null ) - System.setErr(out); - } - if(null != stderr) { - PrintStream err=new PrintStream(new FileOutputStream(stderr)); - System.setErr(err); - if( stdout==null ) - System.setOut(err); - } - if( stdout==null && stderr==null ) { - // no problem, use stderr - it'll go to error.log of the server. - System.setOut( System.err ); - } - } catch(Throwable t) { + Msg sentResponse=(Msg)ep.getNote( receivedNote ); + // same buffer is used, no need to copy + if( msg==sentResponse ) { + d("Returned previously received message "); + return 0; } - System.out.println("New stream"); - System.err.println("New err stream"); - return 1; + d("XXX Copy previously received message "); + // send will alter the msg and insert the response. + // copy... + // XXX TODO + + return 0; } - public static int service(long s, long l) + /** Send the packet. XXX This will modify msg !!! + * We could use 2 packets, or sendAndReceive(). + * + */ + public int send( Msg msg, Endpoint ep ) + throws IOException { - System.out.println("In service"); + byte buf[]=msg.getBuffer(); + EpData epData=(EpData)ep.getNote( epDataNote ); + + // send and get the response + d( "Sending packet "); + msg.end(); + // msg.dump("Outgoing: "); + + int status=sendPacket( epData.jkEnvP, epData.jkEndpointP, + epData.jkServiceP, buf, msg.getLen() ); + ep.setNote( receivedNote, msg ); + + d( "Sending packet - done "); return 0; } - public static void shutdown() { - System.out.println("In shutdown"); + /* ==================== ==================== */ + + static WorkerEnv wEnv=null; + static int epDataNote=-1; + static ChannelJni chJni=new ChannelJni(); + + static class EpData { + public long jkEnvP; + public long jkEndpointP; + public long jkServiceP; + } + + public static Endpoint createEndpointStatic(long env, long epP) { + Endpoint ep=new Endpoint(); + if( epDataNote==-1) + epDataNote=wEnv.getNoteId(WorkerEnv.ENDPOINT_NOTE, "epData"); + + d("createEndpointStatic() " + env + " " + epP); + EpData epData=new EpData(); + epData.jkEnvP=env; + epData.jkEndpointP=epP; + ep.setNote( epDataNote, epData ); + return ep; } - private static final int dL=0; + public static MsgAjp createMessage() { + System.out.println("XXX CreateMessage"); + return new MsgAjp(); + } + + public static byte[] getBuffer(MsgAjp msg) { + System.out.println("XXX getBuffer " + msg.getBuffer() + " " + + msg.getBuffer().length); + return msg.getBuffer(); + } + + /** Receive a packet from the C side. This is called from the C + * code using invocation, but only for the first packet - to avoid + * recursivity and thread problems. + * + * This may look strange, but seems the best solution for the + * problem ( the problem is that we don't have 'continuation' ). + * + * sendPacket will move the thread execution on the C side, and + * return when another packet is available. For packets that + * are one way it'll return after it is processed too ( having + * 2 threads is far more expensive ). + * + * Again, the goal is to be efficient and behave like all other + * Channels ( so the rest of the code can be shared ). Playing with + * java objects on C is extremely difficult to optimize and do + * right ( IMHO ), so we'll try to keep it simple - byte[] passing, + * the conversion done in java ( after we know the encoding and + * if anyone asks for it - same lazy behavior as in 3.3 ). + */ + public static int receiveRequest( long env, long rP, Endpoint ep, + MsgAjp msg) + { + try { + // first, we need to get an endpoint. It should be + // per/thread - and probably stored by the C side. + d("Received request " + rP); + // The endpoint will store the message pt. + msg.processHeader(); + // msg.dump("Incoming msg "); + + EpData epData=(EpData)ep.getNote( epDataNote ); + + epData.jkServiceP=rP; + + int status=wEnv.processCallbacks( chJni, ep, msg ); + + d("after processCallbacks "); + + } catch( Exception ex ) { + ex.printStackTrace(); + } + return 0; + } + + /** Send the packet to the C side. On return it contains the response + * or indication there is no response. Asymetrical because we can't + * do things like continuations. + */ + public static native int sendPacket(long env, long e, long s, + byte data[], int len); + + private static final int dL=10; private static void d(String s ) { System.err.println( "ChannelJni: " + s ); }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>