From 7d93b9f581d5e804503367b2949999287467c1da Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Wed, 5 Jul 2023 18:06:42 -0700 Subject: [PATCH] libsysprof-analyze: add stack traces w/o kernel context This restores the functionality we had previously for user vs kernel. --- src/libsysprof-analyze/sysprof-document.c | 22 +++++++++++++++++++ src/libsysprof-analyze/sysprof-document.h | 3 +++ src/libsysprof-gtk/sysprof-session-discover.c | 20 ++++++++++++++++- 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/libsysprof-analyze/sysprof-document.c b/src/libsysprof-analyze/sysprof-document.c index d5ecafbf..5ec368ae 100644 --- a/src/libsysprof-analyze/sysprof-document.c +++ b/src/libsysprof-analyze/sysprof-document.c @@ -1436,6 +1436,28 @@ sysprof_document_list_samples_with_context_switch (SysprofDocument *self) return _sysprof_document_bitset_index_new (G_LIST_MODEL (self), self->samples_with_context_switch); } +/** + * sysprof_document_list_samples_without_context_switch: + * @self: a #SysprofDocument + * + * Gets a #GListModel containing #SysprofDocumentSample found within + * the #SysprofDocument which contain a context switch. + * + * Returns: (transfer full): a #GListModel of #SysprofDocumentSample + */ +GListModel * +sysprof_document_list_samples_without_context_switch (SysprofDocument *self) +{ + g_autoptr(EggBitset) bitset = NULL; + + g_return_val_if_fail (SYSPROF_IS_DOCUMENT (self), NULL); + + bitset = egg_bitset_copy (self->samples); + egg_bitset_subtract (bitset, self->samples_with_context_switch); + + return _sysprof_document_bitset_index_new (G_LIST_MODEL (self), bitset); +} + /** * sysprof_document_list_processes: * @self: a #SysprofDocument diff --git a/src/libsysprof-analyze/sysprof-document.h b/src/libsysprof-analyze/sysprof-document.h index e0d1f731..233a0d5a 100644 --- a/src/libsysprof-analyze/sysprof-document.h +++ b/src/libsysprof-analyze/sysprof-document.h @@ -58,6 +58,9 @@ SYSPROF_AVAILABLE_IN_ALL GListModel *sysprof_document_list_samples_with_context_switch (SysprofDocument *self); SYSPROF_AVAILABLE_IN_ALL +GListModel *sysprof_document_list_samples_without_context_switch + (SysprofDocument *self); +SYSPROF_AVAILABLE_IN_ALL GListModel *sysprof_document_list_processes (SysprofDocument *self); SYSPROF_AVAILABLE_IN_ALL GListModel *sysprof_document_list_jitmaps (SysprofDocument *self); diff --git a/src/libsysprof-gtk/sysprof-session-discover.c b/src/libsysprof-gtk/sysprof-session-discover.c index 9d6f38b6..bfa92809 100644 --- a/src/libsysprof-gtk/sysprof-session-discover.c +++ b/src/libsysprof-gtk/sysprof-session-discover.c @@ -233,6 +233,7 @@ sysprof_session_discover_sampler (SysprofSession *self, { g_autoptr(GListModel) samples = NULL; g_autoptr(GListModel) samples_with_context_switch = NULL; + g_autoptr(GListModel) samples_without_context_switch = NULL; g_assert (SYSPROF_IS_SESSION (self)); g_assert (SYSPROF_IS_DOCUMENT (document)); @@ -240,6 +241,7 @@ sysprof_session_discover_sampler (SysprofSession *self, samples = sysprof_document_list_samples (document); samples_with_context_switch = sysprof_document_list_samples_with_context_switch (document); + samples_without_context_switch = sysprof_document_list_samples_without_context_switch (document); if (g_list_model_get_n_items (samples) > 0) { @@ -261,7 +263,7 @@ sysprof_session_discover_sampler (SysprofSession *self, g_autoptr(SysprofTrack) subtrack = NULL; subtrack = g_object_new (SYSPROF_TYPE_TRACK, - "title", _("Context Switches"), + "title", _("Stack Traces (In Kernel)"), NULL); g_signal_connect_data (subtrack, "create-chart", @@ -271,6 +273,22 @@ sysprof_session_discover_sampler (SysprofSession *self, 0); _sysprof_track_add_subtrack (track, subtrack); } + + if (g_list_model_get_n_items (samples_without_context_switch)) + { + g_autoptr(SysprofTrack) subtrack = NULL; + + subtrack = g_object_new (SYSPROF_TYPE_TRACK, + "title", _("Stack Traces (In User)"), + NULL); + g_signal_connect_data (subtrack, + "create-chart", + G_CALLBACK (create_chart_for_samples), + sysprof_track_samples_new (self, samples_without_context_switch), + (GClosureNotify)sysprof_track_samples_free, + 0); + _sysprof_track_add_subtrack (track, subtrack); + } } }