diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libc/stdlib/malloc.c | 27 |
1 files changed, 10 insertions, 17 deletions
diff --git a/src/lib/libc/stdlib/malloc.c b/src/lib/libc/stdlib/malloc.c index be80640e81..1bd5c9f89c 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.98 2008/08/25 17:56:17 otto Exp $ */ | 1 | /* $OpenBSD: malloc.c,v 1.99 2008/10/03 18:42:45 otto Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2008 Otto Moerbeek <otto@drijf.net> | 3 | * Copyright (c) 2008 Otto Moerbeek <otto@drijf.net> |
| 4 | * | 4 | * |
| @@ -402,28 +402,21 @@ unmap(struct dir_info *d, void *p, size_t sz) | |||
| 402 | rsz = malloc_cache - d->free_regions_size; | 402 | rsz = malloc_cache - d->free_regions_size; |
| 403 | if (psz > rsz) | 403 | if (psz > rsz) |
| 404 | tounmap = psz - rsz; | 404 | tounmap = psz - rsz; |
| 405 | d->free_regions_size -= tounmap; | ||
| 406 | offset = getrbyte(); | 405 | offset = getrbyte(); |
| 407 | for (i = 0; tounmap > 0 && i < malloc_cache; i++) { | 406 | for (i = 0; tounmap > 0 && i < malloc_cache; i++) { |
| 408 | r = &d->free_regions[(i + offset) & (malloc_cache - 1)]; | 407 | r = &d->free_regions[(i + offset) & (malloc_cache - 1)]; |
| 409 | if (r->p != NULL) { | 408 | if (r->p != NULL) { |
| 410 | if (r->size <= tounmap) { | 409 | rsz = r->size << MALLOC_PAGESHIFT; |
| 411 | rsz = r->size << MALLOC_PAGESHIFT; | 410 | if (munmap(r->p, rsz)) |
| 412 | if (munmap(r->p, rsz)) | 411 | wrterror("munmap"); |
| 413 | wrterror("munmap"); | 412 | r->p = NULL; |
| 413 | if (tounmap > r->size) | ||
| 414 | tounmap -= r->size; | 414 | tounmap -= r->size; |
| 415 | r->p = NULL; | 415 | else |
| 416 | r->size = 0; | ||
| 417 | malloc_used -= rsz; | ||
| 418 | } else { | ||
| 419 | rsz = tounmap << MALLOC_PAGESHIFT; | ||
| 420 | if (munmap((char *)r->p + ((r->size - tounmap) | ||
| 421 | << MALLOC_PAGESHIFT), rsz)) | ||
| 422 | wrterror("munmap"); | ||
| 423 | r->size -= tounmap ; | ||
| 424 | tounmap = 0; | 416 | tounmap = 0; |
| 425 | malloc_used -= rsz; | 417 | d->free_regions_size -= r->size; |
| 426 | } | 418 | r->size = 0; |
| 419 | malloc_used -= rsz; | ||
| 427 | } | 420 | } |
| 428 | } | 421 | } |
| 429 | if (tounmap > 0) | 422 | if (tounmap > 0) |
