mirror of
https://github.com/jemalloc/jemalloc.git
synced 2026-07-23 13:13:06 +00:00
Add experimental.thread.activity_callback.
This (experimental, undocumented) functionality can be used by users to track various statistics of interest at a finer level of granularity than the thread.
This commit is contained in:
committed by
David Goldblatt
parent
27ef02ca9a
commit
1b3ee75667
35
src/ctl.c
35
src/ctl.c
@@ -264,6 +264,7 @@ CTL_PROTO(stats_retained)
|
||||
CTL_PROTO(stats_zero_reallocs)
|
||||
CTL_PROTO(experimental_hooks_install)
|
||||
CTL_PROTO(experimental_hooks_remove)
|
||||
CTL_PROTO(experimental_thread_activity_callback)
|
||||
CTL_PROTO(experimental_utilization_query)
|
||||
CTL_PROTO(experimental_utilization_batch_query)
|
||||
CTL_PROTO(experimental_arenas_i_pactivep)
|
||||
@@ -712,6 +713,11 @@ static const ctl_named_node_t experimental_hooks_node[] = {
|
||||
{NAME("remove"), CTL(experimental_hooks_remove)}
|
||||
};
|
||||
|
||||
static const ctl_named_node_t experimental_thread_node[] = {
|
||||
{NAME("activity_callback"),
|
||||
CTL(experimental_thread_activity_callback)}
|
||||
};
|
||||
|
||||
static const ctl_named_node_t experimental_utilization_node[] = {
|
||||
{NAME("query"), CTL(experimental_utilization_query)},
|
||||
{NAME("batch_query"), CTL(experimental_utilization_batch_query)}
|
||||
@@ -738,7 +744,8 @@ static const ctl_named_node_t experimental_node[] = {
|
||||
{NAME("utilization"), CHILD(named, experimental_utilization)},
|
||||
{NAME("arenas"), CHILD(indexed, experimental_arenas)},
|
||||
{NAME("prof_recent"), CHILD(named, experimental_prof_recent)},
|
||||
{NAME("batch_alloc"), CTL(experimental_batch_alloc)}
|
||||
{NAME("batch_alloc"), CTL(experimental_batch_alloc)},
|
||||
{NAME("thread"), CHILD(named, experimental_thread)}
|
||||
};
|
||||
|
||||
static const ctl_named_node_t root_node[] = {
|
||||
@@ -3428,6 +3435,32 @@ label_return:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
experimental_thread_activity_callback_ctl(tsd_t *tsd, const size_t *mib,
|
||||
size_t miblen, void *oldp, size_t *oldlenp, void *newp, size_t newlen) {
|
||||
int ret;
|
||||
|
||||
if (!config_stats) {
|
||||
return ENOENT;
|
||||
}
|
||||
|
||||
activity_callback_thunk_t t_old = tsd_activity_callback_thunk_get(tsd);
|
||||
READ(t_old, activity_callback_thunk_t);
|
||||
|
||||
if (newp != NULL) {
|
||||
/*
|
||||
* This initialization is unnecessary. If it's omitted, though,
|
||||
* clang gets confused and warns on the subsequent use of t_new.
|
||||
*/
|
||||
activity_callback_thunk_t t_new = {NULL, NULL};
|
||||
WRITE(t_new, activity_callback_thunk_t);
|
||||
tsd_activity_callback_thunk_set(tsd, t_new);
|
||||
}
|
||||
ret = 0;
|
||||
label_return:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Output six memory utilization entries for an input pointer, the first one of
|
||||
* type (void *) and the remaining five of type size_t, describing the following
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
#include "jemalloc/internal/jemalloc_preamble.h"
|
||||
#include "jemalloc/internal/jemalloc_internal_includes.h"
|
||||
|
||||
#include "jemalloc/internal/peak.h"
|
||||
#include "jemalloc/internal/peak_event.h"
|
||||
|
||||
#include "jemalloc/internal/activity_callback.h"
|
||||
#include "jemalloc/internal/peak.h"
|
||||
|
||||
/*
|
||||
* Update every 64K by default. We're not exposing this as a configuration
|
||||
* option for now; we don't want to bind ourselves too tightly to any particular
|
||||
@@ -21,6 +23,17 @@ peak_event_update(tsd_t *tsd) {
|
||||
peak_update(peak, alloc, dalloc);
|
||||
}
|
||||
|
||||
static void
|
||||
peak_event_activity_callback(tsd_t *tsd) {
|
||||
activity_callback_thunk_t *thunk = tsd_activity_callback_thunkp_get(
|
||||
tsd);
|
||||
uint64_t alloc = tsd_thread_allocated_get(tsd);
|
||||
uint64_t dalloc = tsd_thread_deallocated_get(tsd);
|
||||
if (thunk->callback != NULL) {
|
||||
thunk->callback(thunk->uctx, alloc, dalloc);
|
||||
}
|
||||
}
|
||||
|
||||
/* Set current state to zero. */
|
||||
void
|
||||
peak_event_zero(tsd_t *tsd) {
|
||||
@@ -49,6 +62,7 @@ peak_alloc_postponed_event_wait(tsd_t *tsd) {
|
||||
void
|
||||
peak_alloc_event_handler(tsd_t *tsd, uint64_t elapsed) {
|
||||
peak_event_update(tsd);
|
||||
peak_event_activity_callback(tsd);
|
||||
}
|
||||
|
||||
uint64_t
|
||||
@@ -64,4 +78,5 @@ peak_dalloc_postponed_event_wait(tsd_t *tsd) {
|
||||
void
|
||||
peak_dalloc_event_handler(tsd_t *tsd, uint64_t elapsed) {
|
||||
peak_event_update(tsd);
|
||||
peak_event_activity_callback(tsd);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user