dreid       99/11/04 04:33:43

  Modified:    src/lib/apr/include apr_mmap.h
               src/lib/apr/mmap/beos common.c mmap.c mmap_h.h
               src/lib/apr/mmap/unix common.c mmap.c mmap_h.h
  Log:
  This adds a new mmap function for both BeOS and unix.
  
  Also a couple of small corrections to previous code.
  
  Revision  Changes    Path
  1.3       +2 -0      apache-2.0/src/lib/apr/include/apr_mmap.h
  
  Index: apr_mmap.h
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/include/apr_mmap.h,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- apr_mmap.h        1999/11/03 12:33:32     1.2
  +++ apr_mmap.h        1999/11/04 12:33:39     1.3
  @@ -73,6 +73,8 @@
   /* creation */
   ap_status_t ap_mmap_create(ap_mmap_t ** newmmap, const char *fname, 
ap_context_t *cntxt);
   ap_status_t ap_mmap_open_create(ap_mmap_t **newmmap, ap_file_t *file, 
ap_context_t *cntxt);
  +ap_status_t ap_mmap_size_create(ap_mmap_t **newmmap, ap_file_t *file, 
ap_size_t size,
  +                                ap_context_t *cntxt);
   
   /* destruction */
   ap_status_t ap_mmap_delete(ap_mmap_t *mmap);
  
  
  
  1.2       +0 -1      apache-2.0/src/lib/apr/mmap/beos/common.c
  
  Index: common.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/mmap/beos/common.c,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- common.c  1999/11/03 12:30:55     1.1
  +++ common.c  1999/11/04 12:33:40     1.2
  @@ -1,3 +1,2 @@
   #include "../unix/common.c"
   
  -
  
  
  
  1.4       +45 -2     apache-2.0/src/lib/apr/mmap/beos/mmap.c
  
  Index: mmap.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/mmap/beos/mmap.c,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- mmap.c    1999/11/03 12:30:55     1.3
  +++ mmap.c    1999/11/04 12:33:40     1.4
  @@ -123,7 +123,8 @@
       (*new)->size = st.st_size;
       (*new)->area = aid;
       (*new)->cntxt = cont;
  -           
  +    (*new)->statted = 1;
  +               
       /* register the cleanup... */ 
       ap_register_cleanup((*new)->cntxt, (void*)(*new), mmap_cleanup,
                ap_null_cleanup);
  @@ -145,7 +146,7 @@
       if (file->filedes == -1)
           /* there isn't a file handle so how can we mmap?? */
           return APR_EBADF;
  -    (*new) = (struct mmap_t*)ap_palloc(file->cntxt, sizeof(struct mmap_t));
  +    (*new) = (struct mmap_t*)ap_palloc(cont, sizeof(struct mmap_t));
       
       if (!file->stated) {
           /* hmmmm... we need to stat the file now */
  @@ -180,6 +181,48 @@
       (*new)->size = file->size;
       (*new)->area = aid;
       (*new)->cntxt = cont;
  +    (*new)->statted = 1;
  +    
  +    /* register the cleanup... */ 
  +    ap_register_cleanup((*new)->cntxt, (void*)(*new), mmap_cleanup,
  +             ap_null_cleanup);
  +
  +    return APR_SUCCESS;
  +}
  +
  +ap_status_t ap_mmap_size_create(ap_mmap_t **new, ap_file_t *file, ap_size_t 
mmapsize,
  +                                ap_context_t *cont)
  +{
  +    char *mm;
  +    area_id aid = -1;
  +    char *areaname = "apr_mmap\0";
  +    uint32 size;           
  +    
  +    if (file->buffered)
  +        return APR_EBADF;
  +    if (file->filedes == -1)
  +        return APR_EBADF;
  +    (*new) = (struct mmap_t*)ap_palloc(cont, sizeof(struct mmap_t));
  +      
  +    size = ((mmapsize -1) / B_PAGE_SIZE) + 1;
  +
  +    aid = create_area(areaname, (void*)&mm, B_ANY_ADDRESS, size * 
B_PAGE_SIZE, 
  +        B_FULL_LOCK, B_READ_AREA|B_WRITE_AREA);
  +    free(areaname);
  +    
  +    if (aid < B_OK) {
  +        /* we failed to get an mmap'd file... */
  +        return APR_ENOMEM;
  +    }  
  +    if (aid >= B_OK)
  +        read(file->filedes, mm, mmapsize);    
  +
  +    (*new)->filename = ap_pstrdup(cont, file->fname);
  +    (*new)->mm = mm;
  +    (*new)->size = mmapsize;
  +    (*new)->area = aid;
  +    (*new)->cntxt = cont;
  +    (*new)->statted = 0;
   
       /* register the cleanup... */ 
       ap_register_cleanup((*new)->cntxt, (void*)(*new), mmap_cleanup,
  
  
  
  1.2       +1 -0      apache-2.0/src/lib/apr/mmap/beos/mmap_h.h
  
  Index: mmap_h.h
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/mmap/beos/mmap_h.h,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- mmap_h.h  1999/10/20 20:22:03     1.1
  +++ mmap_h.h  1999/11/04 12:33:40     1.2
  @@ -69,6 +69,7 @@
       area_id area;
       void *mm;
       size_t size;
  +    ap_int32_t statted;
   };
   
   ap_status_t mmap_cleanup(void *);
  
  
  
  1.2       +5 -1      apache-2.0/src/lib/apr/mmap/unix/common.c
  
  Index: common.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/mmap/unix/common.c,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- common.c  1999/11/03 12:30:59     1.1
  +++ common.c  1999/11/04 12:33:41     1.2
  @@ -88,6 +88,11 @@
       const ap_mmap_t *b = *(ap_mmap_t **)m2;
       ap_int32_t c;
   
  +    if (a->statted == 0 || b->statted == 0) {
  +        /* we can't do this as we have no stat info... */
  +        /* what do we return??? */
  +        return (-1);
  +    }
       c = a->sinfo.st_ino - b->sinfo.st_ino;
       if (c == 0) {
            return a->sinfo.st_dev - b->sinfo.st_dev;
  @@ -111,7 +116,6 @@
           return APR_EINVAL;
       
       (*addr) = mmap->mm + offset;
  -    fprintf(stderr,"ap_mmap_offset (%p, %d) ==> %p\n",mmap->mm, offset, 
(*addr));
       return APR_SUCCESS;
   }
   
  
  
  
  1.5       +28 -1     apache-2.0/src/lib/apr/mmap/unix/mmap.c
  
  Index: mmap.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/mmap/unix/mmap.c,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- mmap.c    1999/11/03 12:30:59     1.4
  +++ mmap.c    1999/11/04 12:33:42     1.5
  @@ -129,7 +129,7 @@
       if (file->filedes == -1)
           /* there isn't a file handle so how can we mmap?? */
           return APR_EBADF;
  -    (*new) = (struct mmap_t*)ap_palloc(file->cntxt, sizeof(struct mmap_t));
  +    (*new) = (struct mmap_t*)ap_palloc(cont, sizeof(struct mmap_t));
       
       if (!file->stated) {
           /* hmmmm... we need to stat the file now */
  @@ -163,6 +163,33 @@
       return APR_SUCCESS;
   }
   
  +ap_status_t ap_mmap_size_create(ap_mmap_t **new, ap_file_t *file, ap_size_t 
mmapsize,
  +                                ap_context_t *cont)
  +{
  +    caddr_t mm;
  +
  +    if (file->buffered)
  +        return APR_EBADF;
  +    if (file->filedes == -1)
  +        return APR_EBADF;
  +
  +    (*new) = (struct mmap_t*)ap_palloc(cont, sizeof(struct mmap_t));
  +    
  +    mm = mmap(NULL, mmapsize, PROT_READ, MAP_SHARED, file->filedes ,0);
  +    if (mm == (caddr_t)-1) {
  +        return APR_ENOMEM;
  +    }
  +
  +    (*new)->filename = ap_pstrdup(cont, file->fname);
  +    (*new)->mm = mm;
  +    (*new)->size = mmapsize;
  +    (*new)->cntxt = cont;
  +           
  +    /* register the cleanup... */
  +    ap_register_cleanup((*new)->cntxt, (void*)(*new), mmap_cleanup,
  +             ap_null_cleanup);
  +    return APR_SUCCESS;
  +}
   
   ap_status_t ap_mmap_delete(struct mmap_t *mmap)
   {
  
  
  
  1.2       +2 -1      apache-2.0/src/lib/apr/mmap/unix/mmap_h.h
  
  Index: mmap_h.h
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/mmap/unix/mmap_h.h,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- mmap_h.h  1999/10/20 20:22:05     1.1
  +++ mmap_h.h  1999/11/04 12:33:42     1.2
  @@ -67,9 +67,10 @@
       struct stat sinfo;
       void *mm;
       size_t size;
  +    ap_int32_t statted;
   };
   
   ap_status_t mmap_cleanup(void *);
   
  -#endif  /* ! FILE_IO_H */
  +#endif  /* ! MMAP_H_H */
   
  
  
  

Reply via email to