From f48000fcbe1009c18f1cc46e56cde2cb632071fa Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Sat, 8 Oct 2005 15:54:36 -0700 Subject: [PATCH] Yank writing-back support from gitfakemmap. We do not write through our use of mmap(), so make sure callers pass MAP_PRIVATE and remove support for writing changes back. Signed-off-by: Junio C Hamano --- compat/mmap.c | 163 ++++++++++++++++++---------------------------------------- 1 file changed, 50 insertions(+), 113 deletions(-) rewrite compat/mmap.c (68%) diff --git a/compat/mmap.c b/compat/mmap.c dissimilarity index 68% index fca6321ce0..a051c4767d 100644 --- a/compat/mmap.c +++ b/compat/mmap.c @@ -1,113 +1,50 @@ -#include -#include -#include -#include -#include "../cache.h" - -typedef struct fakemmapwritable { - void *start; - size_t length; - int fd; - off_t offset; - struct fakemmapwritable *next; -} fakemmapwritable; - -static fakemmapwritable *writablelist = NULL; - -void *gitfakemmap(void *start, size_t length, int prot , int flags, int fd, off_t offset) -{ - int n = 0; - - if(start != NULL) - die("Invalid usage of gitfakemmap."); - - if(lseek(fd, offset, SEEK_SET)<0) { - errno = EINVAL; - return MAP_FAILED; - } - - start = xmalloc(length); - if(start == NULL) { - errno = ENOMEM; - return MAP_FAILED; - } - - while(n < length) { - int count = read(fd, start+n, length-n); - - if(count == 0) { - memset(start+n, 0, length-n); - break; - } - - if(count < 0) { - free(start); - errno = EACCES; - return MAP_FAILED; - } - - n += count; - } - - if(prot & PROT_WRITE) { - fakemmapwritable *next = xmalloc(sizeof(fakemmapwritable)); - next->start = start; - next->length = length; - next->fd = dup(fd); - next->offset = offset; - next->next = writablelist; - writablelist = next; - } - - return start; -} - -int gitfakemunmap(void *start, size_t length) -{ - fakemmapwritable *writable = writablelist, *before = NULL; - - while(writable && (writable->start > start + length - || writable->start + writable->length < start)) { - before = writable; - writable = writable->next; - } - - if(writable) { - /* need to write back the contents */ - int n = 0; - - if(writable->start != start || writable->length != length) - die("fakemmap does not support partial write back."); - - if(lseek(writable->fd, writable->offset, SEEK_SET) < 0) { - free(start); - errno = EBADF; - return -1; - } - - while(n < length) { - int count = write(writable->fd, start + n, length - n); - - if(count < 0) { - errno = EINVAL; - return -1; - } - - n += count; - } - - close(writable->fd); - - if(before) - before->next = writable->next; - else - writablelist = writable->next; - - free(writable); - } - - free(start); - - return 0; -} - +#include +#include +#include +#include +#include "../cache.h" + +void *gitfakemmap(void *start, size_t length, int prot , int flags, int fd, off_t offset) +{ + int n = 0; + + if (start != NULL || !(flags & MAP_PRIVATE)) + die("Invalid usage of gitfakemmap."); + + if (lseek(fd, offset, SEEK_SET) < 0) { + errno = EINVAL; + return MAP_FAILED; + } + + start = xmalloc(length); + if (start == NULL) { + errno = ENOMEM; + return MAP_FAILED; + } + + while (n < length) { + int count = read(fd, start+n, length-n); + + if (count == 0) { + memset(start+n, 0, length-n); + break; + } + + if (count < 0) { + free(start); + errno = EACCES; + return MAP_FAILED; + } + + n += count; + } + + return start; +} + +int gitfakemunmap(void *start, size_t length) +{ + free(start); + return 0; +} + -- 2.11.4.GIT