Make the events more compact by packing type and pid into one uint32_t.

This commit is contained in:
Søren Sandmann Pedersen
2009-10-21 08:57:08 -04:00
parent 432cd9ce55
commit 2c4422c46e

View File

@ -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)
{ {