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 */