mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2025-12-31 20:36:25 +00:00
libsysprof-analyze: plumb access to string pooling
We want various subsystems to start using this, but we need to plumb it to the symbolizers to take advantage of it.
This commit is contained in:
@ -170,6 +170,7 @@ search_for_symbol_cb (gconstpointer a,
|
||||
|
||||
static SysprofSymbol *
|
||||
sysprof_bundled_symbolizer_symbolize (SysprofSymbolizer *symbolizer,
|
||||
SysprofStrings *strings,
|
||||
const SysprofProcessInfo *process_info,
|
||||
SysprofAddress address)
|
||||
{
|
||||
@ -202,11 +203,11 @@ sysprof_bundled_symbolizer_symbolize (SysprofSymbolizer *symbolizer,
|
||||
if (ret->tag_offset > 0)
|
||||
{
|
||||
if (ret->tag_offset < (self->endptr - self->beginptr))
|
||||
tag = g_ref_string_new (&self->beginptr[ret->tag_offset]);
|
||||
tag = sysprof_strings_get (strings, &self->beginptr[ret->tag_offset]);
|
||||
}
|
||||
|
||||
if (ret->offset < (self->endptr - self->beginptr))
|
||||
return _sysprof_symbol_new (g_ref_string_new (&self->beginptr[ret->offset]),
|
||||
return _sysprof_symbol_new (sysprof_strings_get (strings, &self->beginptr[ret->offset]),
|
||||
g_steal_pointer (&tag),
|
||||
NULL,
|
||||
ret->addr_begin,
|
||||
|
||||
@ -27,6 +27,7 @@
|
||||
G_BEGIN_DECLS
|
||||
|
||||
void _sysprof_document_symbols_new (SysprofDocument *document,
|
||||
SysprofStrings *strings,
|
||||
SysprofSymbolizer *symbolizer,
|
||||
GHashTable *pid_to_process_info,
|
||||
GCancellable *cancellable,
|
||||
|
||||
@ -66,6 +66,7 @@ typedef struct _Symbolize
|
||||
SysprofDocument *document;
|
||||
SysprofSymbolizer *symbolizer;
|
||||
SysprofDocumentSymbols *symbols;
|
||||
SysprofStrings *strings;
|
||||
GHashTable *pid_to_process_info;
|
||||
} Symbolize;
|
||||
|
||||
@ -75,27 +76,25 @@ symbolize_free (Symbolize *state)
|
||||
g_clear_object (&state->document);
|
||||
g_clear_object (&state->symbolizer);
|
||||
g_clear_object (&state->symbols);
|
||||
g_clear_pointer (&state->strings, sysprof_strings_unref);
|
||||
g_clear_pointer (&state->pid_to_process_info, g_hash_table_unref);
|
||||
g_free (state);
|
||||
}
|
||||
|
||||
static void
|
||||
sysprof_document_symbols_add_traceable (SysprofDocumentSymbols *self,
|
||||
SysprofProcessInfo *process_info,
|
||||
SysprofDocumentTraceable *traceable,
|
||||
SysprofSymbolizer *symbolizer)
|
||||
add_traceable (SysprofStrings *strings,
|
||||
SysprofProcessInfo *process_info,
|
||||
SysprofDocumentTraceable *traceable,
|
||||
SysprofSymbolizer *symbolizer)
|
||||
{
|
||||
SysprofAddressContext last_context;
|
||||
guint64 *addresses;
|
||||
guint n_addresses;
|
||||
int pid;
|
||||
|
||||
g_assert (SYSPROF_IS_DOCUMENT_SYMBOLS (self));
|
||||
g_assert (process_info != NULL);
|
||||
g_assert (SYSPROF_IS_DOCUMENT_TRACEABLE (traceable));
|
||||
g_assert (SYSPROF_IS_SYMBOLIZER (symbolizer));
|
||||
|
||||
pid = sysprof_document_frame_get_pid (SYSPROF_DOCUMENT_FRAME (traceable));
|
||||
n_addresses = sysprof_document_traceable_get_stack_depth (traceable);
|
||||
addresses = g_alloca (sizeof (guint64) * n_addresses);
|
||||
sysprof_document_traceable_get_stack_addresses (traceable, addresses, n_addresses);
|
||||
@ -117,7 +116,7 @@ sysprof_document_symbols_add_traceable (SysprofDocumentSymbols *self,
|
||||
}
|
||||
else
|
||||
{
|
||||
g_autoptr(SysprofSymbol) symbol = _sysprof_symbolizer_symbolize (symbolizer, process_info, address);
|
||||
g_autoptr(SysprofSymbol) symbol = _sysprof_symbolizer_symbolize (symbolizer, strings, process_info, address);
|
||||
|
||||
if (symbol != NULL)
|
||||
sysprof_symbol_cache_take (process_info->symbol_cache, g_steal_pointer (&symbol));
|
||||
@ -190,7 +189,7 @@ sysprof_document_symbols_worker (GTask *task,
|
||||
if (process_info == NULL)
|
||||
continue;
|
||||
|
||||
sysprof_document_symbols_add_traceable (state->symbols, process_info, traceable, state->symbolizer);
|
||||
add_traceable (state->strings, process_info, traceable, state->symbolizer);
|
||||
}
|
||||
while (gtk_bitset_iter_next (&iter, &i));
|
||||
}
|
||||
@ -202,6 +201,7 @@ sysprof_document_symbols_worker (GTask *task,
|
||||
|
||||
void
|
||||
_sysprof_document_symbols_new (SysprofDocument *document,
|
||||
SysprofStrings *strings,
|
||||
SysprofSymbolizer *symbolizer,
|
||||
GHashTable *pid_to_process_info,
|
||||
GCancellable *cancellable,
|
||||
@ -218,6 +218,7 @@ _sysprof_document_symbols_new (SysprofDocument *document,
|
||||
state->document = g_object_ref (document);
|
||||
state->symbolizer = g_object_ref (symbolizer);
|
||||
state->symbols = g_object_new (SYSPROF_TYPE_DOCUMENT_SYMBOLS, NULL);
|
||||
state->strings = sysprof_strings_ref (strings);
|
||||
state->pid_to_process_info = g_hash_table_ref (pid_to_process_info);
|
||||
|
||||
task = g_task_new (NULL, cancellable, callback, user_data);
|
||||
|
||||
@ -594,6 +594,7 @@ sysprof_document_symbolize_prepare_cb (GObject *object,
|
||||
g_task_return_error (task, g_steal_pointer (&error));
|
||||
else
|
||||
_sysprof_document_symbols_new (g_task_get_source_object (task),
|
||||
self->strings,
|
||||
symbolizer,
|
||||
self->pid_to_process_info,
|
||||
g_task_get_cancellable (task),
|
||||
|
||||
@ -119,6 +119,7 @@ sysprof_multi_symbolizer_prepare_finish (SysprofSymbolizer *symbolizer,
|
||||
|
||||
static SysprofSymbol *
|
||||
sysprof_multi_symbolizer_symbolize (SysprofSymbolizer *symbolizer,
|
||||
SysprofStrings *strings,
|
||||
const SysprofProcessInfo *process_info,
|
||||
SysprofAddress address)
|
||||
{
|
||||
@ -127,7 +128,7 @@ sysprof_multi_symbolizer_symbolize (SysprofSymbolizer *symbolizer,
|
||||
for (guint i = 0; i < self->symbolizers->len; i++)
|
||||
{
|
||||
SysprofSymbolizer *child = g_ptr_array_index (self->symbolizers, i);
|
||||
SysprofSymbol *symbol = _sysprof_symbolizer_symbolize (child, process_info, address);
|
||||
SysprofSymbol *symbol = _sysprof_symbolizer_symbolize (child, strings, process_info, address);
|
||||
|
||||
if (symbol != NULL)
|
||||
return symbol;
|
||||
|
||||
@ -22,10 +22,11 @@
|
||||
|
||||
#include "sysprof-address-layout-private.h"
|
||||
#include "sysprof-document.h"
|
||||
#include "sysprof-symbol.h"
|
||||
#include "sysprof-symbolizer.h"
|
||||
#include "sysprof-mount-namespace-private.h"
|
||||
#include "sysprof-process-info-private.h"
|
||||
#include "sysprof-strings-private.h"
|
||||
#include "sysprof-symbol.h"
|
||||
#include "sysprof-symbolizer.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
@ -49,6 +50,7 @@ struct _SysprofSymbolizerClass
|
||||
GAsyncResult *result,
|
||||
GError **error);
|
||||
SysprofSymbol *(*symbolize) (SysprofSymbolizer *self,
|
||||
SysprofStrings *strings,
|
||||
const SysprofProcessInfo *process_info,
|
||||
SysprofAddress address);
|
||||
};
|
||||
@ -63,6 +65,7 @@ gboolean _sysprof_symbolizer_prepare_finish (SysprofSymbolizer *se
|
||||
GAsyncResult *result,
|
||||
GError **error);
|
||||
SysprofSymbol *_sysprof_symbolizer_symbolize (SysprofSymbolizer *self,
|
||||
SysprofStrings *strings,
|
||||
const SysprofProcessInfo *process_info,
|
||||
SysprofAddress address);
|
||||
|
||||
|
||||
@ -92,8 +92,9 @@ _sysprof_symbolizer_prepare_finish (SysprofSymbolizer *self,
|
||||
|
||||
SysprofSymbol *
|
||||
_sysprof_symbolizer_symbolize (SysprofSymbolizer *self,
|
||||
SysprofStrings *strings,
|
||||
const SysprofProcessInfo *process_info,
|
||||
SysprofAddress address)
|
||||
{
|
||||
return SYSPROF_SYMBOLIZER_GET_CLASS (self)->symbolize (self, process_info, address);
|
||||
return SYSPROF_SYMBOLIZER_GET_CLASS (self)->symbolize (self, strings, process_info, address);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user