|
Message-ID: <20111116004536.GV24939@port70.net> Date: Wed, 16 Nov 2011 01:45:37 +0100 From: Szabolcs Nagy <nsz@...t70.net> To: musl@...ts.openwall.com Subject: unneeded mremap calls in realloc as discussed on irc, in realloc there is a mremap where newlen is pagesize adjusted but oldlen is not so oldlen==newlen almost always fails run this simple test case with strace to see the issue: #include <stdlib.h> int main(){ char *p = 0; int n; for (n = 0; n < 500000; n++) p = realloc(p, n); free(p); return 0; } the fix that significantly speeds up the above code: (there might be better fix, eg why oldlen is not a multiple of pagesize in the first place?) diff --git a/src/malloc/malloc.c b/src/malloc/malloc.c index abf3e8f..8e9b022 100644 --- a/src/malloc/malloc.c +++ b/src/malloc/malloc.c @@ -401,7 +401,7 @@ void *realloc(void *p, size_t n) return new; } newlen = (newlen + PAGE_SIZE-1) & -PAGE_SIZE; - if (oldlen == newlen) return p; + if (((oldlen + PAGE_SIZE-1) & -PAGE_SIZE) == newlen) return p; base = __mremap(base, oldlen, newlen, MREMAP_MAYMOVE); if (base == (void *)-1) return newlen < oldlen ? p : 0;
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.