From c6cb5473ae98d287b3b7bdb8b6010560157e7ded Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Mon, 25 Nov 2024 14:06:36 -0800 Subject: [PATCH] libsysprof: add serialize symbols helper --- src/libsysprof/sysprof-document-private.h | 3 ++ src/libsysprof/sysprof-document.c | 42 +++++++++++++++++++++++ src/libsysprof/sysprof-symbols-bundle.c | 8 ++--- 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/src/libsysprof/sysprof-document-private.h b/src/libsysprof/sysprof-document-private.h index 01bc460d..ea88650f 100644 --- a/src/libsysprof/sysprof-document-private.h +++ b/src/libsysprof/sysprof-document-private.h @@ -22,6 +22,8 @@ #include +#include + #include "sysprof-document.h" #include "sysprof-symbolizer.h" #include "sysprof-symbol.h" @@ -83,5 +85,6 @@ SysprofSymbol *_sysprof_document_thread_symbol (SysprofDocument *self, SysprofSymbol *_sysprof_document_kernel_symbol (SysprofDocument *self); GArray *_sysprof_document_get_frames (SysprofDocument *self); EggBitset *_sysprof_document_get_allocations (SysprofDocument *self); +DexFuture *_sysprof_document_serialize_symbols(SysprofDocument *self); G_END_DECLS diff --git a/src/libsysprof/sysprof-document.c b/src/libsysprof/sysprof-document.c index 7453adf0..adddce67 100644 --- a/src/libsysprof/sysprof-document.c +++ b/src/libsysprof/sysprof-document.c @@ -2804,3 +2804,45 @@ sysprof_document_get_busy (SysprofDocument *self) return self->busy_count > 0; } + +static void +sysprof_document_serialize_symbols_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + SysprofDocument *document = (SysprofDocument *)object; + g_autoptr(DexPromise) promise = user_data; + g_autoptr(GBytes) bytes = NULL; + g_autoptr(GError) error = NULL; + + g_assert (SYSPROF_IS_DOCUMENT (document)); + g_assert (G_IS_ASYNC_RESULT (result)); + g_assert (DEX_IS_PROMISE (promise)); + + if ((bytes = sysprof_document_serialize_symbols_finish (document, result, &error))) + { + GValue value = G_VALUE_INIT; + + g_value_init (&value, G_TYPE_BYTES); + g_value_take_boxed (&value, g_steal_pointer (&bytes)); + + dex_promise_resolve (promise, &value); + } + else + dex_promise_reject (promise, g_steal_pointer (&error)); +} + +DexFuture * +_sysprof_document_serialize_symbols (SysprofDocument *document) +{ + DexPromise *promise; + + g_return_val_if_fail (SYSPROF_IS_DOCUMENT (document), NULL); + + promise = dex_promise_new (); + sysprof_document_serialize_symbols_async (document, + NULL, + sysprof_document_serialize_symbols_cb, + dex_ref (promise)); + return DEX_FUTURE (promise); +} diff --git a/src/libsysprof/sysprof-symbols-bundle.c b/src/libsysprof/sysprof-symbols-bundle.c index 0d51d9d5..326dc7ca 100644 --- a/src/libsysprof/sysprof-symbols-bundle.c +++ b/src/libsysprof/sysprof-symbols-bundle.c @@ -28,6 +28,7 @@ #include #include "sysprof-document-loader-private.h" +#include "sysprof-document-private.h" #include "sysprof-instrument-private.h" #include "sysprof-recording-private.h" @@ -50,11 +51,6 @@ G_DEFINE_FINAL_TYPE (SysprofSymbolsBundle, sysprof_symbols_bundle, SYSPROF_TYPE_ static DexFuture * sysprof_symbols_bundle_augment_fiber (gpointer user_data) { - const DexAsyncPairInfo serialize_info = DEX_ASYNC_PAIR_INFO_BOXED ( - sysprof_document_serialize_symbols_async, - sysprof_document_serialize_symbols_finish, - G_TYPE_BYTES); - g_autoptr(SysprofDocumentLoader) loader = NULL; g_autoptr(SysprofSymbolizer) elf = NULL; g_autoptr(SysprofDocument) document = NULL; @@ -83,7 +79,7 @@ sysprof_symbols_bundle_augment_fiber (gpointer user_data) return dex_future_new_for_error (g_steal_pointer (&error)); g_assert (SYSPROF_IS_DOCUMENT (document)); - if (!(bytes = dex_await_boxed (dex_async_pair_new (document, &serialize_info), &error))) + if (!(bytes = dex_await_boxed (_sysprof_document_serialize_symbols (document), &error))) return dex_future_new_for_error (g_steal_pointer (&error)); _sysprof_recording_add_file_data (recording,