libsysprof-analyze: prepare symbolizers before decoding

This commit is contained in:
Christian Hergert
2023-05-03 17:22:37 -07:00
parent 5d255bcb80
commit b72eda6be2
2 changed files with 39 additions and 10 deletions

View File

@ -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);

View File

@ -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 *