[sysprof] Make comm events reuse any existing process.
- From: Søren Sandmann Pedersen <ssp src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [sysprof] Make comm events reuse any existing process.
- Date: Sat, 24 Apr 2010 14:48:34 +0000 (UTC)
commit 539c3a87546f6a3baf8bd33b1633c1dc07f66496
Author: Søren Sandmann Pedersen <sandmann daimi au dk>
Date: Sat Apr 24 10:27:27 2010 -0400
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.
tracker.c | 95 +++++++++++++++++++++++++++++++++---------------------------
1 files changed, 52 insertions(+), 43 deletions(-)
---
diff --git a/tracker.c b/tracker.c
index 90fa26b..6a10673 100644
--- a/tracker.c
+++ b/tracker.c
@@ -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
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]