diff options
| author | Jason Evans <je@fb.com> | 2011-11-15 01:15:59 (GMT) |
|---|---|---|
| committer | Jason Evans <je@fb.com> | 2011-11-15 01:15:59 (GMT) |
| commit | fc1bb70e5f0d9a58b39efa39cc549b5af5104760 (patch) | |
| tree | 0a77b93409638147a90c2ec49fd818789a722f42 /src/huge.c | |
| parent | d1c526d53b613474975ccd0124e3150f54a991d1 (diff) | |
| parent | 196c7b7e6d567dc5a4e9a70001e52c8b970ff318 (diff) | |
| download | jemalloc-2.2.5.zip jemalloc-2.2.5.tar.gz jemalloc-2.2.5.tar.bz2 | |
Merge branch '2_2_5_bp'2.2.5
Diffstat (limited to 'src/huge.c')
| -rw-r--r-- | src/huge.c | 21 |
1 files changed, 14 insertions, 7 deletions
@@ -110,12 +110,12 @@ huge_palloc(size_t size, size_t alignment, bool zero) if (offset == 0) { /* Trim trailing space. */ chunk_dealloc((void *)((uintptr_t)ret + chunk_size), alloc_size - - chunk_size); + - chunk_size, true); } else { size_t trailsize; /* Trim leading space. */ - chunk_dealloc(ret, alignment - offset); + chunk_dealloc(ret, alignment - offset, true); ret = (void *)((uintptr_t)ret + (alignment - offset)); @@ -124,7 +124,7 @@ huge_palloc(size_t size, size_t alignment, bool zero) /* Trim trailing space. */ assert(trailsize < alloc_size); chunk_dealloc((void *)((uintptr_t)ret + chunk_size), - trailsize); + trailsize, true); } } @@ -234,6 +234,13 @@ huge_ralloc(void *ptr, size_t oldsize, size_t size, size_t extra, ) { size_t newsize = huge_salloc(ret); + /* + * Remove ptr from the tree of huge allocations before + * performing the remap operation, in order to avoid the + * possibility of another thread acquiring that mapping before + * this one removes it from the tree. + */ + huge_dalloc(ptr, false); if (mremap(ptr, oldsize, newsize, MREMAP_MAYMOVE|MREMAP_FIXED, ret) == MAP_FAILED) { /* @@ -253,9 +260,8 @@ huge_ralloc(void *ptr, size_t oldsize, size_t size, size_t extra, if (opt_abort) abort(); memcpy(ret, ptr, copysize); - idalloc(ptr); - } else - huge_dalloc(ptr, false); + chunk_dealloc_mmap(ptr, oldsize); + } } else #endif { @@ -295,9 +301,10 @@ huge_dalloc(void *ptr, bool unmap) memset(node->addr, 0x5a, node->size); #endif #endif - chunk_dealloc(node->addr, node->size); } + chunk_dealloc(node->addr, node->size, unmap); + base_node_dealloc(node); } |
