costin      02/04/25 12:18:40

  Modified:    jk/native2/common jk_shm.c
  Log:
  Many small fixes and changes to allow it to be used from C and java.
  
  Revision  Changes    Path
  1.6       +181 -131  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.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- jk_shm.c  18 Apr 2002 22:47:18 -0000      1.5
  +++ jk_shm.c  25 Apr 2002 19:18:39 -0000      1.6
  @@ -88,85 +88,69 @@
   #if APR_HAS_SHARED_MEMORY
   
   #include "apr_shm.h"
  +#include "apr_atomic.h"
   
   /* Inter-process synchronization - to create the slots */
   #include "apr_proc_mutex.h"
   
  -struct jk_shm_buffer {
  -    /** Incremented after each modification */
  -    int generation;
  -    /** 1 if the buffer is in an unstable state.
  -     *  XXX Shouldn't happen
  -     */
  -    int busy;
  -
  -    /** Pid of the owning process */
  -    int owner;
  -    
  -    int id;
  -    char name[64];
  -    
  -    char *data;
  -};
  -
  -struct jk_shm_head {
  -    int size;
  -    int bufferCount;
  -    
  -    int objCount;
  -    int lastId;
  -
  -    struct jk_shm_buffer buffers[1];
  -};
  -
  -
  -typedef struct jk_shm_private {
  -    apr_size_t size;
  -    apr_shm_t *aprShm;
  +static apr_pool_t *globalShmPool;
   
  -    struct jk_shm_head *image;
  -} jk_shm_private_t;
  +#define SHM_SET_ATTRIBUTE 0
  +#define SHM_REGISTER_TOMCAT 2
  +#define SHM_ATTACH 3
  +#define SHM_DETACH 4
   
  -static apr_pool_t *globalShmPool;
   
   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);
  +    apr_shm_t *aprShm=(apr_shm_t *)shm->privateData;
  +
  +    return apr_shm_destroy(aprShm);
   }
   
   static int jk2_shm_detach(jk_env_t *env, jk_shm_t *shm)
   {
  -    jk_shm_private_t *shmP=shm->privateData;
  +    apr_shm_t *aprShm=(apr_shm_t *)shm->privateData;
   
  -    return apr_shm_detach(shmP->aprShm);
  +    return apr_shm_detach(aprShm);
   }
   
   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 );
  +    return apr_shm_attach((apr_shm_t **)&shm->privateData, shm->fname, 
globalShmPool );
   }
   
   
   /* Create or reinit an existing scoreboard. The MPM can control whether
    * the scoreboard is shared across multiple processes or not
    */
  -int jk2_shm_create(jk_env_t *env, jk_shm_t *shm)
  -{
  -    apr_status_t rv;
  -    jk_shm_private_t *shmP=shm->privateData;
  +static int  jk2_shm_init(struct jk_env *env, jk_shm_t *shm) {
  +    apr_status_t rv=APR_SUCCESS;
  +    jk_shm_head_t *head;
  +    
  +    if( shm->fname==NULL ) {
  +        env->l->jkLog(env, env->l, JK_LOG_ERROR, "shm.init(): No file\n");
  +        return JK_ERR;
  +    }
   
  -    /* The config says to create a name-based shmem */
  -    if ( shm->fname == NULL ) {
  +    if( shm->size == 0  ) {
  +        shm->size = shm->slotSize * shm->slotMaxCount;
  +    }
  +    
  +    /* 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, 
  -                      "No name for jk_shm\n");
  -        return JK_ERR;
  +                      "Unable to create global pool for jk_shm\n");
  +        return rv;
       }
       
  -    rv=apr_shm_attach(&shmP->aprShm, shm->fname, globalShmPool );
  +    shm->privateData=NULL;
  +
  +    rv=apr_shm_attach((apr_shm_t **)&shm->privateData, shm->fname, globalShmPool );
       if( rv ) {
           char error[256];
           apr_strerror( rv, error, 256 );
  @@ -174,8 +158,20 @@
           env->l->jkLog(env, env->l, JK_LOG_ERROR, 
                         "shm.create(): error attaching shm, will create %s %d %p 
%s\n",
                         shm->fname, rv, globalShmPool, error );
  -        shmP->aprShm=NULL;
  +        shm->privateData=NULL;
       } else {
  +        env->l->jkLog(env, env->l, JK_LOG_INFO, 
  +                      "shm.create(): attaching to existing shm %s\n",
  +                      shm->fname );
  +        /* Get the base address, initialize it */
  +        shm->image = apr_shm_baseaddr_get( (apr_shm_t *)shm->privateData);
  +        shm->head = (jk_shm_head_t *)shm->image;
  +        
  +        if( shm->image==NULL ) {
  +            env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  +                          "shm.create(): No base memory %s\n", shm->fname);
  +            return JK_ERR;
  +        }
           return JK_OK;
       }
   
  @@ -192,7 +188,7 @@
           env->l->jkLog(env, env->l, JK_LOG_ERROR, 
                         "shm.create(): error removing shm %s %d %s\n",
                         shm->fname, rv, error );
  -        shmP->aprShm=NULL;
  +        shm->privateData=NULL;
           return rv;
       } else {
           env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  @@ -200,128 +196,182 @@
       }
   
   
  -    rv = apr_shm_create(&shmP->aprShm, shmP->size, shm->fname, globalShmPool);
  +    rv = apr_shm_create((apr_shm_t **)&shm->privateData,(apr_size_t)shm->size,
  +                        shm->fname, globalShmPool);
       
  -    if (rv) {
  +    if (rv!=JK_OK) {
           char error[256];
           apr_strerror( rv, error, 256 );
           
           env->l->jkLog(env, env->l, JK_LOG_ERROR, 
                         "shm.create(): error creating shm %d %s %d %s\n",
  -                      shmP->size, 
  +                      shm->size, 
                         shm->fname, rv, error );
  -        shmP->aprShm=NULL;
  +        shm->privateData=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  %s %d %s\n", shm->fname, rv, error);
  -    }
  -
  -    rv=jk2_shm_create( env, shm );
  -    
  -    if( rv || shmP->aprShm==NULL ) {
  +    if(  shm->privateData==NULL ) {
           env->l->jkLog(env, env->l, JK_LOG_ERROR, 
                         "Unable to create %s %d\n", shm->fname, rv);
  -        return JK_FALSE;
  +        return JK_ERR;
       }
   
       /* Get the base address, initialize it */
  -    shmP->image = apr_shm_baseaddr_get( shmP->aprShm);
  -    if( shmP->image==NULL ) {
  +    shm->image = apr_shm_baseaddr_get( (apr_shm_t *)shm->privateData);
  +    shm->head = (jk_shm_head_t *)shm->image;
  +
  +    if( shm->image==NULL ) {
           env->l->jkLog(env, env->l, JK_LOG_ERROR, 
                         "shm.create(): No memory allocated %s\n",
                         shm->fname);
  -        return JK_FALSE;
  +        return JK_ERR;
       }
       
  -    memset(shmP->image, 0, shmP->size);
  -    strcpy(shmP->image, "Hello From Apache");
  +    memset(shm->image, 0, shm->size);
   
  +    shm->head->slotSize = shm->slotSize;
  +    shm->head->slotMaxCount = shm->slotMaxCount;
  +    shm->head->lastSlot = 0;
  +    
       env->l->jkLog(env, env->l, JK_LOG_INFO, 
                     "shm.init() Initalized %s %p\n",
  -                      shm->fname, shmP->image);
  +                  shm->fname, shm->image);
  +
  +    return JK_OK;
  +}
  +
  +/* pos starts with 1 ( 0 is the head )
  + */
  +jk_shm_slot_t *jk2_shm_getSlot(struct jk_env *env, struct jk_shm *shm, int pos)
  +{
  +    if( pos==0 ) return NULL;
  +    if( shm->image==NULL ) return NULL;
  +    if( pos > shm->slotMaxCount ) return NULL;
  +    /* Pointer aritmethic, I hope it's right */
  +    return shm->image + pos * shm->slotSize;
  +}
   
  -    return JK_TRUE;
  +jk_shm_slot_t *jk2_shm_createSlot(struct jk_env *env, struct jk_shm *shm, 
  +                                  char *name, int size)
  +{
  +    /* For now all slots are equal size
  +     */
  +    /* XXX interprocess sync */
  +    int slotId=shm->head->lastSlot++;
  +    
  +    jk_shm_slot_t *slot= (void *)shm->image + slotId * shm->slotSize;
  +    
  +    env->l->jkLog(env, env->l, JK_LOG_INFO, 
  +                  "shm.createSlot() Create %d %p %p\n", slotId, shm->image, slot );
  +    strncpy(slot->name, name, 64 );
  +    
  +    return slot;
   }
   
  +/** Get an ID that is unique across processes.
  + */
  +int jk2_shm_getId(struct jk_env *env, struct jk_shm *shm)
  +{
  +
  +    return 0;
  +}
  +
  +
  +
   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);
  +     shm->size=atoi(value);
       } else {
  -     return JK_FALSE;
  +     return JK_ERR;
       }
  -    return JK_TRUE;   
  +    return JK_OK;   
  +
   }
   
  -int JK_METHOD jk2_shm_factory( jk_env_t *env, jk_pool_t *pool,
  -                     jk_bean_t *result,
  -                     const char *type, const char *name)
  +/* ==================== Dispatch messages from java ==================== */
  +
  +/** Called by java. Will call the right shm method.
  + */
  +static int jk2_shm_dispatch(jk_env_t *env, void *target, jk_endpoint_t *ep, 
jk_msg_t *msg)
   {
  -    jk_shm_t *_this;
  +    jk_bean_t *bean=(jk_bean_t *)target;
  +    jk_shm_t *shm=(jk_shm_t *)bean->object;
   
  -    _this=(jk_shm_t *)pool->calloc(env, pool, sizeof(jk_shm_t));
  +    int code=msg->getByte(env, msg );
  +    
  +    env->l->jkLog(env, env->l, JK_LOG_INFO, 
  +                  "shm.%d() \n", code);
  +    switch( code ) {
  +    case SHM_SET_ATTRIBUTE: {
  +        char *name=msg->getString( env, msg );
  +        char *value=msg->getString( env, msg );
  +        env->l->jkLog(env, env->l, JK_LOG_INFO, 
  +                      "shm.setAttribute() %s %s %p\n", name, value, 
bean->setAttribute);
  +        if( bean->setAttribute != NULL)
  +            bean->setAttribute(env, bean, name, value );
  +        return JK_OK;
  +    }
  +    case SHM_ATTACH: {
  +        env->l->jkLog(env, env->l, JK_LOG_INFO, 
  +                      "shm.init()\n");
  +        shm->init(env, shm);
  +        return JK_OK;
  +    }
  +    case SHM_DETACH: {
   
  -    if( _this == NULL )
  -        return JK_FALSE;
  +        return JK_OK;
  +    }
  +    case SHM_REGISTER_TOMCAT: {
   
  -    _this->privateData=(jk_shm_private_t *)pool->calloc(env, pool, 
sizeof(jk_shm_private_t));
  -        
  +        return JK_OK;
  +    }
  +    }
  +    return JK_ERR;
  +}
  +
  +static int jk2_shm_setWorkerEnv( jk_env_t *env, jk_shm_t *shm, jk_workerEnv_t *wEnv 
) {
  +    wEnv->registerHandler( env, wEnv, "shm",
  +                           "shmDispatch", JK_HANDLE_SHM_DISPATCH,
  +                           jk2_shm_dispatch, NULL );
  +    fprintf(stderr, "shm:setWorkerEnv \n");
  +}
  +
  +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 *shm;
  +    jk_workerEnv_t *wEnv;
  +
  +    shm=(jk_shm_t *)pool->calloc(env, pool, sizeof(jk_shm_t));
  +
  +    if( shm == NULL )
  +        return JK_ERR;
  +
  +    shm->privateData=NULL;
  +
  +    shm->slotSize=DEFAULT_SLOT_SIZE;
  +    shm->slotMaxCount=DEFAULT_SLOT_COUNT;
  +    
       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; */
  +    shm->mbean=result; 
  +    result->object=shm;
       
  -    /* result->aprPool=(apr_pool_t *)p->_private; */
  -        
  -    return JK_TRUE;
  +    shm->getSlot=jk2_shm_getSlot;
  +    shm->createSlot=jk2_shm_createSlot;
  +    shm->getId=jk2_shm_getId;
  +    shm->init=jk2_shm_init;
  +    shm->destroy=jk2_shm_detach;
  +    shm->setWorkerEnv=jk2_shm_setWorkerEnv;
  +    
  +    return JK_OK;
   }
   
   #endif /* APR_HAS_SHARED_MEMORY */
  
  
  

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

Reply via email to