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:
Christian Hergert
2023-05-11 13:09:50 -07:00
parent 5abad47160
commit 5d5f0a5085
7 changed files with 24 additions and 15 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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