You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by mt...@apache.org on 2005/05/28 09:48:29 UTC

cvs commit: jakarta-tomcat-connectors/jni/native/src network.c pool.c

mturk       2005/05/28 00:48:29

  Modified:    jni/java/org/apache/tomcat/jni Pool.java
               jni/native/src network.c pool.c
  Log:
  Add missing userdata functions for Pool.
  Those will be used for SSL socket abstraction.
  
  Revision  Changes    Path
  1.5       +32 -1     jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/Pool.java
  
  Index: Pool.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/Pool.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- Pool.java	5 Feb 2005 12:31:35 -0000	1.4
  +++ Pool.java	28 May 2005 07:48:28 -0000	1.5
  @@ -129,4 +129,35 @@
        */
       public static native ByteBuffer calloc(long p, int size);
   
  +    /*
  +     * User data management
  +     */
  +
  +    /**
  +     * Set the data associated with the current pool
  +     * @param data The user data associated with the pool.
  +     * @param key The key to use for association
  +     * @param pool The current pool
  +     * @warning The data to be attached to the pool should have a life span
  +     *          at least as long as the pool it is being attached to.
  +     *          Object attached to the pool will be globaly referenced
  +     *          untill the pool is cleared or dataSet is called with the
  +     *          null data.
  +     * @return APR Status code.
  +     */
  +     public static native int dataSet(long pool, String key, Object data);
  +
  +    /**
  +     * Return the data associated with the current pool.
  +     * @param key The key for the data to retrieve
  +     * @param pool The current pool.
  +     */
  +     public static native Object dataGet(long pool, String key);
  +
  +    /**
  +     * Run all of the child_cleanups, so that any unnecessary files are
  +     * closed because we are about to exec a new program
  +     */
  +    public static native void cleanupForExec();
  +
   }
  
  
  
  1.22      +9 -2      jakarta-tomcat-connectors/jni/native/src/network.c
  
  Index: network.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/src/network.c,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- network.c	27 May 2005 16:39:13 -0000	1.21
  +++ network.c	28 May 2005 07:48:29 -0000	1.22
  @@ -30,6 +30,13 @@
   static int sp_closed   = 0;
   static int sp_cleared  = 0;
   static int sp_accepted = 0;
  +/* Fake private pool struct to deal with APR private's socket
  + * struct not exposing function to access the pool.
  + */
  +typedef struct
  +{
  +    apr_pool_t *pool;
  +} fake_apr_socket_t;
   #endif
   
   #if  !APR_HAVE_IPV6
  @@ -195,7 +202,7 @@
   
   #ifdef TCN_DO_STATISTICS
       sp_closed++;
  -    apr_pool_cleanup_kill((apr_pool_t *)s, s, sp_socket_cleanup);
  +    apr_pool_cleanup_kill(((fake_apr_socket_t *)s)->pool, s, sp_socket_cleanup);
   #endif
   
       return (jint)apr_socket_close(s);
  
  
  
  1.6       +78 -1     jakarta-tomcat-connectors/jni/native/src/pool.c
  
  Index: pool.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/src/pool.c,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- pool.c	27 May 2005 16:38:09 -0000	1.5
  +++ pool.c	28 May 2005 07:48:29 -0000	1.6
  @@ -133,6 +133,7 @@
       tcn_callback_t *cb = J2P(data, tcn_callback_t *);
   
       UNREFERENCED(o);
  +    TCN_ASSERT(pool != 0);
       apr_pool_cleanup_kill(p, cb, generic_pool_cleanup);
       (*e)->DeleteGlobalRef(e, cb->obj);
       free(cb);
  @@ -146,6 +147,7 @@
       void *mem;
   
       UNREFERENCED(o);
  +    TCN_ASSERT(pool != 0);
   
       if ((mem = apr_palloc(p, sz)) != NULL)
           return (*e)->NewDirectByteBuffer(e, mem, (jlong)sz);
  @@ -161,9 +163,84 @@
       void *mem;
   
       UNREFERENCED(o);
  +    TCN_ASSERT(pool != 0);
   
       if ((mem = apr_pcalloc(p, sz)) != NULL)
           return (*e)->NewDirectByteBuffer(e, mem, (jlong)sz);
       else
           return NULL;
   }
  +
  +static apr_status_t generic_pool_data_cleanup(void *data)
  +{
  +    apr_status_t rv = APR_SUCCESS;
  +    tcn_callback_t *cb = (tcn_callback_t *)data;
  +
  +    if (data) {
  +        if (!TCN_IS_NULL(cb->env, cb->obj)) {
  +            TCN_UNLOAD_CLASS(cb->env, cb->obj);
  +        }
  +        free(cb);
  +    }
  +    return rv;
  +}
  +
  +TCN_IMPLEMENT_CALL(jint, Pool, dataSet)(TCN_STDARGS, jlong pool,
  +                                        jstring key, jobject data)
  +{
  +    apr_pool_t *p = J2P(pool, apr_pool_t *);
  +    apr_status_t rv = APR_SUCCESS;
  +    void *old = NULL;
  +    TCN_ALLOC_CSTRING(key);
  +
  +    UNREFERENCED(o);
  +    TCN_ASSERT(pool != 0);
  +
  +    if (apr_pool_userdata_get(&old, J2S(key), p) == APR_SUCCESS) {
  +        if (old)
  +            apr_pool_cleanup_run(p, old, generic_pool_data_cleanup);
  +    }
  +    if (data) {
  +        tcn_callback_t *cb = (tcn_callback_t *)malloc(sizeof(tcn_callback_t));
  +        cb->env = e;
  +        cb->obj = (*e)->NewGlobalRef(e, data);
  +        if ((rv = apr_pool_userdata_set(cb, J2S(key), generic_pool_data_cleanup,
  +                                        p)) != APR_SUCCESS) {
  +            (*e)->DeleteGlobalRef(e, cb->obj);
  +            free(cb);
  +        }
  +    }
  +    else {
  +        /* Clear the exiting user data */
  +        rv = apr_pool_userdata_set(NULL, J2S(key), NULL, p);
  +    }
  +    TCN_FREE_CSTRING(key);
  +    return rv;
  +}
  +
  +TCN_IMPLEMENT_CALL(jobject, Pool, dataGet)(TCN_STDARGS, jlong pool,
  +                                           jstring key)
  +{
  +    apr_pool_t *p = J2P(pool, apr_pool_t *);
  +    void *old = NULL;
  +    TCN_ALLOC_CSTRING(key);
  +    jobject rv = NULL;
  +
  +    UNREFERENCED(o);
  +    TCN_ASSERT(pool != 0);
  +
  +    if (apr_pool_userdata_get(&old, J2S(key), p) == APR_SUCCESS) {
  +        if (old) {
  +            tcn_callback_t *cb = (tcn_callback_t *)old;
  +            rv = cb->obj;
  +        }
  +    }
  +    TCN_FREE_CSTRING(key);
  +    return rv;
  +}
  +
  +TCN_IMPLEMENT_CALL(void, Pool, cleanupForExec)(TCN_STDARGS)
  +{
  +    UNREFERENCED_STDARGS;
  +    apr_pool_cleanup_for_exec();;
  +}
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: tomcat-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org