mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2025-12-31 20:36:25 +00:00
Make the events more compact by packing type and pid into one uint32_t.
This commit is contained in:
60
tracker.c
60
tracker.c
@ -36,28 +36,24 @@ typedef enum
|
|||||||
|
|
||||||
struct new_process_t
|
struct new_process_t
|
||||||
{
|
{
|
||||||
event_type_t type;
|
uint32_t header;
|
||||||
int32_t pid;
|
|
||||||
char command_line[256];
|
char command_line[256];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct fork_t
|
struct fork_t
|
||||||
{
|
{
|
||||||
event_type_t type;
|
uint32_t header;
|
||||||
int32_t pid;
|
|
||||||
int32_t child_pid;
|
int32_t child_pid;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct exit_t
|
struct exit_t
|
||||||
{
|
{
|
||||||
event_type_t type;
|
uint32_t header;
|
||||||
int32_t pid;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct new_map_t
|
struct new_map_t
|
||||||
{
|
{
|
||||||
event_type_t type;
|
uint32_t header;
|
||||||
int32_t pid;
|
|
||||||
char filename[PATH_MAX];
|
char filename[PATH_MAX];
|
||||||
uint64_t start;
|
uint64_t start;
|
||||||
uint64_t end;
|
uint64_t end;
|
||||||
@ -67,11 +63,22 @@ struct new_map_t
|
|||||||
|
|
||||||
struct sample_t
|
struct sample_t
|
||||||
{
|
{
|
||||||
event_type_t type;
|
uint32_t header;
|
||||||
int32_t pid;
|
|
||||||
StackNode * trace;
|
StackNode * trace;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define TYPE_SHIFT 29
|
||||||
|
#define PID_MASK ((uint32_t)((1 << TYPE_SHIFT) - 1))
|
||||||
|
|
||||||
|
#define MAKE_HEADER(type, pid) \
|
||||||
|
((uint32_t)((((uint32_t)pid) & PID_MASK) | (type << TYPE_SHIFT)))
|
||||||
|
|
||||||
|
#define GET_PID(header) \
|
||||||
|
(header & PID_MASK)
|
||||||
|
|
||||||
|
#define GET_TYPE(header) \
|
||||||
|
(header >> TYPE_SHIFT)
|
||||||
|
|
||||||
#define DEFAULT_SIZE (1024 * 1024 * 4)
|
#define DEFAULT_SIZE (1024 * 1024 * 4)
|
||||||
|
|
||||||
static char **
|
static char **
|
||||||
@ -293,9 +300,8 @@ tracker_add_process (tracker_t * tracker,
|
|||||||
const char *command_line)
|
const char *command_line)
|
||||||
{
|
{
|
||||||
new_process_t event;
|
new_process_t event;
|
||||||
|
|
||||||
event.type = NEW_PROCESS;
|
event.header = MAKE_HEADER (NEW_PROCESS, pid);
|
||||||
event.pid = pid;
|
|
||||||
COPY_STRING (event.command_line, command_line);
|
COPY_STRING (event.command_line, command_line);
|
||||||
|
|
||||||
tracker_append (tracker, &event, sizeof (event));
|
tracker_append (tracker, &event, sizeof (event));
|
||||||
@ -308,8 +314,7 @@ tracker_add_fork (tracker_t *tracker,
|
|||||||
{
|
{
|
||||||
fork_t event;
|
fork_t event;
|
||||||
|
|
||||||
event.type = FORK;
|
event.header = MAKE_HEADER(FORK, pid);
|
||||||
event.pid = pid;
|
|
||||||
event.child_pid = child_pid;
|
event.child_pid = child_pid;
|
||||||
|
|
||||||
tracker_append (tracker, &event, sizeof (event));
|
tracker_append (tracker, &event, sizeof (event));
|
||||||
@ -320,9 +325,8 @@ tracker_add_exit (tracker_t *tracker,
|
|||||||
pid_t pid)
|
pid_t pid)
|
||||||
{
|
{
|
||||||
exit_t event;
|
exit_t event;
|
||||||
|
|
||||||
event.type = EXIT;
|
event.header = MAKE_HEADER (EXIT, pid);
|
||||||
event.pid = pid;
|
|
||||||
|
|
||||||
tracker_append (tracker, &event, sizeof (event));
|
tracker_append (tracker, &event, sizeof (event));
|
||||||
}
|
}
|
||||||
@ -338,8 +342,7 @@ tracker_add_map (tracker_t * tracker,
|
|||||||
{
|
{
|
||||||
new_map_t event;
|
new_map_t event;
|
||||||
|
|
||||||
event.type = NEW_MAP;
|
event.header = MAKE_HEADER (NEW_MAP, pid);
|
||||||
event.pid = pid;
|
|
||||||
COPY_STRING (event.filename, filename);
|
COPY_STRING (event.filename, filename);
|
||||||
event.start = start;
|
event.start = start;
|
||||||
event.end = end;
|
event.end = end;
|
||||||
@ -357,8 +360,7 @@ tracker_add_sample (tracker_t *tracker,
|
|||||||
{
|
{
|
||||||
sample_t event;
|
sample_t event;
|
||||||
|
|
||||||
event.type = SAMPLE;
|
event.header = MAKE_HEADER (SAMPLE, pid);
|
||||||
event.pid = pid;
|
|
||||||
event.trace = stack_stash_add_trace (tracker->stash, ips, n_ips, 1);
|
event.trace = stack_stash_add_trace (tracker->stash, ips, n_ips, 1);
|
||||||
|
|
||||||
tracker_append (tracker, &event, sizeof (event));
|
tracker_append (tracker, &event, sizeof (event));
|
||||||
@ -408,9 +410,10 @@ create_map (state_t *state, new_map_t *new_map)
|
|||||||
process_t *process;
|
process_t *process;
|
||||||
map_t *map;
|
map_t *map;
|
||||||
int i;
|
int i;
|
||||||
|
pid_t pid = GET_PID (new_map->header);
|
||||||
|
|
||||||
process = g_hash_table_lookup (
|
process = g_hash_table_lookup (
|
||||||
state->processes_by_pid, GINT_TO_POINTER (new_map->pid));
|
state->processes_by_pid, GINT_TO_POINTER (pid));
|
||||||
|
|
||||||
if (!process)
|
if (!process)
|
||||||
return;
|
return;
|
||||||
@ -461,7 +464,7 @@ create_process (state_t *state, new_process_t *new_process)
|
|||||||
{
|
{
|
||||||
process_t *process = g_new0 (process_t, 1);
|
process_t *process = g_new0 (process_t, 1);
|
||||||
|
|
||||||
process->pid = new_process->pid;
|
process->pid = GET_PID (new_process->header);
|
||||||
process->comm = g_strdup (new_process->command_line);
|
process->comm = g_strdup (new_process->command_line);
|
||||||
process->maps = g_ptr_array_new ();
|
process->maps = g_ptr_array_new ();
|
||||||
|
|
||||||
@ -488,7 +491,7 @@ static void
|
|||||||
process_fork (state_t *state, fork_t *fork)
|
process_fork (state_t *state, fork_t *fork)
|
||||||
{
|
{
|
||||||
process_t *parent = g_hash_table_lookup (
|
process_t *parent = g_hash_table_lookup (
|
||||||
state->processes_by_pid, GINT_TO_POINTER (fork->pid));
|
state->processes_by_pid, GINT_TO_POINTER (GET_PID (fork->header)));
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
if (parent)
|
if (parent)
|
||||||
@ -911,14 +914,15 @@ process_sample (state_t *state, StackStash *resolved, sample_t *sample)
|
|||||||
process_t *process;
|
process_t *process;
|
||||||
StackNode *n;
|
StackNode *n;
|
||||||
int len;
|
int len;
|
||||||
|
pid_t pid = GET_PID (sample->header);
|
||||||
|
|
||||||
process = g_hash_table_lookup (
|
process = g_hash_table_lookup (
|
||||||
state->processes_by_pid, GINT_TO_POINTER (sample->pid));
|
state->processes_by_pid, GINT_TO_POINTER (pid));
|
||||||
|
|
||||||
if (!process)
|
if (!process)
|
||||||
{
|
{
|
||||||
static gboolean warned;
|
static gboolean warned;
|
||||||
if (!warned || sample->pid != 0)
|
if (!warned || pid != 0)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
g_print ("sample for unknown process %d\n", sample->pid);
|
g_print ("sample for unknown process %d\n", sample->pid);
|
||||||
@ -992,7 +996,7 @@ tracker_create_profile (tracker_t *tracker)
|
|||||||
event = tracker->events;
|
event = tracker->events;
|
||||||
while (event < end)
|
while (event < end)
|
||||||
{
|
{
|
||||||
event_type_t type = *(event_type_t *)event;
|
event_type_t type = GET_TYPE (*(uint32_t *)event);
|
||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user