diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libc/stdlib/malloc.c | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/src/lib/libc/stdlib/malloc.c b/src/lib/libc/stdlib/malloc.c index a800ea17be..165ad70031 100644 --- a/src/lib/libc/stdlib/malloc.c +++ b/src/lib/libc/stdlib/malloc.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: malloc.c,v 1.170 2014/07/09 19:11:00 tedu Exp $ */ | 1 | /* $OpenBSD: malloc.c,v 1.171 2014/08/18 14:34:58 tedu Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2008, 2010, 2011 Otto Moerbeek <otto@drijf.net> | 3 | * Copyright (c) 2008, 2010, 2011 Otto Moerbeek <otto@drijf.net> |
4 | * Copyright (c) 2012 Matthew Dempsky <matthew@openbsd.org> | 4 | * Copyright (c) 2012 Matthew Dempsky <matthew@openbsd.org> |
@@ -93,6 +93,15 @@ | |||
93 | #define MQUERY(a, sz) mquery((a), (size_t)(sz), PROT_READ | PROT_WRITE, \ | 93 | #define MQUERY(a, sz) mquery((a), (size_t)(sz), PROT_READ | PROT_WRITE, \ |
94 | MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, (off_t)0) | 94 | MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, (off_t)0) |
95 | 95 | ||
96 | #define KERNENTER() if (__isthreaded) do { \ | ||
97 | malloc_active--; \ | ||
98 | _MALLOC_UNLOCK(); \ | ||
99 | } while (0) | ||
100 | #define KERNEXIT() if (__isthreaded) do { \ | ||
101 | _MALLOC_LOCK(); \ | ||
102 | malloc_active++; \ | ||
103 | } while (0) | ||
104 | |||
96 | struct region_info { | 105 | struct region_info { |
97 | void *p; /* page; low bits used to mark chunks */ | 106 | void *p; /* page; low bits used to mark chunks */ |
98 | uintptr_t size; /* size for pages, or chunk_info pointer */ | 107 | uintptr_t size; /* size for pages, or chunk_info pointer */ |
@@ -312,7 +321,8 @@ unmap(struct dir_info *d, void *p, size_t sz) | |||
312 | } | 321 | } |
313 | 322 | ||
314 | if (psz > mopts.malloc_cache) { | 323 | if (psz > mopts.malloc_cache) { |
315 | if (munmap(p, sz)) | 324 | i = munmap(p, sz); |
325 | if (i) | ||
316 | wrterror("munmap", p); | 326 | wrterror("munmap", p); |
317 | STATS_SUB(d->malloc_used, sz); | 327 | STATS_SUB(d->malloc_used, sz); |
318 | return; | 328 | return; |
@@ -396,7 +406,9 @@ map(struct dir_info *d, size_t sz, int zero_fill) | |||
396 | return MAP_FAILED; | 406 | return MAP_FAILED; |
397 | } | 407 | } |
398 | if (psz > d->free_regions_size) { | 408 | if (psz > d->free_regions_size) { |
409 | KERNENTER(); | ||
399 | p = MMAP(sz); | 410 | p = MMAP(sz); |
411 | KERNEXIT(); | ||
400 | if (p != MAP_FAILED) | 412 | if (p != MAP_FAILED) |
401 | STATS_ADD(d->malloc_used, sz); | 413 | STATS_ADD(d->malloc_used, sz); |
402 | /* zero fill not needed */ | 414 | /* zero fill not needed */ |
@@ -408,13 +420,13 @@ map(struct dir_info *d, size_t sz, int zero_fill) | |||
408 | if (r->p != NULL) { | 420 | if (r->p != NULL) { |
409 | if (r->size == psz) { | 421 | if (r->size == psz) { |
410 | p = r->p; | 422 | p = r->p; |
423 | r->p = NULL; | ||
424 | r->size = 0; | ||
425 | d->free_regions_size -= psz; | ||
411 | if (mopts.malloc_freeunmap) | 426 | if (mopts.malloc_freeunmap) |
412 | mprotect(p, sz, PROT_READ | PROT_WRITE); | 427 | mprotect(p, sz, PROT_READ | PROT_WRITE); |
413 | if (mopts.malloc_hint) | 428 | if (mopts.malloc_hint) |
414 | madvise(p, sz, MADV_NORMAL); | 429 | madvise(p, sz, MADV_NORMAL); |
415 | r->p = NULL; | ||
416 | r->size = 0; | ||
417 | d->free_regions_size -= psz; | ||
418 | if (zero_fill) | 430 | if (zero_fill) |
419 | memset(p, 0, sz); | 431 | memset(p, 0, sz); |
420 | else if (mopts.malloc_junk == 2 && | 432 | else if (mopts.malloc_junk == 2 && |
@@ -440,11 +452,13 @@ map(struct dir_info *d, size_t sz, int zero_fill) | |||
440 | memset(p, SOME_FREEJUNK, sz); | 452 | memset(p, SOME_FREEJUNK, sz); |
441 | return p; | 453 | return p; |
442 | } | 454 | } |
455 | if (d->free_regions_size > mopts.malloc_cache) | ||
456 | wrterror("malloc cache", NULL); | ||
457 | KERNENTER(); | ||
443 | p = MMAP(sz); | 458 | p = MMAP(sz); |
459 | KERNEXIT(); | ||
444 | if (p != MAP_FAILED) | 460 | if (p != MAP_FAILED) |
445 | STATS_ADD(d->malloc_used, sz); | 461 | STATS_ADD(d->malloc_used, sz); |
446 | if (d->free_regions_size > mopts.malloc_cache) | ||
447 | wrterror("malloc cache", NULL); | ||
448 | /* zero fill not needed */ | 462 | /* zero fill not needed */ |
449 | return p; | 463 | return p; |
450 | } | 464 | } |