mturk       2004/03/12 11:15:56

  Modified:    jk/native2/common jk_shm.c
  Log:
  Total rewrite...
  Allows using anonymous shared memory or file based.
  Also allow usage of raw memory in case there is no shmem support.
  Added two new setup direcives: slots (manages max number of slots),
  and memory that when set uses malloc'd memory instead shmem.
  If the file name starts with 'anon' try using anonymous memory.
  Shmem uses create/attach mechanism so please test.
  
  Revision  Changes    Path
  1.40      +205 -370  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.39
  retrieving revision 1.40
  diff -u -r1.39 -r1.40
  --- jk_shm.c  11 Mar 2004 15:32:38 -0000      1.39
  +++ jk_shm.c  12 Mar 2004 19:15:56 -0000      1.40
  @@ -15,14 +15,6 @@
    */
   
   /**
  - * Scoreboard - used for communication on multi-process servers.
  - *
  - * This is an optional component - will be enabled only if APR is used. 
  - * The code is cut&pasted from apache and mod_jserv.
  - *
  - * 
  - * 
  - * @author Jserv and Apache people
    */
   
   #include "jk_global.h"
  @@ -30,23 +22,11 @@
   #include "jk_pool.h"
   #include "jk_shm.h"
   
  -/* global.h will include apr.h. If APR and mmap is compiled in, we'll use
  -   it. If APR is not availalbe, we use mmap directly - the code worked fine
  -   for jserv.
  -*/
  -#if APR_HAS_MMAP
  -
  -#include "apr_mmap.h"
  -#include "apr_file_io.h"
  -#include "apr_file_info.h"
  +#include "apr_shm.h"
  +#include "apr_rmm.h"
  +#include "apr_errno.h"
   #include "apr_general.h"
  -
  -#elif defined(HAVE_MMAP) && !defined(WIN32)
  -
  -#include <sys/mman.h>
  -#include <fcntl.h>
  -
  -#endif
  +#include "apr_lib.h" 
   
   
   #define SHM_WRITE_SLOT 2
  @@ -54,276 +34,147 @@
   #define SHM_DUMP 6
   
   
  -#if (APR_HAS_MMAP == 1)
  -
  -static int JK_METHOD jk2_shm_destroy(jk_env_t *env, jk_shm_t *shm)
  +static int JK_METHOD jk2_shm_destroy(jk_env_t *env, jk_shm_t *shmem)
   {
  -    apr_mmap_t *aprShm=(apr_mmap_t *)shm->privateData;
  +    apr_status_t rv = APR_SUCCESS;
  +#if APR_HAS_SHARED_MEMORY
  +    apr_shm_t *shm = (apr_shm_t *)shmem->privateData;
  +
  +    if (shm) {
  +        if (shmem->attached)
  +            rv = apr_shm_detach(shm);
  +        else
  +            rv = apr_shm_destroy(shm);
  +    }
  +#endif
  +    shmem->head = NULL;
  +    shmem->image = NULL;
   
  -    if( aprShm==NULL )
  -        return JK_OK;
  -    
  -    return apr_mmap_delete(aprShm);
  +    return rv == APR_SUCCESS ? JK_OK : JK_ERR;
   }
   
  -static int jk2_shm_create(jk_env_t *env, jk_shm_t *shm)
  +static int jk2_shm_create(jk_env_t *env, jk_shm_t *shmem)
   {
  -    apr_status_t rc;
  -    apr_file_t *file;
  -    apr_finfo_t finfo;
  -    apr_mmap_t *aprMmap;
  +    apr_status_t rc = APR_EGENERAL;
  +    apr_shm_t *shm = NULL;
       apr_pool_t *globalShmPool;
   
  -    globalShmPool= (apr_pool_t *)env->getAprPool( env );
  +    globalShmPool = (apr_pool_t *)env->getAprPool(env);
   
  -    if( globalShmPool==NULL )
  +    if (!globalShmPool) {
           return JK_ERR;
  -
  -    /* Check if the scoreboard is in a note. That's the only way we
  -       can get HP-UX to work
  -    */
  -    apr_pool_userdata_get( & shm->image, "mod_jk_shm",globalShmPool );
  -    if( shm->image!=NULL ) {
  -        shm->head = (jk_shm_head_t *)shm->image;
  -
  -        if( shm->mbean->debug > 0 )
  -            env->l->jkLog(env, env->l, JK_LOG_DEBUG, 
  -                          "shm.create(): GLOBAL_SHM  %#lx\n", shm->image );
  -        return JK_OK;
  -    } else {
  -        if( shm->mbean->debug > 0 )
  -            env->l->jkLog(env, env->l, JK_LOG_DEBUG, 
  -                          "shm.create(): NO GLOBAL_SHM  %#lx\n", shm->image );
       }
       
  -
  -    /* First make sure the file exists and is big enough
  -     */
  -    rc=apr_file_open( &file, shm->fname,
  -                      APR_READ | APR_WRITE | APR_CREATE | APR_BINARY,
  -                      APR_OS_DEFAULT, globalShmPool);
  -    if (rc) {
  -        char error[256];
  -        apr_strerror( rc, error, 256 );
  -        
  -        env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  -                      "shm.create(): error opening file %s %d %s\n",
  -                      shm->fname, rc, error );
  -        shm->privateData=NULL;
  -        return JK_ERR;
  -    } 
  -
  -    rc=apr_file_info_get(&finfo, APR_FINFO_SIZE, file);
  -
  -    if( shm->mbean->debug > 0 )
  -        env->l->jkLog(env, env->l, JK_LOG_DEBUG, 
  -                      "shm.create(): file open %s %d %d\n", shm->fname, shm->size, 
(int) finfo.size );
  -
  -    if( (int) finfo.size < shm->size ) {
  -        char bytes[1024];
  -        apr_size_t toWrite = (apr_size_t)(shm->size-finfo.size);
  -        apr_off_t off=0;
  -        
  -        memset( bytes, 0, 1024 );        
  -        apr_file_seek( file, APR_END, &off);
  -
  -        while( toWrite > 0 ) {
  -            apr_size_t written;
  -            rc=apr_file_write_full(file, bytes, 1024, &written);
  -            if( rc!=APR_SUCCESS ) {
  -                env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  -                              "shm.create(): Can't write %s %d %s\n",
  -                              shm->fname, errno, strerror( errno ));
  -                return JK_ERR;
  -            }
  -            if( toWrite < written  ){
  -                toWrite=0;
  -            }else{
  -                toWrite-=written;
  -            }
  -        }
  -        
  -        rc=apr_file_info_get(&finfo, APR_FINFO_SIZE, file);
  -    }
  -     
  -    /* Now mmap it
  -     */
  -    rc=apr_mmap_create( &aprMmap,  file, (apr_off_t)0,
  -                        (apr_size_t)finfo.size, APR_MMAP_READ | APR_MMAP_WRITE,
  -                        globalShmPool );
  -    if( rc ) {
  -        char error[256];
  -        apr_strerror( rc, error, 256 );
  -        
  -        env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  -                      "shm.create(): error creating %s %d %d %#lx %s\n",
  -                      shm->fname, (int) finfo.size, (int) rc, globalShmPool, error 
);
  -        shm->privateData=NULL;
  -        return JK_ERR;
  +    if (shmem->inmem) {
  +        shmem->head = apr_pcalloc(globalShmPool, sizeof(jk_shm_head_t) + 
shmem->slotMaxCount);
  +        shmem->image = apr_pcalloc(globalShmPool, shmem->slotMaxCount * 
shmem->slotSize);
  +        shmem->head->structSize = sizeof(jk_shm_head_t) + shmem->slotMaxCount;
  +        shmem->head->slotSize = shmem->slotSize;
  +        shmem->head->slotMaxCount = shmem->slotMaxCount;
  +        return JK_OK;
       }
  -
  -    shm->privateData=aprMmap;
  -
  -    apr_mmap_offset(& shm->image, aprMmap, (apr_off_t)0);
  -
  -    apr_pool_userdata_set( shm->image, "mod_jk_shm", NULL, globalShmPool );
  -        
  -    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;
  +#if APR_HAS_SHARED_MEMORY
  +    /* XXX: deal with anonymous */
  +    if (strncmp(shmem->fname, "anon", 4) == 0) {
  +        rc = apr_shm_create(&shm, shmem->size, NULL, globalShmPool);
  +        if (APR_STATUS_IS_ENOTIMPL(rc)) {
  +            env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  +                          "shm.create(): Anonymous shared memory not implemented 
%d\n");
  +            shmem->privateData=NULL;
  +            return JK_ERR;
  +        }
       }
  -
  -    return JK_OK;
  -}
  -
  -#elif defined(HAVE_MMAP) && !defined(WIN32)
  -
  -static int JK_METHOD jk2_shm_destroy(jk_env_t *env, jk_shm_t *shm)
  -{
  -    caddr_t shmf=(caddr_t)shm->privateData;
  -
  -    munmap(shmf, shm->size);
  -
  -    return JK_OK;
  -}
  -
  -static int jk2_shm_create(jk_env_t *env, jk_shm_t *shm)
  -{
  -    int rc;
  -    struct stat filestat;
  -
  -    int fd = open(shm->fname, O_RDWR|O_CREAT, 0777);
  -    
  -    if (fd == -1) {
  -        env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  -                      "shm.create(): Can't open %s %d %s\n",
  -                      shm->fname, errno, strerror( errno ));
  -        return JK_ERR;
  +    if (rc != APR_SUCCESS) {
  +        rc = apr_shm_create(&shm, shmem->size, shmem->fname, globalShmPool);
  +        if (rc == APR_EEXIST) {
  +            /*
  +            * The shm could have already been created (i.e. we may be a child 
process).
  +            * See if we can attach to the existing shared memory.
  +            */
  +            rc = apr_shm_attach(&shm, shmem->fname, globalShmPool); 
  +            shmem->attached = 1;
  +        }
       }
  +    if (rc != APR_SUCCESS) {
  +        char ebuf[256];
  +        apr_strerror(rc, ebuf, 256);
   
  -    rc=stat( shm->fname, &filestat);
  -    if ( rc == -1) {
           env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  -                      "shm.create(): Can't stat %s %d %s\n",
  -                      shm->fname, errno, strerror( errno ));
  +                      "shm.create(): error creating shm %d %s\n",
  +                      rc, ebuf);
  +        shmem->privateData = NULL;
           return JK_ERR;
  -    }
  -
  -    if( shm->mbean->debug > 0 )
  -        env->l->jkLog(env, env->l, JK_LOG_DEBUG, 
  -                      "shm.create(): file open %s %d %d\n", shm->fname, shm->size, 
filestat.st_size );
  -
  -    if (filestat.st_size < shm->size ) {
  -        char bytes[1024];
  -        int toWrite=shm->size - filestat.st_size;
  -        
  -        memset( bytes, 0, 1024 );        
  -        lseek(fd, 0, SEEK_END);
  +    } 
  +    shmem->privateData = shm;
  +    shmem->head = (jk_shm_head_t *)apr_shm_baseaddr_get(shm);
   
  -        while( toWrite > 0 ) {
  -            int written;
  -            written=write(fd, bytes, 1024);
  -            if( written == -1 ) {
  -                env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  -                              "shm.create(): Can't write %s %d %s\n",
  -                              shm->fname, errno, strerror( errno ));
  -                return JK_ERR;
  -            }
  -            toWrite-=written;
  +    if (!shmem->attached) {
  +        /* Allocate header */
  +        apr_size_t head_size = sizeof(jk_shm_head_t) + shmem->slotMaxCount;
  +        /* align to slotSize */
  +        head_size = APR_ALIGN(head_size, shmem->slotSize);
  +        memset(shmem->head, 0, head_size);
  +        if (shmem->head) {
  +            shmem->head->structSize = (int)head_size;
  +            shmem->head->slotSize = shmem->slotSize;
  +            shmem->head->slotMaxCount = shmem->slotMaxCount;
           }
  -        
  -        rc=stat( shm->fname, &filestat);
  -        if ( rc == -1) {
  -            env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  -                          "shm.create(): Can't stat2 %s %d %s\n",
  -                          shm->fname, errno, strerror( errno ));
  -            return JK_ERR;
  -         }
  -    }
  -
  -    shm->privateData = mmap(NULL, filestat.st_size, PROT_READ | PROT_WRITE, 
MAP_SHARED, fd, 0);
  -
  -    if (shm->privateData == (caddr_t)-1 ||
  -        shm->privateData == NULL ) {
  -            env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  -                          "shm.create(): Can't mmap %s %d %s\n",
  -                          shm->fname, errno, strerror( errno ));
  +        env->l->jkLog(env, env->l, JK_LOG_INFO, 
  +                      "shm.create() Created head %#lx size %d\n",
  +                       shmem->head, head_size);
   
  -        close(fd);
  -        return JK_ERR;
       }
  -
  -    shm->image = (void *)shm->privateData;
  -    shm->head = (jk_shm_head_t *)shm->image;
  -    
  -    close(fd);
  -    
  -    return JK_OK;
  -}
  -
  -
  -#else
  -
  -static int JK_METHOD jk2_shm_destroy(jk_env_t *env, jk_shm_t *shm)
  -{
  +    else {
  +        shmem->slotSize = shmem->head->slotSize;
  +        shmem->slotMaxCount = shmem->head->slotMaxCount;
  +    }
  +    shmem->image = ((char *)apr_shm_baseaddr_get(shm)) + shmem->head->structSize;
  +#endif
       return JK_OK;
   }
   
   
  -static int jk2_shm_create(jk_env_t *env, jk_shm_t *shm)
  -{
  -    return JK_ERR;
  -}
  -
  -#endif
  -
  -
   /* Create or reinit an existing scoreboard. The MPM can control whether
    * the scoreboard is shared across multiple processes or not
    */
   static int JK_METHOD jk2_shm_init(struct jk_env *env, jk_shm_t *shm) {
  +    
       int rv=JK_OK;
       
  -    shm->privateData=NULL;
  +    shm->privateData = NULL;
   
  -    if( shm->fname==NULL ) {
  -        env->l->jkLog(env, env->l, JK_LOG_INFO, "shm.init(): shm file not 
specified\n");
  +    if (shm->fname == NULL) {
  +        env->l->jkLog(env, env->l, JK_LOG_INFO,
  +                      "shm.init(): shm file not specified\n");
           return JK_ERR;
       }
  +    if (!shm->slotMaxCount)
  +        shm->slotMaxCount = 1;
  +    shm->size = shm->slotSize * shm->slotMaxCount;
  +    shm->size += APR_ALIGN(sizeof(jk_shm_head_t) + shm->slotMaxCount, 
shm->slotSize);
  +    
  +    /* The smalles size is 64K */
  +    shm->size = APR_ALIGN(shm->size, 1024 * 64);
   
  -    /* make sure it's an absolute pathname */
  -    /*  fname = ap_server_root_relative(pconf, ap_scoreboard_fname); */
  -
  -    if( shm->size == 0  ) {
  -        shm->size = shm->slotSize * shm->slotMaxCount;
  -    }
  -
  -    if( shm->mbean->debug > 0 ) {
  -        env->l->jkLog(env, env->l, JK_LOG_DEBUG, "shm.init(): file=%s size=%d\n",
  +    if  (shm->mbean->debug > 0) {
  +        env->l->jkLog(env, env->l, JK_LOG_DEBUG,
  +                      "shm.init(): file=%s size=%d\n",
                         shm->fname, shm->size);
       }
   
  -    if( shm->size <= 0 ) {
  -        env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  -                      "shm.create(): No size %s\n", shm->fname);
  -        return JK_ERR;
  -    }
  -    
  -    rv=jk2_shm_create( env, shm );
  +    rv = jk2_shm_create(env, shm);
       
  -    if( rv!=JK_OK ) {
  +    if (rv != JK_OK) {
           env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  -                      "shm.create(): error mmapping %s\n",
  -                      shm->fname );
  +                      "shm.create(): error creating shm %s\n",
  +                      shm->fname);
           return rv;
       }
   
  -    if( shm->mbean->debug > 0 )
  +    if (shm->mbean->debug > 0)
           env->l->jkLog(env, env->l, JK_LOG_DEBUG, 
  -                      "shm.create(): shm created %#lx\n", shm->head );
  +        "shm.create(): shm created %#lx %#lx %d\n",
  +        shm->head, shm->image, shm->attached);
   
       return JK_OK;
   }
  @@ -333,126 +184,96 @@
    */
   static int JK_METHOD jk2_shm_reset(jk_env_t *env, jk_shm_t *shm)
   {
  -    if( shm->head == NULL ) {
  +    if (shm->head == NULL) {
           return JK_ERR;
       }
  -    memset(shm->image, 0, shm->size);
   
       shm->head->slotSize = shm->slotSize;
       shm->head->slotMaxCount = shm->slotMaxCount;
  -    shm->head->lastSlot = 1;
  -
  -    if( shm->mbean->debug > 0 )
  +    shm->head->lastSlot = 0;
  +    memset(shm->head->slots, 0, shm->head->slotMaxCount); 
  +    if (shm->mbean->debug > 0) {
           env->l->jkLog(env, env->l, JK_LOG_DEBUG, "shm.init() Reset %s %#lx\n",
                         shm->fname, shm->image);
  -
  -    return JK_OK;
  -}
  -
  -static int jk2_shm_dump(jk_env_t *env, jk_shm_t *shm, char *name)
  -{
  -    FILE *f;
  -    int i;
  -
  -    env->l->jkLog(env, env->l, JK_LOG_INFO, "shm.dump(): Struct Size=%d slotSize=%d 
slotCnt=%d head=%#lx\n",
  -                  shm->size, shm->slotSize, shm->slotMaxCount, shm->head );
  -
  -    if( shm->head==NULL ) return JK_ERR;
  -
  -    env->l->jkLog(env, env->l, JK_LOG_INFO, "shm.dump(): shmem  slotSize=%d 
slotCnt=%d lastSlot=%d ver=%d\n",
  -                  shm->head->slotSize, shm->head->slotMaxCount, 
shm->head->lastSlot, shm->head->lbVer );
  -
  -    for( i=1; i< shm->head->lastSlot; i++ ) {
  -        jk_shm_slot_t *slot=shm->getSlot( env, shm, i );
  -        jk_msg_t *msg;
  -
  -        if( slot==NULL ) continue;
  -        msg=jk2_msg_ajp_create2( env, env->tmpPool, slot->data, slot->size);
  -
  -        env->l->jkLog(env, env->l, JK_LOG_INFO, "shm.dump(): slot %d ver=%d size=%d 
name=%s\n",
  -                      i, slot->ver, slot->size, slot->name );
  -
  -        msg->dump( env, msg, "Slot content ");
       }
  -    
  -    if( name==NULL ) return JK_ERR;
  -    
  -/* 
  - * XXX
  - * To be checked later, AS400 may need no ccsid 
  - * conversions applied if pure binary, for now 
  - * I assume stream is EBCDIC and need to be converted 
  - * in standard ASCII using codepage 819
  - */
  -#ifdef AS400
  -    f = fopen(name, "a+, o_ccsid=819");
  -#else
  -    f = fopen(name, "a+");
  -#endif        
  -
  -    fwrite( shm->head, 1, shm->size, f ); 
  -    fclose( f );
  -
  -    env->l->jkLog(env, env->l, JK_LOG_INFO, "shm.dump(): Dumped %d in %s\n",
  -                  shm->size, name);
  -    
       return JK_OK;
   }
   
   
   /* pos starts with 1 ( 0 is the head )
    */
  -jk_shm_slot_t * JK_METHOD jk2_shm_getSlot(struct jk_env *env, struct jk_shm *shm, 
int pos)
  +jk_shm_slot_t * JK_METHOD jk2_shm_getSlot(struct jk_env *env,
  +                                          struct jk_shm *shm, int pos)
   {
  -    char *ptr;
  -    if( pos==0 ) return NULL;
  -    if( shm->image==NULL ) return NULL;
  -    if( pos > shm->slotMaxCount ) return NULL;
  -    if( pos * shm->slotSize > shm->size ) return NULL;
  -
  -    /* Pointer aritmethic, I hope it's right */
  -    ptr = (void *) shm->image;
  -    ptr = ptr + (pos * shm->slotSize);
  -    return ((jk_shm_slot_t *) ptr);
  +    jk_shm_slot_t *slot = NULL;
  +
  +    if (!shm->image) 
  +        return NULL;
  +    if (pos >= shm->slotMaxCount)
  +        return NULL;
  +    /* Use only allocated slots */
  +    if (shm->head->slots[pos])
  +        slot = (jk_shm_slot_t *)((char *)shm->image + pos * shm->slotSize);
  +    if (slot) {
  +        env->l->jkLog(env, env->l, JK_LOG_INFO, 
  +                      "shm.getSlot() found existing slot %d %s\n",
  +                      pos * shm->slotSize,
  +                      slot->name);
  +    }
  +    return slot;
   }
   
  -jk_shm_slot_t * JK_METHOD jk2_shm_createSlot(struct jk_env *env, struct jk_shm 
*shm, 
  -                                  char *name, int size)
  +jk_shm_slot_t * JK_METHOD jk2_shm_createSlot(struct jk_env *env,
  +                                             struct jk_shm *shm, 
  +                                             char *name, int size)
   {
       /* For now all slots are equal size
        */
  -    int slotId;
       int i;
       jk_shm_slot_t *slot;
  -   
  -    if (shm->head!=NULL) { 
  -        for( i=1; i<shm->head->lastSlot; i++ ) {
  -            slot= shm->getSlot( env, shm, i );
  -            if( strncmp( slot->name, name, strlen(name) ) == 0 ) {
  +
  +    if (shm->head != NULL) { 
  +        for (i = 1; i < shm->head->lastSlot; i++) {
  +            slot = shm->getSlot(env, shm, i);
  +            if (strncmp(slot->name, name, strlen(name)) == 0) {
  +                env->l->jkLog(env, env->l, JK_LOG_INFO, 
  +                              "shm.createSlot() found existing slot %s\n",
  +                              slot->name);
                   return slot;
               }
           }
  -        /* New slot */
  -        /* XXX interprocess sync */
  -        slotId=shm->head->lastSlot++;
       }
       else {
           env->l->jkLog(env, env->l, JK_LOG_ERROR, 
                         "shm.createSlot() no shared memory head\n");
           return NULL;
       }
  -    slot=shm->getSlot( env, shm, slotId );
  -
  -    if( slot==NULL ) {
  +    /* Allocate new slot  
  +     * TODO: We need the mutex here
  +     */
  +    for (i = shm->head->lastSlot; i < shm->head->slotMaxCount; i++) {
  +        if (!shm->head->slots[i]) {
  +            slot = (jk_shm_slot_t *)((char *)shm->image + i * shm->head->slotSize);
  +            /* Mark the slot as used */
  +            shm->head->slots[i] = 1;
  +            /* Clear any garbage data */
  +            memset(slot, 0, shm->head->slotSize);
  +            ++shm->head->lastSlot;
  +            break;
  +        }
  +    }
  +    if (slot == NULL) {
           env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  -                      "shm.createSlot() getSlot() returned NULL\n");
  +            "shm.createSlot() create %d returned NULL\n",
  +            shm->slotSize);
           return NULL;
       }
       
       env->l->jkLog(env, env->l, JK_LOG_INFO, 
  -                  "shm.createSlot() Create %d %#lx %#lx\n", slotId, shm->image, 
slot );
  -    strncpy(slot->name, name, 64 );
  -    
  +                  "shm.createSlot() Created slot %d\n",
  +                  shm->head->lastSlot);
  +    strncpy(slot->name, name, 64);
  +    slot->size = size;
       return slot;
   }
   
  @@ -468,36 +289,42 @@
   {
       int i, j;
       
  -    if( shm==NULL || shm->head==NULL) {
  +    if (!shm || !shm->head) {
           return;
       }
       
  -    for( i=1; i < shm->head->lastSlot; i++ ) {
  -        jk_shm_slot_t *slot= shm->getSlot( env, shm, i );
  +    for (i = 0; i < shm->head->lastSlot; i++) {
  +        jk_shm_slot_t *slot = shm->getSlot(env, shm, i);
           
  -        if( slot==NULL ) continue;
  +        if (slot == NULL)
  +            continue;
           
  -        if( strncmp( slot->name, "epStat", 6 ) == 0 ) {
  +        if (strncmp(slot->name, "epStat", 6) == 0) {
               /* This is an endpoint slot */
  -            void *data=slot->data;
  +            void *data = slot->data;
   
  -            for( j=0; j<slot->structCnt ; j++ ) {
  -                jk_stat_t *statArray=(jk_stat_t *)data;
  -                jk_stat_t *stat=statArray + j;
  -
  -                stat->reqCnt=0;
  -                stat->errCnt=0;
  -                stat->totalTime=0;
  -                stat->maxTime=0;
  +            for (j = 0; j < slot->structCnt; j++) {
  +                jk_stat_t *statArray = (jk_stat_t *)data;
  +                jk_stat_t *stat = statArray + j;
  +
  +                stat->reqCnt = 0;
  +                stat->errCnt = 0;
  +                stat->totalTime = 0;
  +                stat->maxTime = 0;
               }
           }
       }    
   }
   
   
  -static char *jk2_shm_setAttributeInfo[]={"resetEndpointStats", "file", "size", NULL 
};
  +static char *jk2_shm_setAttributeInfo[] = {"resetEndpointStats",
  +                                           "file", "size",
  +                                           "slots", "memory",
  +                                           NULL};
   
  -static int JK_METHOD jk2_shm_setAttribute( jk_env_t *env, jk_bean_t *mbean, char 
*name, void *valueP ) {
  +static int JK_METHOD 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;
       
  @@ -505,6 +332,10 @@
           shm->fname=value;
       } else if( strcmp( "size", name ) == 0 ) {
           shm->size=atoi(value);
  +    } else if( strcmp( "slots", name ) == 0 ) {
  +        shm->slotMaxCount=atoi(value);
  +    } else if( strcmp( "memory", name ) == 0 ) {
  +        shm->inmem=atoi(value);
       } else if( strcmp( "resetEndpointStats", name ) == 0 ) {
           if( strcmp( value, "1" )==0 )
               jk2_shm_resetEndpointStats( env, shm );
  @@ -524,22 +355,24 @@
       
       env->l->jkLog(env, env->l, JK_LOG_INFO, 
                     "shm.writeSlot() %s %d\n", instanceName, len );
  -    if( len > shm->slotSize ) {
  +    if ((size_t)len > (shm->slotSize - sizeof(jk_shm_slot_t))) {
           env->l->jkLog(env, env->l, JK_LOG_ERROR, 
                         "shm.writeSlot() Packet too large %d %d\n",
  -                      shm->slotSize, len );
  +                      shm->slotSize - sizeof(jk_shm_slot_t),
  +                      len);
           return JK_ERR;
       }
  -    if( shm->head == NULL ) {
  +    if (shm->head == NULL) {
           env->l->jkLog(env, env->l, JK_LOG_ERROR, 
                         "shm.writeSlot() No head - shm was not initalized\n");
           return JK_ERR;
       }
  -    slot=shm->createSlot( env, shm, instanceName, 0 );
  +    
  +    slot = shm->createSlot(env, shm, instanceName, 0);
       
       /*  Copy the body in the slot */
  -    memcpy( slot->data, buf, len );
  -    slot->size=len;
  +    memcpy(slot->data, buf, len);
  +    slot->size = len;
       slot->ver++;
       /* Update the head lb version number - that would triger
          reconf on the next request */
  @@ -576,8 +409,10 @@
       }
       case SHM_DUMP: {
           char *name=msg->getString( env, msg );
  -
  +#if 0
  +        /* XXX do we realy need that */
           jk2_shm_dump( env, shm, name );
  +#endif
           return JK_OK;
       }
       }/* switch */
  @@ -595,24 +430,24 @@
       if( shm == NULL )
           return JK_ERR;
   
  -    shm->pool=pool;
  -    shm->privateData=NULL;
  +    shm->pool = pool;
  +    shm->privateData = NULL;
   
  -    shm->slotSize=DEFAULT_SLOT_SIZE;
  -    shm->slotMaxCount=DEFAULT_SLOT_COUNT;
  +    shm->slotSize = DEFAULT_SLOT_SIZE;
  +    shm->slotMaxCount = DEFAULT_SLOT_COUNT;
       
  -    result->setAttribute=jk2_shm_setAttribute;
  -    result->setAttributeInfo=jk2_shm_setAttributeInfo;
  +    result->setAttribute = jk2_shm_setAttribute;
  +    result->setAttributeInfo = jk2_shm_setAttributeInfo;
       /* result->getAttribute=jk2_shm_getAttribute; */
  -    shm->mbean=result; 
  -    result->object=shm;
  +    shm->mbean = result; 
  +    result->object = shm;
       result->invoke=jk2_shm_invoke;
  -    shm->init=jk2_shm_init;
  -    shm->destroy=jk2_shm_destroy;
  +    shm->init = jk2_shm_init;
  +    shm->destroy = jk2_shm_destroy;
       
  -    shm->getSlot=jk2_shm_getSlot;
  -    shm->createSlot=jk2_shm_createSlot;
  -    shm->reset=jk2_shm_reset;
  +    shm->getSlot = jk2_shm_getSlot;
  +    shm->createSlot = jk2_shm_createSlot;
  +    shm->reset = jk2_shm_reset;
       
       return JK_OK;
   }
  
  
  

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

Reply via email to