aboutsummaryrefslogtreecommitdiffstats
path: root/src/large.c
diff options
context:
space:
mode:
authorJason Evans <jasone@canonware.com>2017-02-12 17:43:33 -0800
committerJason Evans <jasone@canonware.com>2017-02-16 09:39:46 -0800
commit6b5cba41916549f1aa37adac45659b60293d9495 (patch)
tree8f6dd1067519492220a2a7ab5429972d2c245b37 /src/large.c
parentfa2d64c94b07ee21a0f6f44b9fe6e3bbefa51c6c (diff)
downloadplatform_external_jemalloc_new-6b5cba41916549f1aa37adac45659b60293d9495.tar.gz
platform_external_jemalloc_new-6b5cba41916549f1aa37adac45659b60293d9495.tar.bz2
platform_external_jemalloc_new-6b5cba41916549f1aa37adac45659b60293d9495.zip
Convert arena->stats synchronization to atomics.
Diffstat (limited to 'src/large.c')
-rw-r--r--src/large.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/large.c b/src/large.c
index bfe2f714..55e0737e 100644
--- a/src/large.c
+++ b/src/large.c
@@ -286,20 +286,23 @@ large_ralloc(tsdn_t *tsdn, arena_t *arena, extent_t *extent, size_t usize,
/*
* junked_locked indicates whether the extent's data have been junk-filled, and
- * whether the arena's lock is currently held. The arena's large_mtx is
- * independent of these considerations.
+ * whether the arena's large_mtx is currently held.
*/
static void
large_dalloc_prep_impl(tsdn_t *tsdn, arena_t *arena, extent_t *extent,
bool junked_locked) {
- malloc_mutex_lock(tsdn, &arena->large_mtx);
- extent_list_remove(&arena->large, extent);
- malloc_mutex_unlock(tsdn, &arena->large_mtx);
+
if (!junked_locked) {
+ malloc_mutex_lock(tsdn, &arena->large_mtx);
+ extent_list_remove(&arena->large, extent);
+ malloc_mutex_unlock(tsdn, &arena->large_mtx);
large_dalloc_maybe_junk(extent_addr_get(extent),
extent_usize_get(extent));
+ } else {
+ malloc_mutex_assert_owner(tsdn, &arena->large_mtx);
+ extent_list_remove(&arena->large, extent);
}
- arena_extent_dalloc_large_prep(tsdn, arena, extent, junked_locked);
+ arena_extent_dalloc_large_prep(tsdn, arena, extent);
}
static void