summaryrefslogtreecommitdiffstats
path: root/include/jemalloc
diff options
context:
space:
mode:
authorQi Wang <interwq@gwu.edu>2017-04-21 22:05:43 (GMT)
committerQi Wang <interwq@gmail.com>2017-04-24 20:23:55 (GMT)
commitf970c497dc5ab2b885d266d59948510c430f8ec1 (patch)
tree93e071eb0f6e9ae372b5e5615c20f55229dd6984 /include/jemalloc
parentaf76f0e5d28cd6f0ce8e6c8c6a2a78ba4089868a (diff)
downloadjemalloc-f970c497dc5ab2b885d266d59948510c430f8ec1.zip
jemalloc-f970c497dc5ab2b885d266d59948510c430f8ec1.tar.gz
jemalloc-f970c497dc5ab2b885d266d59948510c430f8ec1.tar.bz2
Implement malloc_mutex_trylock() w/ proper stats update.
Diffstat (limited to 'include/jemalloc')
-rw-r--r--include/jemalloc/internal/mutex_inlines.h42
-rw-r--r--include/jemalloc/internal/private_symbols.txt4
2 files changed, 34 insertions, 12 deletions
diff --git a/include/jemalloc/internal/mutex_inlines.h b/include/jemalloc/internal/mutex_inlines.h
index 2856d84..6da21cf 100644
--- a/include/jemalloc/internal/mutex_inlines.h
+++ b/include/jemalloc/internal/mutex_inlines.h
@@ -10,12 +10,38 @@ malloc_mutex_lock_final(malloc_mutex_t *mutex) {
MALLOC_MUTEX_LOCK(mutex);
}
-/* Trylock: return false if the lock is successfully acquired. */
static inline bool
-malloc_mutex_trylock(malloc_mutex_t *mutex) {
+malloc_mutex_trylock_final(malloc_mutex_t *mutex) {
return MALLOC_MUTEX_TRYLOCK(mutex);
}
+static inline void
+mutex_owner_stats_update(tsdn_t *tsdn, malloc_mutex_t *mutex) {
+ if (config_stats) {
+ mutex_prof_data_t *data = &mutex->prof_data;
+ data->n_lock_ops++;
+ if (data->prev_owner != tsdn) {
+ data->prev_owner = tsdn;
+ data->n_owner_switches++;
+ }
+ }
+}
+
+/* Trylock: return false if the lock is successfully acquired. */
+static inline bool
+malloc_mutex_trylock(tsdn_t *tsdn, malloc_mutex_t *mutex) {
+ witness_assert_not_owner(tsdn, &mutex->witness);
+ if (isthreaded) {
+ if (malloc_mutex_trylock_final(mutex)) {
+ return true;
+ }
+ mutex_owner_stats_update(tsdn, mutex);
+ }
+ witness_lock(tsdn, &mutex->witness);
+
+ return false;
+}
+
/* Aggregate lock prof data. */
static inline void
malloc_mutex_prof_merge(mutex_prof_data_t *sum, mutex_prof_data_t *data) {
@@ -44,18 +70,10 @@ static inline void
malloc_mutex_lock(tsdn_t *tsdn, malloc_mutex_t *mutex) {
witness_assert_not_owner(tsdn, &mutex->witness);
if (isthreaded) {
- if (malloc_mutex_trylock(mutex)) {
+ if (malloc_mutex_trylock_final(mutex)) {
malloc_mutex_lock_slow(mutex);
}
- /* We own the lock now. Update a few counters. */
- if (config_stats) {
- mutex_prof_data_t *data = &mutex->prof_data;
- data->n_lock_ops++;
- if (data->prev_owner != tsdn) {
- data->prev_owner = tsdn;
- data->n_owner_switches++;
- }
- }
+ mutex_owner_stats_update(tsdn, mutex);
}
witness_lock(tsdn, &mutex->witness);
}
diff --git a/include/jemalloc/internal/private_symbols.txt b/include/jemalloc/internal/private_symbols.txt
index 649a689..5059095 100644
--- a/include/jemalloc/internal/private_symbols.txt
+++ b/include/jemalloc/internal/private_symbols.txt
@@ -292,10 +292,13 @@ malloc_mutex_assert_owner
malloc_mutex_boot
malloc_mutex_init
malloc_mutex_lock
+malloc_mutex_lock_final
malloc_mutex_lock_slow
malloc_mutex_postfork_child
malloc_mutex_postfork_parent
malloc_mutex_prefork
+malloc_mutex_trylock
+malloc_mutex_trylock_final
malloc_mutex_unlock
malloc_printf
malloc_slow
@@ -309,6 +312,7 @@ malloc_tsd_malloc
malloc_vcprintf
malloc_vsnprintf
malloc_write
+mutex_owner_stats_update
narenas_auto
narenas_total_get
ncpus