1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
From ca1dee24586c07e78459e4170225142cde9ba7f0 Mon Sep 17 00:00:00 2001
From: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
Date: Sat, 2 Jul 2011 20:06:58 +0200
Subject: [PATCH 2/3] mmap() dst file instead of malloc() + read() it
Bug: https://bugs.debian.org/632585
This drops the memory pressure since the OS may now drop and reload parts of
the old and new file on demand.
Signed-off-by: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
---
bsdiff.c | 18 +++++++++++-------
1 file changed, 11 insertions(+), 7 deletions(-)
diff --git a/bsdiff.c b/bsdiff.c
index f25304548101..f975e3722cba 100644
--- a/bsdiff.c
+++ b/bsdiff.c
@@ -238,12 +238,16 @@ int main(int argc,char *argv[])
/* Allocate newsize+1 bytes instead of newsize bytes to ensure
that we never try to malloc(0) and get a NULL pointer */
- if(((fd=open(argv[2],O_RDONLY,0))<0) ||
- ((newsize=lseek(fd,0,SEEK_END))==-1) ||
- ((new=malloc(newsize+1))==NULL) ||
- (lseek(fd,0,SEEK_SET)!=0) ||
- (read(fd,new,newsize)!=newsize) ||
- (close(fd)==-1)) err(1,"%s",argv[2]);
+ fd = open(argv[2], O_RDONLY, 0);
+ if (fd < 0)
+ err(1, "open %s", argv[2]);
+ newsize = lseek(fd, 0, SEEK_END);
+ if (newsize == -1)
+ err(1, "lseek %s", argv[2]);
+ new = mmap(NULL, newsize, PROT_READ, MAP_SHARED | MAP_POPULATE, fd, 0);
+ if (new == MAP_FAILED)
+ err(1, "mmap %s", argv[2]);
+ close(fd);
if(((db=malloc(newsize+1))==NULL) ||
((eb=malloc(newsize+1))==NULL)) err(1,NULL);
@@ -403,7 +407,7 @@ int main(int argc,char *argv[])
free(eb);
free(I);
munmap(old, oldsize);
- free(new);
+ munmap(new, newsize);
return 0;
}
--
2.9.3
|