diff --git a/src/libsysprof-analyze/sysprof-document-symbols-private.h b/src/libsysprof-analyze/sysprof-document-symbols-private.h index b8d7f44c..ad76c901 100644 --- a/src/libsysprof-analyze/sysprof-document-symbols-private.h +++ b/src/libsysprof-analyze/sysprof-document-symbols-private.h @@ -25,7 +25,12 @@ G_BEGIN_DECLS -SysprofDocumentSymbols *_sysprof_document_symbols_new (SysprofDocument *document, - SysprofSymbolizer *symbolizer); +void _sysprof_document_symbols_new (SysprofDocument *document, + SysprofSymbolizer *symbolizer, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +SysprofDocumentSymbols *_sysprof_document_symbols_new_finish (GAsyncResult *result, + GError **error); G_END_DECLS diff --git a/src/libsysprof-analyze/sysprof-document-symbols.c b/src/libsysprof-analyze/sysprof-document-symbols.c index 8ca791b1..d0c40352 100644 --- a/src/libsysprof-analyze/sysprof-document-symbols.c +++ b/src/libsysprof-analyze/sysprof-document-symbols.c @@ -24,8 +24,7 @@ struct _SysprofDocumentSymbols { - GObject parent_instance; - SysprofSymbolizer *symbolizer; + GObject parent_instance; }; G_DEFINE_FINAL_TYPE (SysprofDocumentSymbols, sysprof_document_symbols, G_TYPE_OBJECT) @@ -33,10 +32,6 @@ G_DEFINE_FINAL_TYPE (SysprofDocumentSymbols, sysprof_document_symbols, G_TYPE_OB static void sysprof_document_symbols_finalize (GObject *object) { - SysprofDocumentSymbols *self = (SysprofDocumentSymbols *)object; - - g_clear_object (&self->symbolizer); - G_OBJECT_CLASS (sysprof_document_symbols_parent_class)->finalize (object); } @@ -53,18 +48,70 @@ sysprof_document_symbols_init (SysprofDocumentSymbols *self) { } -SysprofDocumentSymbols * -_sysprof_document_symbols_new (SysprofDocument *document, - SysprofSymbolizer *symbolizer) +typedef struct _Symbolize { - SysprofDocumentSymbols *self; + SysprofDocument *document; + SysprofSymbolizer *symbolizer; +} Symbolize; - g_return_val_if_fail (SYSPROF_IS_DOCUMENT (document), NULL); - g_return_val_if_fail (SYSPROF_IS_SYMBOLIZER (symbolizer), NULL); - - self = g_object_new (SYSPROF_TYPE_DOCUMENT_SYMBOLS, NULL); - - /* TODO: async generation of symbols */ - - return self; +static void +symbolize_free (Symbolize *state) +{ + g_clear_object (&state->document); + g_clear_object (&state->symbolizer); + g_free (state); +} + +static void +sysprof_document_symbols_worker (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + Symbolize *state = task_data; + + 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_task_return_new_error (task, + G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + "Not yet supported"); +} + +void +_sysprof_document_symbols_new (SysprofDocument *document, + SysprofSymbolizer *symbolizer, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(GTask) task = NULL; + Symbolize *state; + + g_return_if_fail (SYSPROF_IS_DOCUMENT (document)); + g_return_if_fail (SYSPROF_IS_SYMBOLIZER (symbolizer)); + + state = g_new0 (Symbolize, 1); + state->document = g_object_ref (document); + state->symbolizer = g_object_ref (symbolizer); + + task = g_task_new (NULL, cancellable, callback, user_data); + g_task_set_source_tag (task, _sysprof_document_symbols_new); + g_task_set_task_data (task, state, (GDestroyNotify)symbolize_free); + g_task_run_in_thread (task, sysprof_document_symbols_worker); +} + +SysprofDocumentSymbols * +_sysprof_document_symbols_new_finish (GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (G_IS_TASK (result), NULL); + g_return_val_if_fail (g_task_is_valid (result, NULL), NULL); + g_return_val_if_fail (g_task_get_source_tag (G_TASK (result)) == _sysprof_document_symbols_new, NULL); + + return g_task_propagate_pointer (G_TASK (result), error); } diff --git a/src/libsysprof-analyze/sysprof-document.c b/src/libsysprof-analyze/sysprof-document.c index b25521ea..113ff7e2 100644 --- a/src/libsysprof-analyze/sysprof-document.c +++ b/src/libsysprof-analyze/sysprof-document.c @@ -26,6 +26,7 @@ #include "sysprof-document.h" #include "sysprof-document-frame-private.h" +#include "sysprof-document-symbols-private.h" struct _SysprofDocument { @@ -270,3 +271,58 @@ _sysprof_document_ref_string (SysprofDocument *self, return ret; } + +static void +sysprof_document_symbolize_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + g_autoptr(SysprofDocumentSymbols) symbols = NULL; + g_autoptr(GTask) task = user_data; + g_autoptr(GError) error = NULL; + + g_assert (G_IS_ASYNC_RESULT (result)); + g_assert (G_IS_TASK (task)); + + if ((symbols = _sysprof_document_symbols_new_finish (result, &error))) + g_task_return_pointer (task, g_steal_pointer (&symbols), g_object_unref); + else + g_task_return_error (task, g_steal_pointer (&error)); +} + +void +sysprof_document_symbolize_async (SysprofDocument *self, + SysprofSymbolizer *symbolizer, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_autoptr(SysprofDocumentSymbols) symbols = NULL; + g_autoptr(GTask) task = NULL; + + g_return_if_fail (SYSPROF_IS_DOCUMENT (self)); + g_return_if_fail (SYSPROF_IS_SYMBOLIZER (symbolizer)); + g_return_if_fail (!cancellable || SYSPROF_IS_SYMBOLIZER (symbolizer)); + + 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)); +} + +SysprofDocumentSymbols * +sysprof_document_symbolize_finish (SysprofDocument *self, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (SYSPROF_IS_DOCUMENT (self), NULL); + g_return_val_if_fail (G_IS_TASK (result), NULL); + g_return_val_if_fail (g_task_is_valid (result, self), NULL); + g_return_val_if_fail (g_task_get_source_tag (G_TASK (result)) == sysprof_document_symbolize_async, NULL); + + return g_task_propagate_pointer (G_TASK (result), error); +}