costin      02/04/17 15:52:14

  Modified:    jk/native2/common jk_shm.c
  Log:
  More work on the shm object.
  
  Revision  Changes    Path
  1.4       +85 -26    jakarta-tomcat-connectors/jk/native2/common/jk_shm.c
  
  Index: jk_shm.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_shm.c,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- jk_shm.c  12 Apr 2002 22:53:56 -0000      1.3
  +++ jk_shm.c  17 Apr 2002 22:52:14 -0000      1.4
  @@ -89,6 +89,9 @@
   
   #include "apr_shm.h"
   
  +/* Inter-process synchronization - to create the slots */
  +#include "apr_proc_mutex.h"
  +
   struct jk_shm_buffer {
       /** Incremented after each modification */
       int generation;
  @@ -120,52 +123,42 @@
   typedef struct jk_shm_private {
       apr_size_t size;
       apr_shm_t *aprShm;
  -    apr_pool_t *aprPool;
   
       struct jk_shm_head *image;
   } jk_shm_private_t;
   
   static apr_pool_t *globalShmPool;
   
  -static int jk_shm_destroy(jk_env_t *env, jk_shm_t *shm)
  +static int jk2_shm_destroy(jk_env_t *env, jk_shm_t *shm)
   {
       jk_shm_private_t *shmP=shm->privateData;
       
       return apr_shm_destroy(shmP->aprShm);
   }
   
  -static int jk_shm_detach(jk_env_t *env, jk_shm_t *shm)
  +static int jk2_shm_detach(jk_env_t *env, jk_shm_t *shm)
   {
       jk_shm_private_t *shmP=shm->privateData;
   
       return apr_shm_detach(shmP->aprShm);
   }
   
  -static int jk_shm_attach(jk_env_t *env, jk_shm_t *shm)
  +static int jk2_shm_attach(jk_env_t *env, jk_shm_t *shm)
   {
  +    jk_shm_private_t *shmP=shm->privateData;
   
  +    return apr_shm_attach(&shmP->aprShm, shm->fname, globalShmPool );
   }
   
   
   /* Create or reinit an existing scoreboard. The MPM can control whether
    * the scoreboard is shared across multiple processes or not
    */
  -static int jk_shm_createScoreboard(jk_env_t *env, jk_shm_t *shm)
  +static int jk2_shm_create(jk_env_t *env, jk_shm_t *shm)
   {
       apr_status_t rv;
       jk_shm_private_t *shmP=shm->privateData;
   
  -    /* We don't want to have to recreate the scoreboard after
  -     * restarts, so we'll create a global pool and never clean it.
  -     */
  -    rv = apr_pool_create(&globalShmPool, NULL);
  -
  -    if (rv != APR_SUCCESS) {
  -        env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  -                      "Unable to create global pool for jk_shm\n");
  -        return rv;
  -    }
  -
       /* The config says to create a name-based shmem */
       if ( shm->fname == NULL ) {
           env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  @@ -183,12 +176,67 @@
       rv = apr_shm_create(&shmP->aprShm, shmP->size, shm->fname, globalShmPool);
       
       if (rv) {
  +        char error[256];
  +        apr_strerror( rv, error, 256 );
  +        
           env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  -                      "shm.create(): error creating named scoreboard %s %d\n",
  -                      shm->fname, rv);
  +                      "shm.create(): error creating named scoreboard %s %d %s\n",
  +                      shm->fname, rv, error );
  +        shmP->aprShm=NULL;
           return rv;
       }
   
  +    return JK_OK;
  +}
  +
  +#define DEFAULT_SHM_SIZE 1024 * 1024 * 8
  +
  +static int  jk2_shm_init(struct jk_env *env, jk_shm_t *shm) {
  +    apr_status_t rv;
  +    jk_shm_private_t *shmP=shm->privateData;
  +
  +    if( shm->fname==NULL ) {
  +        env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  +                      "shm.init(): No file\n");
  +        return JK_FALSE;
  +    }
  +
  +    if( shmP->size == 0  ) {
  +        shmP->size = DEFAULT_SHM_SIZE;
  +    }
  +    
  +    /* We don't want to have to recreate the scoreboard after
  +     * restarts, so we'll create a global pool and never clean it.
  +     */
  +    rv = apr_pool_create(&globalShmPool, NULL);
  +
  +    if (rv != APR_SUCCESS) {
  +        env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  +                      "Unable to create global pool for jk_shm\n");
  +        return rv;
  +    }
  +    
  +    shmP->aprShm=NULL;
  +
  +    /* Try to attach */
  +    rv=jk2_shm_attach( env, shm );
  +
  +    if( rv || shmP->aprShm==NULL ) {
  +        char error[256];
  +        apr_strerror( rv, error, 256 );
  +        env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  +                      "Unable to attach to %s %d %s\n", shm->fname, rv, error);
  +    }
  +
  +    rv=jk2_shm_create( env, shm );
  +    
  +    if( rv || shmP->aprShm==NULL ) {
  +        env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  +                      "Unable to create to %s %d\n", shm->fname, rv);
  +        return JK_FALSE;
  +    }
  +
  +    /* Get the base address, initialize it */
       shmP->image = apr_shm_baseaddr_get( shmP->aprShm);
       if( shmP->image==NULL ) {
           env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  @@ -202,30 +250,41 @@
       return JK_TRUE;
   }
   
  -static int  jk2_shm_init(struct jk_env *env, jk_shm_t *shm) {
  -
  -
  -    return JK_TRUE;
  +static int jk2_shm_setAttribute( jk_env_t *env, jk_bean_t *mbean, char *name, void 
*valueP ) {
  +    jk_shm_t *shm=(jk_shm_t *)mbean->object;
  +    char *value=(char *)valueP;
  +    jk_shm_private_t *shmP=shm->privateData;
  +    
  +    if( strcmp( "file", name ) == 0 ) {
  +     shm->fname=value;
  +    } else if( strcmp( "size", name ) == 0 ) {
  +     shmP->size=atoi(value);
  +    } else {
  +     return JK_FALSE;
  +    }
  +    return JK_TRUE;   
   }
   
  -
   int JK_METHOD jk2_shm_factory( jk_env_t *env, jk_pool_t *pool,
                        jk_bean_t *result,
                        const char *type, const char *name)
   {
       jk_shm_t *_this;
   
  -    _this=(jk_shm_t *)pool->alloc(env, pool, sizeof(jk_shm_t));
  +    _this=(jk_shm_t *)pool->calloc(env, pool, sizeof(jk_shm_t));
   
       if( _this == NULL )
           return JK_FALSE;
   
  -    /* result->setAttribute=jk2_scoreboard_setAttribute; */
  -    /* result->getAttribute=jk2_scoreboard_getAttribute; */
  +    _this->privateData=(jk_shm_private_t *)pool->calloc(env, pool, 
sizeof(jk_shm_private_t));
  +        
  +    result->setAttribute=jk2_shm_setAttribute;
  +    /* result->getAttribute=jk2_shm_getAttribute; */
       /*     _this->mbean=result; */
       result->object=_this;
   
       _this->init=jk2_shm_init;
  +/*     _this->destroy=jk2_shm_detach; */
       
       /* result->aprPool=(apr_pool_t *)p->_private; */
           
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to