mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2026-02-12 16:10:54 +00:00
libsysprof-analyze: add plumbing for symbolization
This gets the worker thread going and the state passed to eventually do symbolization through the new symbolizer API.
This commit is contained in:
@ -25,7 +25,12 @@
|
|||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
SysprofDocumentSymbols *_sysprof_document_symbols_new (SysprofDocument *document,
|
void _sysprof_document_symbols_new (SysprofDocument *document,
|
||||||
SysprofSymbolizer *symbolizer);
|
SysprofSymbolizer *symbolizer,
|
||||||
|
GCancellable *cancellable,
|
||||||
|
GAsyncReadyCallback callback,
|
||||||
|
gpointer user_data);
|
||||||
|
SysprofDocumentSymbols *_sysprof_document_symbols_new_finish (GAsyncResult *result,
|
||||||
|
GError **error);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|||||||
@ -24,8 +24,7 @@
|
|||||||
|
|
||||||
struct _SysprofDocumentSymbols
|
struct _SysprofDocumentSymbols
|
||||||
{
|
{
|
||||||
GObject parent_instance;
|
GObject parent_instance;
|
||||||
SysprofSymbolizer *symbolizer;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
G_DEFINE_FINAL_TYPE (SysprofDocumentSymbols, sysprof_document_symbols, G_TYPE_OBJECT)
|
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
|
static void
|
||||||
sysprof_document_symbols_finalize (GObject *object)
|
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);
|
G_OBJECT_CLASS (sysprof_document_symbols_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,18 +48,70 @@ sysprof_document_symbols_init (SysprofDocumentSymbols *self)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
SysprofDocumentSymbols *
|
typedef struct _Symbolize
|
||||||
_sysprof_document_symbols_new (SysprofDocument *document,
|
|
||||||
SysprofSymbolizer *symbolizer)
|
|
||||||
{
|
{
|
||||||
SysprofDocumentSymbols *self;
|
SysprofDocument *document;
|
||||||
|
SysprofSymbolizer *symbolizer;
|
||||||
|
} Symbolize;
|
||||||
|
|
||||||
g_return_val_if_fail (SYSPROF_IS_DOCUMENT (document), NULL);
|
static void
|
||||||
g_return_val_if_fail (SYSPROF_IS_SYMBOLIZER (symbolizer), NULL);
|
symbolize_free (Symbolize *state)
|
||||||
|
{
|
||||||
self = g_object_new (SYSPROF_TYPE_DOCUMENT_SYMBOLS, NULL);
|
g_clear_object (&state->document);
|
||||||
|
g_clear_object (&state->symbolizer);
|
||||||
/* TODO: async generation of symbols */
|
g_free (state);
|
||||||
|
}
|
||||||
return self;
|
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,6 +26,7 @@
|
|||||||
|
|
||||||
#include "sysprof-document.h"
|
#include "sysprof-document.h"
|
||||||
#include "sysprof-document-frame-private.h"
|
#include "sysprof-document-frame-private.h"
|
||||||
|
#include "sysprof-document-symbols-private.h"
|
||||||
|
|
||||||
struct _SysprofDocument
|
struct _SysprofDocument
|
||||||
{
|
{
|
||||||
@ -270,3 +271,58 @@ _sysprof_document_ref_string (SysprofDocument *self,
|
|||||||
|
|
||||||
return ret;
|
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);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user