diff options
author | Søren Sandmann Pedersen <sandmann@daimi.au.dk> | 2010-04-24 10:27:27 -0400 |
---|---|---|
committer | Søren Sandmann Pedersen <sandmann@daimi.au.dk> | 2010-04-24 10:27:27 -0400 |
commit | 539c3a87546f6a3baf8bd33b1633c1dc07f66496 (patch) | |
tree | 2f736a7ca68845a4ee211c400b0e1eab8080ea62 | |
parent | 73922a0af984c0882f1177f4d3958626fb861664 (diff) |
Make comm events reuse any existing process.
A comm event doesn't necessarily mean a new process was created. It
may just mean that an existing process changed its command line.
-rw-r--r-- | tracker.c | 95 |
1 files changed, 52 insertions, 43 deletions
@@ -291,6 +291,10 @@ tracker_append (tracker_t *tracker, memcpy (tracker->events + tracker->n_event_bytes, event, n_bytes); +#if 0 + g_print (" (address %p)\n", tracker->events + tracker->n_event_bytes); +#endif + tracker->n_event_bytes += n_bytes; } @@ -301,6 +305,10 @@ tracker_add_process (tracker_t * tracker, { new_process_t event; +#if 0 + g_print ("Add new process %s %d to tracker ", command_line, pid); +#endif + event.header = MAKE_HEADER (NEW_PROCESS, pid); COPY_STRING (event.command_line, command_line); @@ -462,18 +470,28 @@ destroy_process (process_t *process) static void create_process (state_t *state, new_process_t *new_process) { - process_t *process = g_new0 (process_t, 1); + pid_t pid = GET_PID (new_process->header); + const char *comm = new_process->command_line; - process->pid = GET_PID (new_process->header); - process->comm = g_strdup (new_process->command_line); - process->maps = g_ptr_array_new (); + process_t *process = + g_hash_table_lookup (state->processes_by_pid, GINT_TO_POINTER (pid)); -#if 0 - g_print ("new comm process %d\n", new_process->pid); -#endif - - g_hash_table_insert ( - state->processes_by_pid, GINT_TO_POINTER (process->pid), process); + if (process) + { + g_free (process->comm); + process->comm = g_strdup (comm); + } + else + { + process = g_new0 (process_t, 1); + + process->pid = pid; + process->comm = g_strdup (comm); + process->maps = g_ptr_array_new (); + + g_hash_table_insert ( + state->processes_by_pid, GINT_TO_POINTER (process->pid), process); + } } static map_t * @@ -490,52 +508,43 @@ copy_map (map_t *map) static void process_fork (state_t *state, fork_t *fork) { + pid_t ppid = GET_PID (fork->header); + GPtrArray *maps; + process_t *parent = g_hash_table_lookup ( - state->processes_by_pid, GINT_TO_POINTER (GET_PID (fork->header))); + state->processes_by_pid, GINT_TO_POINTER (ppid)); + process_t *child; - if (GET_PID (fork->header) == fork->child_pid) + if (ppid == fork->child_pid) { /* Just a new thread being spawned */ return; } - -#if 0 - if (parent) -#endif - { - process_t *process = g_new0 (process_t, 1); - int i; - -#if 0 - g_print ("new child %d\n", fork->child_pid); -#endif - process->pid = fork->child_pid; + child = g_new0 (process_t, 1); + if (parent) + child->comm = g_strdup (parent->comm); + else + child->comm = g_strdup_printf ("[pid %d]", fork->child_pid); - if (parent) - process->comm = g_strdup (parent->comm); - else - process->comm = g_strdup_printf ("<pid %d>", fork->child_pid); + child->pid = fork->child_pid; - process->maps = g_ptr_array_new (); + child->maps = g_ptr_array_new (); - if (parent) + if (parent) + { + int i; + + for (i = 0; i < parent->maps->len; ++i) { - for (i = 0; i < parent->maps->len; ++i) - { - map_t *map = copy_map (parent->maps->pdata[i]); - - g_ptr_array_add (process->maps, map); - } + map_t *map = copy_map (parent->maps->pdata[i]); + + g_ptr_array_add (maps, map); } - - g_hash_table_insert ( - state->processes_by_pid, GINT_TO_POINTER (process->pid), process); } -#if 0 - else - g_print ("no parent for %d\n", fork->child_pid); -#endif + + g_hash_table_insert ( + state->processes_by_pid, GINT_TO_POINTER (child->pid), child); } static void |