From 5d5f0a5085068e44fd3a71f6dd1284e2d336a0d2 Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Thu, 11 May 2023 13:09:50 -0700 Subject: [PATCH] libsysprof-analyze: plumb access to string pooling We want various subsystems to start using this, but we need to plumb it to the symbolizers to take advantage of it. --- .../sysprof-bundled-symbolizer.c | 5 +++-- .../sysprof-document-symbols-private.h | 1 + .../sysprof-document-symbols.c | 19 ++++++++++--------- src/libsysprof-analyze/sysprof-document.c | 1 + .../sysprof-multi-symbolizer.c | 3 ++- .../sysprof-symbolizer-private.h | 7 +++++-- src/libsysprof-analyze/sysprof-symbolizer.c | 3 ++- 7 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/libsysprof-analyze/sysprof-bundled-symbolizer.c b/src/libsysprof-analyze/sysprof-bundled-symbolizer.c index 441f4576..7f3c855b 100644 --- a/src/libsysprof-analyze/sysprof-bundled-symbolizer.c +++ b/src/libsysprof-analyze/sysprof-bundled-symbolizer.c @@ -170,6 +170,7 @@ search_for_symbol_cb (gconstpointer a, static SysprofSymbol * sysprof_bundled_symbolizer_symbolize (SysprofSymbolizer *symbolizer, + SysprofStrings *strings, const SysprofProcessInfo *process_info, SysprofAddress address) { @@ -202,11 +203,11 @@ sysprof_bundled_symbolizer_symbolize (SysprofSymbolizer *symbolizer, if (ret->tag_offset > 0) { if (ret->tag_offset < (self->endptr - self->beginptr)) - tag = g_ref_string_new (&self->beginptr[ret->tag_offset]); + tag = sysprof_strings_get (strings, &self->beginptr[ret->tag_offset]); } if (ret->offset < (self->endptr - self->beginptr)) - return _sysprof_symbol_new (g_ref_string_new (&self->beginptr[ret->offset]), + return _sysprof_symbol_new (sysprof_strings_get (strings, &self->beginptr[ret->offset]), g_steal_pointer (&tag), NULL, ret->addr_begin, diff --git a/src/libsysprof-analyze/sysprof-document-symbols-private.h b/src/libsysprof-analyze/sysprof-document-symbols-private.h index 2dffd414..58ac1faa 100644 --- a/src/libsysprof-analyze/sysprof-document-symbols-private.h +++ b/src/libsysprof-analyze/sysprof-document-symbols-private.h @@ -27,6 +27,7 @@ G_BEGIN_DECLS void _sysprof_document_symbols_new (SysprofDocument *document, + SysprofStrings *strings, SysprofSymbolizer *symbolizer, GHashTable *pid_to_process_info, GCancellable *cancellable, diff --git a/src/libsysprof-analyze/sysprof-document-symbols.c b/src/libsysprof-analyze/sysprof-document-symbols.c index 926d4274..f7c0f796 100644 --- a/src/libsysprof-analyze/sysprof-document-symbols.c +++ b/src/libsysprof-analyze/sysprof-document-symbols.c @@ -66,6 +66,7 @@ typedef struct _Symbolize SysprofDocument *document; SysprofSymbolizer *symbolizer; SysprofDocumentSymbols *symbols; + SysprofStrings *strings; GHashTable *pid_to_process_info; } Symbolize; @@ -75,27 +76,25 @@ symbolize_free (Symbolize *state) g_clear_object (&state->document); g_clear_object (&state->symbolizer); g_clear_object (&state->symbols); + g_clear_pointer (&state->strings, sysprof_strings_unref); g_clear_pointer (&state->pid_to_process_info, g_hash_table_unref); g_free (state); } static void -sysprof_document_symbols_add_traceable (SysprofDocumentSymbols *self, - SysprofProcessInfo *process_info, - SysprofDocumentTraceable *traceable, - SysprofSymbolizer *symbolizer) +add_traceable (SysprofStrings *strings, + SysprofProcessInfo *process_info, + SysprofDocumentTraceable *traceable, + SysprofSymbolizer *symbolizer) { SysprofAddressContext last_context; guint64 *addresses; guint n_addresses; - int pid; - g_assert (SYSPROF_IS_DOCUMENT_SYMBOLS (self)); g_assert (process_info != NULL); g_assert (SYSPROF_IS_DOCUMENT_TRACEABLE (traceable)); g_assert (SYSPROF_IS_SYMBOLIZER (symbolizer)); - pid = sysprof_document_frame_get_pid (SYSPROF_DOCUMENT_FRAME (traceable)); n_addresses = sysprof_document_traceable_get_stack_depth (traceable); addresses = g_alloca (sizeof (guint64) * n_addresses); sysprof_document_traceable_get_stack_addresses (traceable, addresses, n_addresses); @@ -117,7 +116,7 @@ sysprof_document_symbols_add_traceable (SysprofDocumentSymbols *self, } else { - g_autoptr(SysprofSymbol) symbol = _sysprof_symbolizer_symbolize (symbolizer, process_info, address); + g_autoptr(SysprofSymbol) symbol = _sysprof_symbolizer_symbolize (symbolizer, strings, process_info, address); if (symbol != NULL) sysprof_symbol_cache_take (process_info->symbol_cache, g_steal_pointer (&symbol)); @@ -190,7 +189,7 @@ sysprof_document_symbols_worker (GTask *task, if (process_info == NULL) continue; - sysprof_document_symbols_add_traceable (state->symbols, process_info, traceable, state->symbolizer); + add_traceable (state->strings, process_info, traceable, state->symbolizer); } while (gtk_bitset_iter_next (&iter, &i)); } @@ -202,6 +201,7 @@ sysprof_document_symbols_worker (GTask *task, void _sysprof_document_symbols_new (SysprofDocument *document, + SysprofStrings *strings, SysprofSymbolizer *symbolizer, GHashTable *pid_to_process_info, GCancellable *cancellable, @@ -218,6 +218,7 @@ _sysprof_document_symbols_new (SysprofDocument *document, state->document = g_object_ref (document); state->symbolizer = g_object_ref (symbolizer); state->symbols = g_object_new (SYSPROF_TYPE_DOCUMENT_SYMBOLS, NULL); + state->strings = sysprof_strings_ref (strings); state->pid_to_process_info = g_hash_table_ref (pid_to_process_info); task = g_task_new (NULL, cancellable, callback, user_data); diff --git a/src/libsysprof-analyze/sysprof-document.c b/src/libsysprof-analyze/sysprof-document.c index dcf73f2e..cb21783e 100644 --- a/src/libsysprof-analyze/sysprof-document.c +++ b/src/libsysprof-analyze/sysprof-document.c @@ -594,6 +594,7 @@ sysprof_document_symbolize_prepare_cb (GObject *object, g_task_return_error (task, g_steal_pointer (&error)); else _sysprof_document_symbols_new (g_task_get_source_object (task), + self->strings, symbolizer, self->pid_to_process_info, g_task_get_cancellable (task), diff --git a/src/libsysprof-analyze/sysprof-multi-symbolizer.c b/src/libsysprof-analyze/sysprof-multi-symbolizer.c index 92264c2d..d39008ea 100644 --- a/src/libsysprof-analyze/sysprof-multi-symbolizer.c +++ b/src/libsysprof-analyze/sysprof-multi-symbolizer.c @@ -119,6 +119,7 @@ sysprof_multi_symbolizer_prepare_finish (SysprofSymbolizer *symbolizer, static SysprofSymbol * sysprof_multi_symbolizer_symbolize (SysprofSymbolizer *symbolizer, + SysprofStrings *strings, const SysprofProcessInfo *process_info, SysprofAddress address) { @@ -127,7 +128,7 @@ sysprof_multi_symbolizer_symbolize (SysprofSymbolizer *symbolizer, for (guint i = 0; i < self->symbolizers->len; i++) { SysprofSymbolizer *child = g_ptr_array_index (self->symbolizers, i); - SysprofSymbol *symbol = _sysprof_symbolizer_symbolize (child, process_info, address); + SysprofSymbol *symbol = _sysprof_symbolizer_symbolize (child, strings, process_info, address); if (symbol != NULL) return symbol; diff --git a/src/libsysprof-analyze/sysprof-symbolizer-private.h b/src/libsysprof-analyze/sysprof-symbolizer-private.h index abd547ed..fadc1f7f 100644 --- a/src/libsysprof-analyze/sysprof-symbolizer-private.h +++ b/src/libsysprof-analyze/sysprof-symbolizer-private.h @@ -22,10 +22,11 @@ #include "sysprof-address-layout-private.h" #include "sysprof-document.h" -#include "sysprof-symbol.h" -#include "sysprof-symbolizer.h" #include "sysprof-mount-namespace-private.h" #include "sysprof-process-info-private.h" +#include "sysprof-strings-private.h" +#include "sysprof-symbol.h" +#include "sysprof-symbolizer.h" G_BEGIN_DECLS @@ -49,6 +50,7 @@ struct _SysprofSymbolizerClass GAsyncResult *result, GError **error); SysprofSymbol *(*symbolize) (SysprofSymbolizer *self, + SysprofStrings *strings, const SysprofProcessInfo *process_info, SysprofAddress address); }; @@ -63,6 +65,7 @@ gboolean _sysprof_symbolizer_prepare_finish (SysprofSymbolizer *se GAsyncResult *result, GError **error); SysprofSymbol *_sysprof_symbolizer_symbolize (SysprofSymbolizer *self, + SysprofStrings *strings, const SysprofProcessInfo *process_info, SysprofAddress address); diff --git a/src/libsysprof-analyze/sysprof-symbolizer.c b/src/libsysprof-analyze/sysprof-symbolizer.c index 104c81e1..14eca803 100644 --- a/src/libsysprof-analyze/sysprof-symbolizer.c +++ b/src/libsysprof-analyze/sysprof-symbolizer.c @@ -92,8 +92,9 @@ _sysprof_symbolizer_prepare_finish (SysprofSymbolizer *self, SysprofSymbol * _sysprof_symbolizer_symbolize (SysprofSymbolizer *self, + SysprofStrings *strings, const SysprofProcessInfo *process_info, SysprofAddress address) { - return SYSPROF_SYMBOLIZER_GET_CLASS (self)->symbolize (self, process_info, address); + return SYSPROF_SYMBOLIZER_GET_CLASS (self)->symbolize (self, strings, process_info, address); }