mturk       2005/02/06 03:20:49

  Modified:    jk/native/common jk_shm.c
  Log:
  Use plain memory if shmem filename was not defined.
  This enable transparent API, regardles of shm type and JkShmFile.
  
  Revision  Changes    Path
  1.4       +37 -15    jakarta-tomcat-connectors/jk/native/common/jk_shm.c
  
  Index: jk_shm.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_shm.c,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- jk_shm.c  6 Feb 2005 10:35:55 -0000       1.3
  +++ jk_shm.c  6 Feb 2005 11:20:49 -0000       1.4
  @@ -85,8 +85,6 @@
       }
   }
   
  -
  -
   #else
   
   #include <unistd.h>
  @@ -110,48 +108,68 @@
       int fd;
       int flags = O_RDWR;
   
  -    if (!attached)
  -        flags |= (O_CREAT|O_TRUNC);
  -    fd = open(fname, flags, 0666);
  -    if (fd == -1)
  -        return -1;
  +    shm->size = 0;
  +    shm->base = NULL;
   
       if (workers < 1 || workers > JK_SHM_MAX_WORKERS)
           workers = JK_SHM_MAX_WORKERS;
       if (dynamic < 1 || dynamic > JK_SHM_MAX_WORKERS)
           dynamic = JK_SHM_MAX_WORKERS;
   
  +    shm->filename = fname;
  +    shm->attached = attached;
       shm->size = sizeof(jk_shm_h_rec_t) + (workers + dynamic) * 
sizeof(jk_shm_w_rec_t);
   
  +    /* Use plain memory in case there is no file name */
  +    if (!fname) {
  +        shm->base = calloc(1, shm->size);
  +        if (!shm->base)
  +            return -1;
  +        hdr = (jk_shm_h_rec_t *)shm->base;
  +
  +        memcpy(hdr->magic, shm_signature, 8);
  +        hdr->workers = workers;
  +        hdr->dynamic = dynamic;
  +        return 0;
  +    }
  +    if (!attached)
  +        flags |= (O_CREAT|O_TRUNC);
  +    fd = open(fname, flags, 0666);
  +    if (fd == -1) {
  +        shm->size = 0;
  +        return -1;
  +    }
  +
       if (!attached) {
           size_t size = lseek(fd, 0, SEEK_END);
           if (size < shm->size) {
               size = shm->size;
               if (ftruncate(fd, shm->size)) {
                   close(fd);
  +                shm->size = 0;
                   return -1;
               }
           }
       }
       if (lseek(fd, 0, SEEK_SET) != 0) {
           close(fd);
  +        shm->size = 0;
           return -1;
       }
   
       shm->base = mmap(NULL, shm->size,
  -                    PROT_READ | PROT_WRITE,
  -                    MAP_FILE | MAP_SHARED,
  -                    fd, 0);
  +                     PROT_READ | PROT_WRITE,
  +                     MAP_FILE | MAP_SHARED,
  +                     fd, 0);
       if (shm->base == (void *)MAP_FAILED) {
           shm->base = NULL;
       }
       if (!shm->base) {
           close(fd);
  +        shm->size = 0;
           return -1;
       }
  -    shm->filename = fname;
       shm->fd = fd;
  -    shm->attached = attached;
   
       /* Clear shared memory */
       if (!attached) {
  @@ -185,8 +203,12 @@
   {
       if (shm) {
           if (shm->base) {
  -            munmap(shm->base, shm->size);
  -            close(shm->fd);
  +            if (shm->fd >= 0) {
  +                munmap(shm->base, shm->size);
  +                close(shm->fd);
  +            }
  +            else
  +                free(shm->base);
           }
           shm->base = NULL;
           shm->fd = -1;
  
  
  

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

Reply via email to