diff options
Diffstat (limited to 'source3/lib/tallocmsg.c')
-rw-r--r-- | source3/lib/tallocmsg.c | 49 |
1 files changed, 44 insertions, 5 deletions
diff --git a/source3/lib/tallocmsg.c b/source3/lib/tallocmsg.c index e4364f1ff7..599d60737d 100644 --- a/source3/lib/tallocmsg.c +++ b/source3/lib/tallocmsg.c @@ -25,6 +25,40 @@ * Glue code between talloc profiling and the Samba messaging system. **/ +struct msg_pool_usage_state { + ssize_t len; + size_t buflen; + char *s; +}; + +static void msg_pool_usage_helper(const void *ptr, int depth, int max_depth, int is_ref, void *_s) +{ + const char *name = talloc_get_name(ptr); + struct msg_pool_usage_state *state = (struct msg_pool_usage_state *)_s; + + if (is_ref) { + sprintf_append(NULL, &state->s, &state->len, &state->buflen, + "%*sreference to: %s\n", depth*4, "", name); + return; + } + + if (depth == 0) { + sprintf_append(NULL, &state->s, &state->len, &state->buflen, + "%stalloc report on '%s' (total %6lu bytes in %3lu blocks)\n", + (max_depth < 0 ? "full " :""), name, + (unsigned long)talloc_total_size(ptr), + (unsigned long)talloc_total_blocks(ptr)); + return; + } + + sprintf_append(NULL, &state->s, &state->len, &state->buflen, + "%*s%-30s contains %6lu bytes in %3lu blocks (ref %d)\n", + depth*4, "", + name, + (unsigned long)talloc_total_size(ptr), + (unsigned long)talloc_total_blocks(ptr), + talloc_reference_count(ptr)); +} /** * Respond to a POOL_USAGE message by sending back string form of memory @@ -33,21 +67,26 @@ void msg_pool_usage(int msg_type, struct process_id src_pid, void *UNUSED(buf), size_t UNUSED(len)) { - char *reply = NULL; + struct msg_pool_usage_state state; SMB_ASSERT(msg_type == MSG_REQ_POOL_USAGE); DEBUG(2,("Got POOL_USAGE\n")); - reply = talloc_describe_all(); - if (!reply) { + state.len = 0; + state.buflen = 512; + state.s = NULL; + + talloc_report_depth_cb(NULL, 0, -1, msg_pool_usage_helper, &state); + + if (!state.s) { return; } message_send_pid(src_pid, MSG_POOL_USAGE, - reply, strlen(reply)+1, True); + state.s, strlen(state.s)+1, True); - SAFE_FREE(reply); + SAFE_FREE(state.s); } /** |