mirror of
https://github.com/jemalloc/jemalloc
synced 2026-06-08 15:01:07 +00:00
44db479fad
During boot, some mutexes are not initialized yet, plus there's no point taking many mutexes while everything is covered by the global init lock, so the locking assumptions in some functions (e.g. background_thread_enabled_set()) can't be enforced. Skip the lock owner check in this case.
59 lines
2.0 KiB
C
59 lines
2.0 KiB
C
#ifndef JEMALLOC_INTERNAL_BACKGROUND_THREAD_INLINES_H
|
|
#define JEMALLOC_INTERNAL_BACKGROUND_THREAD_INLINES_H
|
|
|
|
#include "jemalloc/internal/jemalloc_preamble.h"
|
|
#include "jemalloc/internal/arena_inlines_a.h"
|
|
#include "jemalloc/internal/atomic.h"
|
|
#include "jemalloc/internal/background_thread_externs.h"
|
|
|
|
JEMALLOC_ALWAYS_INLINE bool
|
|
background_thread_enabled(void) {
|
|
return atomic_load_b(&background_thread_enabled_state, ATOMIC_RELAXED);
|
|
}
|
|
|
|
JEMALLOC_ALWAYS_INLINE void
|
|
background_thread_enabled_set_impl(bool state) {
|
|
atomic_store_b(&background_thread_enabled_state, state, ATOMIC_RELAXED);
|
|
}
|
|
|
|
JEMALLOC_ALWAYS_INLINE void
|
|
background_thread_enabled_set(tsdn_t *tsdn, bool state) {
|
|
malloc_mutex_assert_owner(tsdn, &background_thread_lock);
|
|
background_thread_enabled_set_impl(state);
|
|
}
|
|
|
|
JEMALLOC_ALWAYS_INLINE background_thread_info_t *
|
|
arena_background_thread_info_get(arena_t *arena) {
|
|
unsigned arena_ind = arena_ind_get(arena);
|
|
return &background_thread_info[arena_ind % max_background_threads];
|
|
}
|
|
|
|
JEMALLOC_ALWAYS_INLINE background_thread_info_t *
|
|
background_thread_info_get(size_t ind) {
|
|
return &background_thread_info[ind % max_background_threads];
|
|
}
|
|
|
|
JEMALLOC_ALWAYS_INLINE uint64_t
|
|
background_thread_wakeup_time_get(background_thread_info_t *info) {
|
|
uint64_t next_wakeup = nstime_ns(&info->next_wakeup);
|
|
assert(atomic_load_b(&info->indefinite_sleep, ATOMIC_ACQUIRE) ==
|
|
(next_wakeup == BACKGROUND_THREAD_INDEFINITE_SLEEP));
|
|
return next_wakeup;
|
|
}
|
|
|
|
JEMALLOC_ALWAYS_INLINE void
|
|
background_thread_wakeup_time_set(tsdn_t *tsdn, background_thread_info_t *info,
|
|
uint64_t wakeup_time) {
|
|
malloc_mutex_assert_owner(tsdn, &info->mtx);
|
|
atomic_store_b(&info->indefinite_sleep,
|
|
wakeup_time == BACKGROUND_THREAD_INDEFINITE_SLEEP, ATOMIC_RELEASE);
|
|
nstime_init(&info->next_wakeup, wakeup_time);
|
|
}
|
|
|
|
JEMALLOC_ALWAYS_INLINE bool
|
|
background_thread_indefinite_sleep(background_thread_info_t *info) {
|
|
return atomic_load_b(&info->indefinite_sleep, ATOMIC_ACQUIRE);
|
|
}
|
|
|
|
#endif /* JEMALLOC_INTERNAL_BACKGROUND_THREAD_INLINES_H */
|