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/31 19:52:05 UTC

cvs commit: jakarta-tomcat-connectors/jk/native2/common jk_mutex_proc.c jk_mutex_thread.c jk_mutex.c jk_registry.c jk_registry.h

costin      2002/05/31 10:52:05

  Modified:    jk/native2/common jk_mutex.c jk_registry.c jk_registry.h
  Added:       jk/native2/common jk_mutex_proc.c jk_mutex_thread.c
  Log:
  A bit of refactoring. jk_mutex.c contains the common code for mutexes.
  
  jk_mutex_proc is for inter-process locking, it won't work without APR.
  
  jk_mutex_thread is for in-process locking.
  
  Both objects can be used from Java ( via setAttribute/invoke() ). This
  will allow java and apache to synchronize access to config files and
  other resources ( the inter process locks ).
  
  Revision  Changes    Path
  1.2       +9 -181    jakarta-tomcat-connectors/jk/native2/common/jk_mutex.c
  
  Index: jk_mutex.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_mutex.c,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- jk_mutex.c	24 May 2002 04:24:51 -0000	1.1
  +++ jk_mutex.c	31 May 2002 17:52:05 -0000	1.2
  @@ -66,209 +66,37 @@
   #include "jk_pool.h"
   #include "jk_mutex.h"
   
  -#ifdef HAS_APR
  -
  -#include "apr_proc_mutex.h"
  -
  -
  -#define MUTEX_SET_ATTRIBUTE 0
  -#define MUTEX_INIT 2
  -#define MUTEX_DESTROY 3
  -#define MUTEX_LOCK 4
  -#define MUTEX_TRYLOCK 5
  -#define MUTEX_UNLOCK 6
  -
  -
  -static int JK_METHOD jk2_mutex_init(jk_env_t *env, jk_bean_t  *mutexB)
  -{
  -    jk_mutex_t *jkMutex=mutexB->object;
  -    
  -    apr_proc_mutex_t *mutex;
  -    apr_lockmech_e mech=(apr_lockmech_e)jkMutex->mechanism;
  -
  -    apr_pool_t *pool=(apr_pool_t *)env->getAprPool(env);
  -    
  -    apr_status_t  st;
  -    char *fname=jkMutex->fname;
  -
  -    st=apr_proc_mutex_create( &mutex, fname, mech, pool );
  -
  -    jkMutex->privateData=mutex;
  -    
  -    return st;
  -}
  -
  -static int JK_METHOD 
  -jk2_mutex_destroy(jk_env_t *env, jk_bean_t  *mutexB)
  -{
  -    jk_mutex_t *jkMutex=mutexB->object;
  -    
  -    apr_proc_mutex_t *mutex=(apr_proc_mutex_t *)jkMutex->privateData;
  -    apr_status_t  st;
  -
  -    if( mutex!= NULL )
  -        st=apr_proc_mutex_destroy( mutex );
  -    
  -    return st;
  -}
  -
  -static int JK_METHOD 
  -jk2_mutex_lock(jk_env_t *env, jk_mutex_t  *jkMutex)
  -{
  -    apr_proc_mutex_t *mutex=(apr_proc_mutex_t *)jkMutex->privateData;
  -    apr_status_t  st;
  -    
  -    st=apr_proc_mutex_lock( mutex );
  -    
  -    return st;
  -}
  -
  -static int JK_METHOD 
  -jk2_mutex_tryLock(jk_env_t *env, jk_mutex_t  *jkMutex)
  -{
  -    apr_proc_mutex_t *mutex=(apr_proc_mutex_t *)jkMutex->privateData;
  -    apr_status_t  st;
  -    
  -    st=apr_proc_mutex_trylock( mutex );
  -    
  -    return st;
  -}
  -
  -static int JK_METHOD 
  -jk2_mutex_unLock(jk_env_t *env, jk_mutex_t  *jkMutex)
  -{
  -    apr_proc_mutex_t *mutex=(apr_proc_mutex_t *)jkMutex->privateData;
  -    apr_status_t  st;
  -    
  -    st=apr_proc_mutex_unlock( mutex );
  -    
  -    return st;
  -}
  -
  -static int JK_METHOD jk2_mutex_setAttribute( jk_env_t *env, jk_bean_t *mbean, char *name, void *valueP ) {
  -    jk_mutex_t *mutex=(jk_mutex_t *)mbean->object;
  -    char *value=(char *)valueP;
  -    
  -    if( strcmp( "file", name ) == 0 ) {
  -	mutex->fname=value;
  -    } else if( strcmp( "mechanism", name ) == 0 ) {
  -	mutex->mechanism=atoi(value);
  -    } else {
  -	return JK_ERR;
  -    }
  -    return JK_OK;   
  -
  -}
  -
  -
   /* ==================== Dispatch messages from java ==================== */
       
   /** Called by java. Will call the right mutex method.
    */
  -static int JK_METHOD jk2_mutex_dispatch(jk_env_t *env, void *target, jk_endpoint_t *ep, jk_msg_t *msg)
  +int JK_METHOD jk2_mutex_invoke(jk_env_t *env, jk_bean_t *bean, jk_endpoint_t *ep, int code,
  +                               jk_msg_t *msg, int raw)
   {
  -    jk_bean_t *bean=(jk_bean_t *)target;
       jk_mutex_t *mutex=(jk_mutex_t *)bean->object;
  -    int rc;
  +    int rc=JK_OK;
   
  -    int code=msg->getByte(env, msg );
  -    
       if( mutex->mbean->debug > 0 )
           env->l->jkLog(env, env->l, JK_LOG_INFO, 
                         "mutex.%d() \n", code);
       
       switch( code ) {
  -    case MUTEX_SET_ATTRIBUTE: {
  -        char *name=msg->getString( env, msg );
  -        char *value=msg->getString( env, msg );
  -        if( mutex->mbean->debug > 0 )
  -            env->l->jkLog(env, env->l, JK_LOG_INFO, 
  -                          "mutex.setAttribute() %s %s %p\n", name, value, bean->setAttribute);
  -        if( bean->setAttribute != NULL)
  -            bean->setAttribute(env, bean, name, value );
  -        return JK_OK;
  -    }
  -    case MUTEX_INIT: { 
  -        if( mutex->mbean->debug > 0 )
  -            env->l->jkLog(env, env->l, JK_LOG_INFO, "mutex.init()\n");
  -        rc=mutex->mbean->init(env, mutex->mbean);
  -        return rc;
  -    }
  -    case MUTEX_DESTROY: {
  -        if( mutex->mbean->debug > 0 )
  -            env->l->jkLog(env, env->l, JK_LOG_INFO, "mutex.destroy()\n");
  -        rc=mutex->mbean->destroy(env, mutex->mbean);
  -        return rc;
  -    }
       case MUTEX_LOCK: {
           if( mutex->mbean->debug > 0 )
  -            env->l->jkLog(env, env->l, JK_LOG_INFO, "mutex.lock()\n");
  -        rc=mutex->lock(env, mutex);
  -        return rc;
  +            env->l->jkLog(env, env->l, JK_LOG_INFO, "mutex.open()\n");
  +        return mutex->lock(env, mutex);
       }
       case MUTEX_TRYLOCK: {
           if( mutex->mbean->debug > 0 )
  -            env->l->jkLog(env, env->l, JK_LOG_INFO, "mutex.tryLock()\n");
  -        rc=mutex->tryLock(env, mutex);
  -        return rc;
  +            env->l->jkLog(env, env->l, JK_LOG_INFO, "mutex.close()\n");
  +        return mutex->tryLock(env, mutex);
       }
       case MUTEX_UNLOCK: {
           if( mutex->mbean->debug > 0 )
  -            env->l->jkLog(env, env->l, JK_LOG_INFO, "mutex.unLock()\n");
  -        rc=mutex->unLock(env, mutex);
  -        return rc;
  +            env->l->jkLog(env, env->l, JK_LOG_INFO, "mutex.recv()\n");
  +        return mutex->unLock(env, mutex);
       }
       }/* switch */
       return JK_ERR;
   }
   
  -static int JK_METHOD jk2_mutex_setWorkerEnv( jk_env_t *env, jk_mutex_t *mutex, jk_workerEnv_t *wEnv ) {
  -    wEnv->registerHandler( env, wEnv, "mutex",
  -                           "mutexDispatch", JK_HANDLE_MUTEX_DISPATCH,
  -                           jk2_mutex_dispatch, NULL );
  -    return JK_OK;
  -}
  -
  -int JK_METHOD jk2_mutex_factory( jk_env_t *env ,jk_pool_t *pool,
  -                               jk_bean_t *result,
  -                               const char *type, const char *name)
  -{
  -    jk_mutex_t *mutex;
  -    jk_workerEnv_t *wEnv;
  -
  -    mutex=(jk_mutex_t *)pool->calloc(env, pool, sizeof(jk_mutex_t));
  -
  -    if( mutex == NULL )
  -        return JK_ERR;
  -
  -    mutex->pool=pool;
  -    mutex->privateData=NULL;
  -
  -    result->setAttribute=jk2_mutex_setAttribute;
  -    /* result->getAttribute=jk2_mutex_getAttribute; */
  -    mutex->mbean=result; 
  -    result->object=mutex;
  -    
  -    result->init=jk2_mutex_init;
  -    result->destroy=jk2_mutex_destroy;
  -    
  -    mutex->lock=jk2_mutex_lock;
  -    mutex->tryLock=jk2_mutex_tryLock;
  -    mutex->unLock=jk2_mutex_unLock;
  -
  -    wEnv=env->getByName( env, "workerEnv" );
  -    jk2_mutex_setWorkerEnv( env, mutex, wEnv );
  -    
  -    return JK_OK;
  -}
  -
  -#else
  -
  -int JK_METHOD jk2_mutex_factory( jk_env_t *env ,jk_pool_t *pool,
  -                               jk_bean_t *result,
  -                               const char *type, const char *name)
  -{
  -    result->disabled=1;
  -    return JK_OK;
  -}
  -#endif
  
  
  
  1.26      +6 -2      jakarta-tomcat-connectors/jk/native2/common/jk_registry.c
  
  Index: jk_registry.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_registry.c,v
  retrieving revision 1.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- jk_registry.c	29 May 2002 00:10:17 -0000	1.25
  +++ jk_registry.c	31 May 2002 17:52:05 -0000	1.26
  @@ -67,7 +67,7 @@
   
   /***************************************************************************
    * Description: Worker list                                                *
  - * Version:     $Revision: 1.25 $                                           *
  + * Version:     $Revision: 1.26 $                                           *
    ***************************************************************************/
   
   /** Static declarations for all 'hardcoded' modules. This is a hack, 
  @@ -116,7 +116,7 @@
     env->registerFactory( env, "uriEnv", jk2_uriEnv_factory );
     env->registerFactory( env, "endpoint", jk2_endpoint_factory );
     env->registerFactory( env, "uri", jk2_uriEnv_factory );
  -  env->registerFactory( env, "config", jk2_config_factory );
  +  env->registerFactory( env, "config", jk2_config_file_factory );
     
     env->registerFactory( env, "ajp13", jk2_worker_ajp13_factory );
     env->registerFactory( env, "lb",    jk2_worker_lb_factory );
  @@ -134,9 +134,13 @@
     env->registerFactory( env, "handler.response", jk2_handler_response_factory );
     env->registerFactory( env, "handler.logon",   jk2_handler_logon_factory );
     
  +  env->registerFactory( env, "threadMutex", jk2_mutex_thread_factory );
  +  env->registerFactory( env, "procMutex", jk2_mutex_proc_factory );
  +
     env->registerFactory( env, "channel.jni",   jk2_channel_jni_factory );
     env->registerFactory( env, "worker.jni",   jk2_worker_jni_factory );
     env->registerFactory( env, "vm",   jk2_vm_factory );
  +
   
   }
   
  
  
  
  1.17      +10 -2     jakarta-tomcat-connectors/jk/native2/common/jk_registry.h
  
  Index: jk_registry.h
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_registry.h,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- jk_registry.h	29 May 2002 00:10:17 -0000	1.16
  +++ jk_registry.h	31 May 2002 17:52:05 -0000	1.17
  @@ -62,7 +62,7 @@
   
   /***************************************************************************
    * Description: Worker list                                                *
  - * Version:     $Revision: 1.16 $                                           *
  + * Version:     $Revision: 1.17 $                                           *
    ***************************************************************************/
   
   /** Static declarations for all 'hardcoded' modules. This is a hack, 
  @@ -169,9 +169,17 @@
   int JK_METHOD jk2_uriEnv_factory(jk_env_t *env, jk_pool_t *pool, jk_bean_t *result,
                                    const char *type, const char *name);
   
  -int JK_METHOD jk2_config_factory(jk_env_t *env, jk_pool_t *pool, jk_bean_t *result,
  +int JK_METHOD jk2_config_file_factory(jk_env_t *env, jk_pool_t *pool, jk_bean_t *result,
                                    const char *type, const char *name);
   
   int JK_METHOD jk2_logger_win32_factory(jk_env_t *env, jk_pool_t *pool,
  +                                      jk_bean_t *result,
  +                                      const char *type, const char *name);
  +
  +int JK_METHOD jk2_mutex_thread_factory( jk_env_t *env ,jk_pool_t *pool,
  +                                        jk_bean_t *result,
  +                                        const char *type, const char *name);
  +
  +int JK_METHOD jk2_mutex_proc_factory( jk_env_t *env ,jk_pool_t *pool,
                                         jk_bean_t *result,
                                         const char *type, const char *name);
  
  
  
  1.1                  jakarta-tomcat-connectors/jk/native2/common/jk_mutex_proc.c
  
  Index: jk_mutex_proc.c
  ===================================================================
  /* ========================================================================= *
   *                                                                           *
   *                 The Apache Software License,  Version 1.1                 *
   *                                                                           *
   *          Copyright (c) 1999-2001 The Apache Software Foundation.          *
   *                           All rights reserved.                            *
   *                                                                           *
   * ========================================================================= *
   *                                                                           *
   * Redistribution and use in source and binary forms,  with or without modi- *
   * fication, are permitted provided that the following conditions are met:   *
   *                                                                           *
   * 1. Redistributions of source code  must retain the above copyright notice *
   *    notice, this list of conditions and the following disclaimer.          *
   *                                                                           *
   * 2. Redistributions  in binary  form  must  reproduce the  above copyright *
   *    notice,  this list of conditions  and the following  disclaimer in the *
   *    documentation and/or other materials provided with the distribution.   *
   *                                                                           *
   * 3. The end-user documentation  included with the redistribution,  if any, *
   *    must include the following acknowlegement:                             *
   *                                                                           *
   *       "This product includes  software developed  by the Apache  Software *
   *        Foundation <http://www.apache.org/>."                              *
   *                                                                           *
   *    Alternately, this acknowlegement may appear in the software itself, if *
   *    and wherever such third-party acknowlegements normally appear.         *
   *                                                                           *
   * 4. The names  "The  Jakarta  Project",  "Jk",  and  "Apache  Software     *
   *    Foundation"  must not be used  to endorse or promote  products derived *
   *    from this  software without  prior  written  permission.  For  written *
   *    permission, please contact <ap...@apache.org>.                        *
   *                                                                           *
   * 5. Products derived from this software may not be called "Apache" nor may *
   *    "Apache" appear in their names without prior written permission of the *
   *    Apache Software Foundation.                                            *
   *                                                                           *
   * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES *
   * INCLUDING, BUT NOT LIMITED TO,  THE IMPLIED WARRANTIES OF MERCHANTABILITY *
   * AND FITNESS FOR  A PARTICULAR PURPOSE  ARE DISCLAIMED.  IN NO EVENT SHALL *
   * THE APACHE  SOFTWARE  FOUNDATION OR  ITS CONTRIBUTORS  BE LIABLE  FOR ANY *
   * DIRECT,  INDIRECT,   INCIDENTAL,  SPECIAL,  EXEMPLARY,  OR  CONSEQUENTIAL *
   * DAMAGES (INCLUDING,  BUT NOT LIMITED TO,  PROCUREMENT OF SUBSTITUTE GOODS *
   * OR SERVICES;  LOSS OF USE,  DATA,  OR PROFITS;  OR BUSINESS INTERRUPTION) *
   * HOWEVER CAUSED AND  ON ANY  THEORY  OF  LIABILITY,  WHETHER IN  CONTRACT, *
   * STRICT LIABILITY, OR TORT  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *
   * ANY  WAY  OUT OF  THE  USE OF  THIS  SOFTWARE,  EVEN  IF  ADVISED  OF THE *
   * POSSIBILITY OF SUCH DAMAGE.                                               *
   *                                                                           *
   * ========================================================================= *
   *                                                                           *
   * This software  consists of voluntary  contributions made  by many indivi- *
   * duals on behalf of the  Apache Software Foundation.  For more information *
   * on the Apache Software Foundation, please see <http://www.apache.org/>.   *
   *                                                                           *
   * ========================================================================= */
  
  /**
   * Mutex support.
   * 
   * @author Costin Manolache
   */
  
  #include "jk_global.h"
  #include "jk_map.h"
  #include "jk_pool.h"
  #include "jk_mutex.h"
  
  #ifdef HAS_APR
  
  #include "apr_proc_mutex.h"
  
  
  static int JK_METHOD jk2_mutex_proc_init(jk_env_t *env, jk_bean_t  *mutexB)
  {
      jk_mutex_t *jkMutex=mutexB->object;
      
      apr_proc_mutex_t *mutex;
      apr_lockmech_e mech=(apr_lockmech_e)jkMutex->mechanism;
  
      apr_pool_t *pool=(apr_pool_t *)env->getAprPool(env);
      
      apr_status_t  st;
      char *fname=jkMutex->fname;
  
      st=apr_proc_mutex_create( &mutex, fname, mech, pool );
  
      jkMutex->privateData=mutex;
      
      return st;
  }
  
  static int JK_METHOD 
  jk2_mutex_proc_destroy(jk_env_t *env, jk_bean_t  *mutexB)
  {
      jk_mutex_t *jkMutex=mutexB->object;
      
      apr_proc_mutex_t *mutex=(apr_proc_mutex_t *)jkMutex->privateData;
      apr_status_t  st;
  
      if( mutex!= NULL )
          st=apr_proc_mutex_destroy( mutex );
      
      return st;
  }
  
  static int JK_METHOD 
  jk2_mutex_proc_lock(jk_env_t *env, jk_mutex_t  *jkMutex)
  {
      apr_proc_mutex_t *mutex=(apr_proc_mutex_t *)jkMutex->privateData;
      apr_status_t  st;
      
      st=apr_proc_mutex_lock( mutex );
      
      return st;
  }
  
  static int JK_METHOD 
  jk2_mutex_proc_tryLock(jk_env_t *env, jk_mutex_t  *jkMutex)
  {
      apr_proc_mutex_t *mutex=(apr_proc_mutex_t *)jkMutex->privateData;
      apr_status_t  st;
      
      st=apr_proc_mutex_trylock( mutex );
      
      return st;
  }
  
  static int JK_METHOD 
  jk2_mutex_proc_unLock(jk_env_t *env, jk_mutex_t  *jkMutex)
  {
      apr_proc_mutex_t *mutex=(apr_proc_mutex_t *)jkMutex->privateData;
      apr_status_t  st;
      
      st=apr_proc_mutex_unlock( mutex );
      
      return st;
  }
  
  static int JK_METHOD jk2_mutex_proc_setAttribute( jk_env_t *env, jk_bean_t *mbean, char *name, void *valueP ) {
      jk_mutex_t *mutex=(jk_mutex_t *)mbean->object;
      char *value=(char *)valueP;
      
      if( strcmp( "file", name ) == 0 ) {
  	mutex->fname=value;
      } else if( strcmp( "mechanism", name ) == 0 ) {
  	mutex->mechanism=atoi(value);
      } else {
  	return JK_ERR;
      }
      return JK_OK;   
  
  }
  
  int JK_METHOD jk2_mutex_proc_factory( jk_env_t *env ,jk_pool_t *pool,
                                 jk_bean_t *result,
                                 const char *type, const char *name)
  {
      jk_mutex_t *mutex;
      jk_workerEnv_t *wEnv;
  
      mutex=(jk_mutex_t *)pool->calloc(env, pool, sizeof(jk_mutex_t));
  
      if( mutex == NULL )
          return JK_ERR;
  
      mutex->pool=pool;
      mutex->privateData=NULL;
  
      result->setAttribute=jk2_mutex_proc_setAttribute;
      /* result->getAttribute=jk2_mutex_getAttribute; */
      mutex->mbean=result; 
      result->object=mutex;
      
      result->init=jk2_mutex_proc_init;
      result->destroy=jk2_mutex_proc_destroy;
      result->invoke=jk2_mutex_invoke;
      
      mutex->lock=jk2_mutex_proc_lock;
      mutex->tryLock=jk2_mutex_proc_tryLock;
      mutex->unLock=jk2_mutex_proc_unLock;
      
      return JK_OK;
  }
  
  #else
  
  int JK_METHOD jk2_mutex_proc_factory( jk_env_t *env ,jk_pool_t *pool,
                                        jk_bean_t *result,
                                        const char *type, const char *name)
  {
      result->disabled=1;
      return JK_OK;
  }
  #endif
  
  
  
  1.1                  jakarta-tomcat-connectors/jk/native2/common/jk_mutex_thread.c
  
  Index: jk_mutex_thread.c
  ===================================================================
  /* ========================================================================= *
   *                                                                           *
   *                 The Apache Software License,  Version 1.1                 *
   *                                                                           *
   *          Copyright (c) 1999-2001 The Apache Software Foundation.          *
   *                           All rights reserved.                            *
   *                                                                           *
   * ========================================================================= *
   *                                                                           *
   * Redistribution and use in source and binary forms,  with or without modi- *
   * fication, are permitted provided that the following conditions are met:   *
   *                                                                           *
   * 1. Redistributions of source code  must retain the above copyright notice *
   *    notice, this list of conditions and the following disclaimer.          *
   *                                                                           *
   * 2. Redistributions  in binary  form  must  reproduce the  above copyright *
   *    notice,  this list of conditions  and the following  disclaimer in the *
   *    documentation and/or other materials provided with the distribution.   *
   *                                                                           *
   * 3. The end-user documentation  included with the redistribution,  if any, *
   *    must include the following acknowlegement:                             *
   *                                                                           *
   *       "This product includes  software developed  by the Apache  Software *
   *        Foundation <http://www.apache.org/>."                              *
   *                                                                           *
   *    Alternately, this acknowlegement may appear in the software itself, if *
   *    and wherever such third-party acknowlegements normally appear.         *
   *                                                                           *
   * 4. The names  "The  Jakarta  Project",  "Jk",  and  "Apache  Software     *
   *    Foundation"  must not be used  to endorse or promote  products derived *
   *    from this  software without  prior  written  permission.  For  written *
   *    permission, please contact <ap...@apache.org>.                        *
   *                                                                           *
   * 5. Products derived from this software may not be called "Apache" nor may *
   *    "Apache" appear in their names without prior written permission of the *
   *    Apache Software Foundation.                                            *
   *                                                                           *
   * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES *
   * INCLUDING, BUT NOT LIMITED TO,  THE IMPLIED WARRANTIES OF MERCHANTABILITY *
   * AND FITNESS FOR  A PARTICULAR PURPOSE  ARE DISCLAIMED.  IN NO EVENT SHALL *
   * THE APACHE  SOFTWARE  FOUNDATION OR  ITS CONTRIBUTORS  BE LIABLE  FOR ANY *
   * DIRECT,  INDIRECT,   INCIDENTAL,  SPECIAL,  EXEMPLARY,  OR  CONSEQUENTIAL *
   * DAMAGES (INCLUDING,  BUT NOT LIMITED TO,  PROCUREMENT OF SUBSTITUTE GOODS *
   * OR SERVICES;  LOSS OF USE,  DATA,  OR PROFITS;  OR BUSINESS INTERRUPTION) *
   * HOWEVER CAUSED AND  ON ANY  THEORY  OF  LIABILITY,  WHETHER IN  CONTRACT, *
   * STRICT LIABILITY, OR TORT  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN *
   * ANY  WAY  OUT OF  THE  USE OF  THIS  SOFTWARE,  EVEN  IF  ADVISED  OF THE *
   * POSSIBILITY OF SUCH DAMAGE.                                               *
   *                                                                           *
   * ========================================================================= *
   *                                                                           *
   * This software  consists of voluntary  contributions made  by many indivi- *
   * duals on behalf of the  Apache Software Foundation.  For more information *
   * on the Apache Software Foundation, please see <http://www.apache.org/>.   *
   *                                                                           *
   * ========================================================================= */
  
  /**
   * Thread mutex support. Wrapper around apr. Old code in jk_mt.h used if no APR.
   * 
   * @author Costin Manolache
   */
  
  #include "jk_global.h"
  #include "jk_map.h"
  #include "jk_pool.h"
  #include "jk_mutex.h"
  
  /* XXX TODO:
     - In a JNI environment it is _essential_ we use the same locking mechanism as
     java. We need to add a check to see if we have a JNIEnv, and use the java
     locking abstractions.
  */
  
  #ifdef HAS_APR
  
  #include "apr_thread_mutex.h"
  
  static int JK_METHOD jk2_mutex_thread_init(jk_env_t *env, jk_bean_t  *mutexB)
  {
      jk_mutex_t *jkMutex=mutexB->object;
  
      return apr_thread_mutex_create( &jkMutex->threadMutex,
                                      0,
                                      (apr_pool_t *)env->getAprPool(env) );
  }
  
  static int JK_METHOD 
  jk2_mutex_thread_destroy(jk_env_t *env, jk_bean_t  *mutexB)
  {
      jk_mutex_t *jkMutex=mutexB->object;
  
      if( jkMutex==NULL || jkMutex->threadMutex==NULL ) return JK_ERR;
  
      return apr_thread_mutex_destroy( jkMutex->threadMutex);
  }
  
  static int JK_METHOD 
  jk2_mutex_thread_lock(jk_env_t *env, jk_mutex_t  *jkMutex)
  {
      return apr_thread_mutex_lock( jkMutex->threadMutex );
  }
  
  static int JK_METHOD 
  jk2_mutex_thread_tryLock(jk_env_t *env, jk_mutex_t  *jkMutex)
  {
      return apr_thread_mutex_trylock( jkMutex->threadMutex );
  }
  
  static int JK_METHOD 
  jk2_mutex_thread_unLock(jk_env_t *env, jk_mutex_t  *jkMutex)
  {
      return apr_thread_mutex_unlock( jkMutex->threadMutex );
  }
  
  #elif defined( WIN32 )
  /*-------------------- Windows - @deprecated, use APR if possible -------------------- */
  
  #include <windows.h>
  
  static int JK_METHOD jk2_mutex_thread_init(jk_env_t *env, jk_bean_t  *mutexB)
  {
      jk_mutex_t *jkMutex=mutexB->object;
      InitializeCriticalSection( & jkMutex->threadMutex );
      return JK_OK;
  }
  
  static int JK_METHOD 
  jk2_mutex_thread_destroy(jk_env_t *env, jk_bean_t  *mutexB)
  {
      jk_mutex_t *jkMutex=mutexB->object;
  
      if( jkMutex==NULL || jkMutex->threadMutex==NULL ) return JK_ERR;
      DeleteCriticalSection( & jkMutex->threadMutex );
      return JK_OK;
  }
  
  static int JK_METHOD 
  jk2_mutex_thread_lock(jk_env_t *env, jk_mutex_t  *jkMutex)
  {
      EnterCriticalSection( &jkMutex->threadMutex );
      return JK_OK;
  }
  
  static int JK_METHOD 
  jk2_mutex_thread_tryLock(jk_env_t *env, jk_mutex_t  *jkMutex)
  {
      return JK_OK;
  }
  
  static int JK_METHOD 
  jk2_mutex_thread_unLock(jk_env_t *env, jk_mutex_t  *jkMutex)
  {
      LeaveCriticalSection( &jkMutex->threadMutex );
      return JK_OK;
  }
  
  
  #elif defined( _REENTRANT )
  /*-------------------- PThread - @deprecated, use APR if possible -------------------- */
  
  #include <pthread.h>
  
  static int JK_METHOD jk2_mutex_thread_init(jk_env_t *env, jk_bean_t  *mutexB)
  {
      jk_mutex_t *jkMutex=mutexB->object;
  
      return pthread_mutex_init( &jkMutex->threadMutex, NULL );
  }
  
  static int JK_METHOD 
  jk2_mutex_thread_destroy(jk_env_t *env, jk_bean_t  *mutexB)
  {
      jk_mutex_t *jkMutex=mutexB->object;
  
      if( jkMutex==NULL ) return JK_ERR;
      return pthread_mutex_destroy( & jkMutex->threadMutex);
  }
  
  static int JK_METHOD 
  jk2_mutex_thread_lock(jk_env_t *env, jk_mutex_t  *jkMutex)
  {
      return pthread_mutex_lock( & jkMutex->threadMutex );
  }
  
  static int JK_METHOD 
  jk2_mutex_thread_tryLock(jk_env_t *env, jk_mutex_t  *jkMutex)
  {
      return JK_OK;
  }
  
  static int JK_METHOD 
  jk2_mutex_thread_unLock(jk_env_t *env, jk_mutex_t  *jkMutex)
  {
      return pthread_mutex_unlock( & jkMutex->threadMutex );
  }
  
  #else /* All 3 cases we cover - apr and the 2 fallbacks */
  
  /*-------------------- No locking -------------------- */
  
  static int JK_METHOD jk2_mutex_thread_init(jk_env_t *env, jk_bean_t  *mutexB)
  {
      return JK_OK;
  }
  
  static int JK_METHOD 
  jk2_mutex_thread_destroy(jk_env_t *env, jk_bean_t  *mutexB)
  {
      return JK_OK;
  }
  
  static int JK_METHOD 
  jk2_mutex_thread_lock(jk_env_t *env, jk_mutex_t  *jkMutex)
  {
      return JK_OK;
  }
  
  static int JK_METHOD 
  jk2_mutex_thread_tryLock(jk_env_t *env, jk_mutex_t  *jkMutex)
  {
      return JK_OK;
  }
  
  static int JK_METHOD 
  jk2_mutex_thread_unLock(jk_env_t *env, jk_mutex_t  *jkMutex)
  {
      return JK_OK;
  }
  
  #endif
  
  int JK_METHOD jk2_mutex_thread_factory( jk_env_t *env ,jk_pool_t *pool,
                                          jk_bean_t *result,
                                          const char *type, const char *name)
  {
      jk_mutex_t *mutex;
      jk_workerEnv_t *wEnv;
  
      mutex=(jk_mutex_t *)pool->calloc(env, pool, sizeof(jk_mutex_t));
  
      if( mutex == NULL )
          return JK_ERR;
  
      mutex->pool=pool;
  
      mutex->mbean=result; 
      result->object=mutex;
      
      result->init=jk2_mutex_thread_init;
      result->destroy=jk2_mutex_thread_destroy;
      result->invoke=jk2_mutex_invoke;
      
      mutex->lock=jk2_mutex_thread_lock;
      mutex->tryLock=jk2_mutex_thread_tryLock;
      mutex->unLock=jk2_mutex_thread_unLock;
  
      return JK_OK;
  }
  
  
  

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