From 39e6be47fb6132b78b971e6c701eb6a454006e1d Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Fri, 19 May 2023 17:03:35 -0700 Subject: [PATCH] libsysprof-analyze: add plumbing to track overlays This just gets the plumbing into place, we'll still need to use it to do the path translations. --- src/libsysprof-analyze/sysprof-document.c | 27 +++++++++++++++++++ .../sysprof-mount-namespace-private.h | 17 +++++++----- .../sysprof-mount-namespace.c | 10 +++++++ 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/src/libsysprof-analyze/sysprof-document.c b/src/libsysprof-analyze/sysprof-document.c index 6c0c57ae..f1f1a80a 100644 --- a/src/libsysprof-analyze/sysprof-document.c +++ b/src/libsysprof-analyze/sysprof-document.c @@ -146,6 +146,9 @@ _sysprof_document_process_info (SysprofDocument *self, g_return_val_if_fail (SYSPROF_IS_DOCUMENT (self), NULL); + if (pid < 0) + return NULL; + process_info = g_hash_table_lookup (self->pid_to_process_info, GINT_TO_POINTER (pid)); if (process_info == NULL && may_create) @@ -394,6 +397,29 @@ sysprof_document_load_mountinfos (SysprofDocument *self) } } +static void +sysprof_document_load_overlays (SysprofDocument *self) +{ + GtkBitsetIter iter; + guint i; + + g_assert (SYSPROF_IS_DOCUMENT (self)); + + if (gtk_bitset_iter_init_first (&iter, self->overlays, &i)) + { + do + { + g_autoptr(SysprofDocumentOverlay) overlay = g_list_model_get_item (G_LIST_MODEL (self), i); + int pid = sysprof_document_frame_get_pid (SYSPROF_DOCUMENT_FRAME (overlay)); + SysprofProcessInfo *process_info = _sysprof_document_process_info (self, pid, TRUE); + + if (process_info != NULL) + sysprof_mount_namespace_add_overlay (process_info->mount_namespace, overlay); + } + while (gtk_bitset_iter_next (&iter, &i)); + } +} + static void sysprof_document_load_worker (GTask *task, gpointer source_object, @@ -492,6 +518,7 @@ sysprof_document_load_worker (GTask *task, sysprof_document_load_mounts (self); sysprof_document_load_mountinfos (self); sysprof_document_load_memory_maps (self); + sysprof_document_load_overlays (self); g_task_return_pointer (task, g_steal_pointer (&self), g_object_unref); } diff --git a/src/libsysprof-analyze/sysprof-mount-namespace-private.h b/src/libsysprof-analyze/sysprof-mount-namespace-private.h index 4f4ecd26..5f0f3d6f 100644 --- a/src/libsysprof-analyze/sysprof-mount-namespace-private.h +++ b/src/libsysprof-analyze/sysprof-mount-namespace-private.h @@ -24,6 +24,7 @@ #include "sysprof-mount-private.h" #include "sysprof-mount-device-private.h" +#include "sysprof-document-overlay.h" G_BEGIN_DECLS @@ -32,12 +33,14 @@ G_BEGIN_DECLS G_DECLARE_FINAL_TYPE (SysprofMountNamespace, sysprof_mount_namespace, SYSPROF, MOUNT_NAMESPACE, GObject) SysprofMountNamespace *sysprof_mount_namespace_new (void); -SysprofMountNamespace *sysprof_mount_namespace_copy (SysprofMountNamespace *self); -void sysprof_mount_namespace_add_device (SysprofMountNamespace *self, - SysprofMountDevice *mount); -void sysprof_mount_namespace_add_mount (SysprofMountNamespace *self, - SysprofMount *mount); -char **sysprof_mount_namespace_translate (SysprofMountNamespace *self, - const char *path); +SysprofMountNamespace *sysprof_mount_namespace_copy (SysprofMountNamespace *self); +void sysprof_mount_namespace_add_device (SysprofMountNamespace *self, + SysprofMountDevice *mount); +void sysprof_mount_namespace_add_mount (SysprofMountNamespace *self, + SysprofMount *mount); +void sysprof_mount_namespace_add_overlay (SysprofMountNamespace *self, + SysprofDocumentOverlay *overlay); +char **sysprof_mount_namespace_translate (SysprofMountNamespace *self, + const char *path); G_END_DECLS diff --git a/src/libsysprof-analyze/sysprof-mount-namespace.c b/src/libsysprof-analyze/sysprof-mount-namespace.c index 4fc2cc50..d779b231 100644 --- a/src/libsysprof-analyze/sysprof-mount-namespace.c +++ b/src/libsysprof-analyze/sysprof-mount-namespace.c @@ -147,6 +147,16 @@ sysprof_mount_namespace_add_mount (SysprofMountNamespace *self, g_ptr_array_add (self->mounts, mount); } +void +sysprof_mount_namespace_add_overlay (SysprofMountNamespace *self, + SysprofDocumentOverlay *overlay) +{ + g_return_if_fail (SYSPROF_IS_MOUNT_NAMESPACE (self)); + g_return_if_fail (SYSPROF_IS_DOCUMENT_OVERLAY (overlay)); + + /* TODO */ +} + static SysprofMountDevice * sysprof_mount_namespace_find_device (SysprofMountNamespace *self, SysprofMount *mount,