costin 02/04/17 15:43:58 Modified: jk/java/org/apache/jk/apr AprImpl.java Log: Added shm native calls. Cleanup the interfaces - now use the normal JkHandler interface for configuration. AprImpl must be loaded in the main classloader, with common-logging and jk.core in order to get JNI-channel to work ( that will be fixed later, it is also possible to get around the class loaders by pushing the objects via native calles instead of loading them with FindClass ) ( normal jni will work anyway ). For callbacks we use normal JkHandler and MsgContext - it coresponds to an apache hook and behaves in a similar way. ( ok, the concept is identical to a Valve for 4.0 people, with an Action for Remy, and close enough to an Interceptor for 3.3 people ). Revision Changes Path 1.8 +109 -85 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.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- AprImpl.java 16 Apr 2002 00:21:37 -0000 1.7 +++ AprImpl.java 17 Apr 2002 22:43:58 -0000 1.8 @@ -2,23 +2,53 @@ import java.io.*; import java.util.*; +import org.apache.jk.core.*; /** Implements the interface with the APR library. This is for internal-use * only. The goal is to use 'natural' mappings for user code - for example * java.net.Socket for unix-domain sockets, etc. * */ -public class AprImpl { - static AprImpl aprSingleton=new AprImpl(); +public class AprImpl extends JkHandler { // This will be o.a.t.util.handler.TcHandler - lifecycle and config + static AprImpl aprSingleton=null; String baseDir; String aprHome; String soExt="so"; - public static AprImpl getAprImpl() { - return aprSingleton; + boolean ok=true; + // Handlers for native callbacks + Hashtable jkHandlers=new Hashtable(); + + public AprImpl() { + aprSingleton=this; + } + + // -------------------- Properties -------------------- + + /** Native libraries are located based on base dir. + * XXX Add platform, version, etc + */ + public void setBaseDir(String s) { + baseDir=s; + } + + public void setSoExt(String s ) { + soExt=s; } + // XXX maybe install the jni lib in apr-home ? + public void setAprHome( String s ) { + aprHome=s; + } + + /** Add a Handler for jni callbacks. + */ + public void addJkHandler(String type, JkHandler cb) { + jkHandlers.put( type, cb ); + } + + // -------------------- Apr generic utils -------------------- /** Initialize APR */ public native int initialize(); @@ -29,6 +59,12 @@ public native long poolClear(long pool); + // -------------------- Unix sockets -------------------- + // XXX Will be 'apr sockets' as soon as APR supports unix domain sockets. + // For the moment there is little benefit of using APR TCP sockets, since + // the VM abstraction is decent. However poll and other advanced features + // are not available - and will be usefull. For the next release. + public native long unSocketClose( long pool, long socket, int type ); /** Create a unix socket and start listening. @@ -53,22 +89,76 @@ public native int unWrite( long pool, long unSocket, byte buf[], int off, int len ); - /** Native libraries are located based on base dir. - * XXX Add platform, version, etc + // -------------------- Shared memory methods -------------------- + + public native long shmAttach( long pool, String file ); + + public native long shmDetach( long pool, long shmP ); + + public native long shmDestroy( long pool, long shmP ); + + // -------------------- java to C -------------------- + + // Temp - interface will evolve + + /** 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 void setBaseDir(String s) { - baseDir=s; - } + public static native int sendPacket(long xEnv, long endpointP, + byte data[], int len); + - public void setSoExt(String s ) { - soExt=s; - } + // -------------------- Called from C -------------------- + // XXX Check security, add guard or other protection + // It's better to do it the other way - on init 'push' AprImpl into + // the native library, and have native code call instance methods. - // XXX maybe install the jni lib in apr-home ? - public void setAprHome( String s ) { - aprHome=s; + public static Object createJavaContext(String type, long cContext) { + // XXX will be an instance method, fields accessible directly + AprImpl apr=aprSingleton; + JkHandler jkH=(JkHandler)apr.jkHandlers.get( type ); + if( jkH==null ) return null; + + MsgContext ep=jkH.createMsgContext(); + + ep.setSource( jkH ); + + ep.setJniContext( cContext ); + return ep; } - + + /** Return a buffer associated with the ctx. + */ + public static byte[] getBuffer( Object ctx, int id ) { + return ((MsgContext)ctx).getBuffer( id ); + } + + public static int jniInvoke( long jContext, Object ctx ) { + try { + MsgContext ep=(MsgContext)ctx; + ep.setJniEnv( jContext ); + ep.setType( 0 ); + return ((MsgContext)ctx).execute(); + } catch( Throwable ex ) { + ex.printStackTrace(); + return -1; + } + } + + // -------------------- Initialization -------------------- + + public void init() throws IOException { + try { + loadNative(); + + initialize(); + } catch( Throwable t ) { + log.error("Native code not initialized, disabling UnixSocket and JNI channels: " + t.toString()); + return; + } + } + /** This method of loading the libs doesn't require setting * LD_LIBRARY_PATH. Assuming a 'right' binary distribution, * or a correct build all files will be in their right place. @@ -105,8 +195,7 @@ loadNative( jniConnect.getAbsolutePath() ); } } - - boolean ok=true; + public void loadNative(String libPath) { try { @@ -117,72 +206,7 @@ } } - // Mostly experimental, the interfaces need to be cleaned up - after everything works - - Hashtable jniContextFactories=new Hashtable(); - - public void addJniContextFactory(String type, JniContextFactory cb) { - jniContextFactories.put( type, cb ); - } - - public static interface JniContext { - - /** Each context contains a number of byte[] buffers used for communication. - * The C side will contain a char * equivalent - both buffers are long-lived - * and recycled. - * - * This will be called at init time. A long-lived global reference to the byte[] - * will be stored in the C context. - */ - public byte[] getBuffer( int id ); - - - /** Invoke a java hook. The xEnv is the representation of the current execution - * environment ( the jni_env_t * ) - */ - public int jniInvoke( long xEnv ); - } - - public static interface JniContextFactory { - - /** Create a Jni context - it is the corespondent of a C context, represented - * by a pointer - * - * The 'context' is a long-lived object ( recycled ) that manages state for - * each jk operation. - */ - public JniContext createJniContext( String type, long cContext ); - } - - - // -------------------- Called from C -------------------- - - public static Object createJavaContext(String type, long cContext) { - JniContextFactory cb=(JniContextFactory)AprImpl.getAprImpl().jniContextFactories.get( type ); - if( cb==null ) return null; - - return cb.createJniContext( type, cContext ); - } - - /** Return a buffer associated with the ctx. - */ - public static byte[] getBuffer( Object ctx, int id ) { - return ((JniContext)ctx).getBuffer( id ); - } - - public static int jniInvoke( long jContext, Object ctx ) { - return ((JniContext)ctx).jniInvoke( jContext ); - } - - // -------------------- java to C -------------------- - - // Temp - interface will evolve - - /** 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 xEnv, long endpointP, - byte data[], int len); + private static org.apache.commons.logging.Log log= + org.apache.commons.logging.LogFactory.getLog( AprImpl.class ); }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>