struct new_process_t
{
- event_type_t type;
- int32_t pid;
+ uint32_t header;
char command_line[256];
};
struct fork_t
{
- event_type_t type;
- int32_t pid;
+ uint32_t header;
int32_t child_pid;
};
struct exit_t
{
- event_type_t type;
- int32_t pid;
+ uint32_t header;
};
struct new_map_t
{
- event_type_t type;
- int32_t pid;
+ uint32_t header;
char filename[PATH_MAX];
uint64_t start;
uint64_t end;
struct sample_t
{
- event_type_t type;
- int32_t pid;
+ uint32_t header;
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)
static char **
const char *command_line)
{
new_process_t event;
-
- event.type = NEW_PROCESS;
- event.pid = pid;
+
+ event.header = MAKE_HEADER (NEW_PROCESS, pid);
COPY_STRING (event.command_line, command_line);
tracker_append (tracker, &event, sizeof (event));
{
fork_t event;
- event.type = FORK;
- event.pid = pid;
+ event.header = MAKE_HEADER(FORK, pid);
event.child_pid = child_pid;
tracker_append (tracker, &event, sizeof (event));
pid_t pid)
{
exit_t event;
-
- event.type = EXIT;
- event.pid = pid;
+
+ event.header = MAKE_HEADER (EXIT, pid);
tracker_append (tracker, &event, sizeof (event));
}
{
new_map_t event;
- event.type = NEW_MAP;
- event.pid = pid;
+ event.header = MAKE_HEADER (NEW_MAP, pid);
COPY_STRING (event.filename, filename);
event.start = start;
event.end = end;
{
sample_t event;
- event.type = SAMPLE;
- event.pid = pid;
+ event.header = MAKE_HEADER (SAMPLE, pid);
event.trace = stack_stash_add_trace (tracker->stash, ips, n_ips, 1);
tracker_append (tracker, &event, sizeof (event));
process_t *process;
map_t *map;
int i;
+ pid_t pid = GET_PID (new_map->header);
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)
return;
{
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->maps = g_ptr_array_new ();
process_fork (state_t *state, fork_t *fork)
{
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 (parent)
process_t *process;
StackNode *n;
int len;
+ pid_t pid = GET_PID (sample->header);
process = g_hash_table_lookup (
- state->processes_by_pid, GINT_TO_POINTER (sample->pid));
+ state->processes_by_pid, GINT_TO_POINTER (pid));
if (!process)
{
static gboolean warned;
- if (!warned || sample->pid != 0)
+ if (!warned || pid != 0)
{
#if 0
g_print ("sample for unknown process %d\n", sample->pid);
event = tracker->events;
while (event < end)
{
- event_type_t type = *(event_type_t *)event;
+ event_type_t type = GET_TYPE (*(uint32_t *)event);
switch (type)
{