From b72eda6be24ce51c240fd3c769ae770af61e96ae Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Wed, 3 May 2023 17:22:37 -0700 Subject: [PATCH] libsysprof-analyze: prepare symbolizers before decoding --- .../sysprof-document-symbols.c | 9 ++++- src/libsysprof-analyze/sysprof-document.c | 40 +++++++++++++++---- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/libsysprof-analyze/sysprof-document-symbols.c b/src/libsysprof-analyze/sysprof-document-symbols.c index b67ebe9d..a064ef53 100644 --- a/src/libsysprof-analyze/sysprof-document-symbols.c +++ b/src/libsysprof-analyze/sysprof-document-symbols.c @@ -51,8 +51,9 @@ sysprof_document_symbols_init (SysprofDocumentSymbols *self) typedef struct _Symbolize { - SysprofDocument *document; - SysprofSymbolizer *symbolizer; + SysprofDocument *document; + SysprofSymbolizer *symbolizer; + SysprofDocumentSymbols *symbols; } Symbolize; static void @@ -60,6 +61,7 @@ symbolize_free (Symbolize *state) { g_clear_object (&state->document); g_clear_object (&state->symbolizer); + g_clear_object (&state->symbols); g_free (state); } @@ -71,11 +73,13 @@ sysprof_document_symbols_worker (GTask *task, { Symbolize *state = task_data; + g_assert (source_object == NULL); g_assert (G_IS_TASK (task)); g_assert (!cancellable || G_IS_CANCELLABLE (cancellable)); g_assert (state != NULL); g_assert (SYSPROF_IS_DOCUMENT (state->document)); g_assert (SYSPROF_IS_SYMBOLIZER (state->symbolizer)); + g_assert (SYSPROF_IS_DOCUMENT_SYMBOLS (state->symbols)); g_task_return_new_error (task, G_IO_ERROR, @@ -99,6 +103,7 @@ _sysprof_document_symbols_new (SysprofDocument *document, state = g_new0 (Symbolize, 1); state->document = g_object_ref (document); state->symbolizer = g_object_ref (symbolizer); + state->symbols = g_object_new (SYSPROF_TYPE_DOCUMENT_SYMBOLS, NULL); task = g_task_new (NULL, cancellable, callback, user_data); g_task_set_source_tag (task, _sysprof_document_symbols_new); diff --git a/src/libsysprof-analyze/sysprof-document.c b/src/libsysprof-analyze/sysprof-document.c index 3190d1d1..9d1285c6 100644 --- a/src/libsysprof-analyze/sysprof-document.c +++ b/src/libsysprof-analyze/sysprof-document.c @@ -27,6 +27,7 @@ #include "sysprof-document.h" #include "sysprof-document-frame-private.h" #include "sysprof-document-symbols-private.h" +#include "sysprof-symbolizer-private.h" struct _SysprofDocument { @@ -273,9 +274,9 @@ _sysprof_document_ref_string (SysprofDocument *self, } static void -sysprof_document_symbolize_cb (GObject *object, - GAsyncResult *result, - gpointer user_data) +sysprof_document_symbolize_symbols_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) { g_autoptr(SysprofDocumentSymbols) symbols = NULL; g_autoptr(GTask) task = user_data; @@ -290,6 +291,29 @@ sysprof_document_symbolize_cb (GObject *object, g_task_return_error (task, g_steal_pointer (&error)); } +static void +sysprof_document_symbolize_prepare_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + SysprofSymbolizer *symbolizer = (SysprofSymbolizer *)object; + g_autoptr(GTask) task = user_data; + g_autoptr(GError) error = NULL; + + g_assert (SYSPROF_IS_SYMBOLIZER (symbolizer)); + g_assert (G_IS_ASYNC_RESULT (result)); + g_assert (G_IS_TASK (task)); + + if (!_sysprof_symbolizer_prepare_finish (symbolizer, result, &error)) + g_task_return_error (task, g_steal_pointer (&error)); + else + _sysprof_document_symbols_new (g_task_get_source_object (task), + symbolizer, + g_task_get_cancellable (task), + sysprof_document_symbolize_symbols_cb, + g_object_ref (task)); +} + void sysprof_document_symbolize_async (SysprofDocument *self, SysprofSymbolizer *symbolizer, @@ -307,11 +331,11 @@ sysprof_document_symbolize_async (SysprofDocument *self, task = g_task_new (self, cancellable, callback, user_data); g_task_set_source_tag (task, sysprof_document_symbolize_async); - _sysprof_document_symbols_new (self, - symbolizer, - cancellable, - sysprof_document_symbolize_cb, - g_steal_pointer (&task)); + _sysprof_symbolizer_prepare_async (symbolizer, + self, + cancellable, + sysprof_document_symbolize_prepare_cb, + g_steal_pointer (&task)); } SysprofDocumentSymbols *