costin 01/08/23 18:15:18 Modified: src/share/org/apache/tomcat/modules/server JNIConnectionHandler.java JNIEndpoint.java Log: - remove the dependency between JNIEndpoint and JNIConnectionHandler. The reverse is ok ( JNIConnection handler depends on JNIEndpoint ), since JNIEndpoint is in the main classloader. - added an option to exit if the library can't be loaded. This is a serious configuration problem, similar with apache not beeing able to find a module, the behavior should be the same. - fix the name of the .so/.dll/.nlm file ( had an extra s ). Fix File.separator, use the constructed path. - fix the 'multiple start' problem. Revision Changes Path 1.12 +19 -23 jakarta-tomcat/src/share/org/apache/tomcat/modules/server/JNIConnectionHandler.java Index: JNIConnectionHandler.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/server/JNIConnectionHandler.java,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- JNIConnectionHandler.java 2001/08/16 00:26:14 1.11 +++ JNIConnectionHandler.java 2001/08/24 01:15:18 1.12 @@ -1,8 +1,4 @@ /* - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/server/JNIConnectionHandler.java,v 1.11 2001/08/16 00:26:14 costin Exp $ - * $Revision: 1.11 $ - * $Date: 2001/08/16 00:26:14 $ - * * ==================================================================== * * The Apache Software License, Version 1.1 @@ -83,25 +79,15 @@ * * @author Gal Shachor <[EMAIL PROTECTED]> */ -public class JNIConnectionHandler extends BaseInterceptor { +public class JNIConnectionHandler extends BaseInterceptor implements JNIEndpoint.JniHandler { public JNIConnectionHandler() { } - // JNIEndpoint was called to start tomcat - // Hack used to set the handler in JNIEndpoint. - // This works - if we have problems we may take the time - // and implement a better mechanism - static JNIEndpoint ep; - - public static void setEndpoint(JNIEndpoint jniep) - { - ep = jniep; - } - // -------------------- Config -------------------- boolean nativeLibLoaded=false; String lib; + boolean exitOnError=true; /** Location of the jni library */ @@ -109,14 +95,24 @@ this.lib=lib; } + public void setExitIfNoLib(boolean b) { + exitOnError=b; + } + + JNIEndpoint ep=null; + /** Called when the ContextManger is started */ public void engineInit(ContextManager cm) throws TomcatException { - if( ep==null ) return; + ep= JNIEndpoint.getEndpoint(); + if(ep==null ) return; super.engineInit( cm ); if(! nativeLibLoaded ) { initLibrary(); + if( ! nativeLibLoaded && exitOnError) { + System.exit(2); + } } try { // notify the jni side that jni is set up corectly @@ -201,7 +197,7 @@ } if( lib==null ) { - lib="jni_connector."; + lib="jni_connect."; String os = System.getProperty("os.name").toLowerCase(); if(os.indexOf("windows")>=0){ lib+="dll"; @@ -232,23 +228,23 @@ if( ! libF.isAbsolute() ) { File f1=new File(cm.getInstallDir()); // XXX should it be "libexec" ??? - File f2=new File( f1, "bin" + File.pathSeparator + "native" ); + File f2=new File( f1, "bin" + File.separator + "native" ); libF=new File( f2, lib ); } if( ! libF.exists() ) { throw new TomcatException( "Native library doesn't exist " + libF ); } - + // Loading from the library path failed // Try to load assuming lib is a complete pathname. try { - System.load(lib); + System.load(libF.getAbsolutePath()); nativeLibLoaded=true; - System.out.println("Library " + lib + " loaded"); + System.out.println("Library " + libF.getAbsolutePath() + " loaded"); return; } catch(UnsatisfiedLinkError usl) { - System.err.println("Failed to load() " + lib); + System.err.println("Failed to load() " + libF.getAbsolutePath()); if( debug > 0 ) usl.printStackTrace(); } 1.4 +38 -21 jakarta-tomcat/src/share/org/apache/tomcat/modules/server/JNIEndpoint.java Index: JNIEndpoint.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/server/JNIEndpoint.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- JNIEndpoint.java 2001/08/23 15:02:42 1.3 +++ JNIEndpoint.java 2001/08/24 01:15:18 1.4 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/server/JNIEndpoint.java,v 1.3 2001/08/23 15:02:42 costin Exp $ - * $Revision: 1.3 $ - * $Date: 2001/08/23 15:02:42 $ + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/server/JNIEndpoint.java,v 1.4 2001/08/24 01:15:18 costin Exp $ + * $Revision: 1.4 $ + * $Date: 2001/08/24 01:15:18 $ * * ==================================================================== * @@ -76,7 +76,7 @@ */ public class JNIEndpoint { - JNIConnectionHandler handler; + JniHandler handler; boolean running = false; @@ -90,10 +90,11 @@ // -------------------- Configuration -------------------- // Called back when the server is initializing the handler - public void setConnectionHandler(JNIConnectionHandler handler ) { + public void setConnectionHandler(JniHandler handler ) { this.handler=handler; // the handler is no longer useable if( handler==null ) { + System.out.println("Shutting down, handler==null ..."); running=false; synchronized(this) { notify(); @@ -107,7 +108,20 @@ notify(); } } + + // We can have a single active JNIEndpoint. + static JNIEndpoint ep; + + public static void setEndpoint(JNIEndpoint jniep) + { + ep = jniep; + } + + public static JNIEndpoint getEndpoint() { + return ep; + } + // -------------------- JNI Entry points /** Called by JNI to start up tomcat. @@ -116,6 +130,11 @@ String stdout, String stderr) { + if( ep != null ) { + System.err.println("ALREADY STARTED, this is the second call to STARTUP "); + return 1; + } + System.err.println("Mod_jk calling startup() "); try { if(null != stdout) { System.setOut(new PrintStream(new FileOutputStream(stdout))); @@ -129,24 +148,23 @@ // We need to make sure tomcat did start successfully and // report this back. try { - JNIConnectionHandler.setEndpoint(this); + JNIEndpoint.setEndpoint(this); // it will call back setHandler !! - StartupThread startup = new StartupThread(cmdLine, - this); + StartupThread startup = new StartupThread(cmdLine); + System.err.println("Starting up StartupThread"); startup.start(); - System.out.println("Starting up StartupThread"); synchronized (this) { wait(60*1000); } - System.out.println("End waiting"); + System.err.println("End waiting"); } catch(Throwable t) { } if(running) { - System.out.println("Running fine "); + System.err.println("Running fine "); return 1; } - System.out.println("Error - why doesn't run ??"); + System.err.println("Error - why doesn't run ??"); return 0; } @@ -172,6 +190,10 @@ { System.out.println("JNI In shutdown"); } + + public static interface JniHandler { + public void processConnection( long s, long l ); + } } /** Tomcat is started in a separate thread. It may be loaded on demand, @@ -182,12 +204,8 @@ */ class StartupThread extends Thread { String []cmdLine = null; - JNIEndpoint jniEp = null; - - public StartupThread(String cmdLine, - JNIEndpoint jniEp) { - this.jniEp = jniEp; + public StartupThread(String cmdLine) { if(null == cmdLine) { this.cmdLine = new String[0]; } else { @@ -204,16 +222,15 @@ public void run() { boolean failed = true; try { - System.out.println("Calling main" ); + System.err.println("Calling main" ); org.apache.tomcat.startup.Main.main(cmdLine); - System.out.println("Main returned" ); + System.err.println("Main returned" ); failed = false; } catch(Throwable t) { t.printStackTrace(); // OK } finally { if(failed) { - System.out.println("Failed ??"); - // stopEndpoint(); + System.err.println("Failed ??"); } } }