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 * static SysprofSymbol *
sysprof_bundled_symbolizer_symbolize (SysprofSymbolizer *symbolizer, sysprof_bundled_symbolizer_symbolize (SysprofSymbolizer *symbolizer,
SysprofStrings *strings,
const SysprofProcessInfo *process_info, const SysprofProcessInfo *process_info,
SysprofAddress address) SysprofAddress address)
{ {
@ -202,11 +203,11 @@ sysprof_bundled_symbolizer_symbolize (SysprofSymbolizer *symbolizer,
if (ret->tag_offset > 0) if (ret->tag_offset > 0)
{ {
if (ret->tag_offset < (self->endptr - self->beginptr)) 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)) 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), g_steal_pointer (&tag),
NULL, NULL,
ret->addr_begin, ret->addr_begin,

View File

@ -27,6 +27,7 @@
G_BEGIN_DECLS G_BEGIN_DECLS
void _sysprof_document_symbols_new (SysprofDocument *document, void _sysprof_document_symbols_new (SysprofDocument *document,
SysprofStrings *strings,
SysprofSymbolizer *symbolizer, SysprofSymbolizer *symbolizer,
GHashTable *pid_to_process_info, GHashTable *pid_to_process_info,
GCancellable *cancellable, GCancellable *cancellable,

View File

@ -66,6 +66,7 @@ typedef struct _Symbolize
SysprofDocument *document; SysprofDocument *document;
SysprofSymbolizer *symbolizer; SysprofSymbolizer *symbolizer;
SysprofDocumentSymbols *symbols; SysprofDocumentSymbols *symbols;
SysprofStrings *strings;
GHashTable *pid_to_process_info; GHashTable *pid_to_process_info;
} Symbolize; } Symbolize;
@ -75,27 +76,25 @@ symbolize_free (Symbolize *state)
g_clear_object (&state->document); g_clear_object (&state->document);
g_clear_object (&state->symbolizer); g_clear_object (&state->symbolizer);
g_clear_object (&state->symbols); 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_clear_pointer (&state->pid_to_process_info, g_hash_table_unref);
g_free (state); g_free (state);
} }
static void static void
sysprof_document_symbols_add_traceable (SysprofDocumentSymbols *self, add_traceable (SysprofStrings *strings,
SysprofProcessInfo *process_info, SysprofProcessInfo *process_info,
SysprofDocumentTraceable *traceable, SysprofDocumentTraceable *traceable,
SysprofSymbolizer *symbolizer) SysprofSymbolizer *symbolizer)
{ {
SysprofAddressContext last_context; SysprofAddressContext last_context;
guint64 *addresses; guint64 *addresses;
guint n_addresses; guint n_addresses;
int pid;
g_assert (SYSPROF_IS_DOCUMENT_SYMBOLS (self));
g_assert (process_info != NULL); g_assert (process_info != NULL);
g_assert (SYSPROF_IS_DOCUMENT_TRACEABLE (traceable)); g_assert (SYSPROF_IS_DOCUMENT_TRACEABLE (traceable));
g_assert (SYSPROF_IS_SYMBOLIZER (symbolizer)); 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); n_addresses = sysprof_document_traceable_get_stack_depth (traceable);
addresses = g_alloca (sizeof (guint64) * n_addresses); addresses = g_alloca (sizeof (guint64) * n_addresses);
sysprof_document_traceable_get_stack_addresses (traceable, addresses, n_addresses); sysprof_document_traceable_get_stack_addresses (traceable, addresses, n_addresses);
@ -117,7 +116,7 @@ sysprof_document_symbols_add_traceable (SysprofDocumentSymbols *self,
} }
else 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) if (symbol != NULL)
sysprof_symbol_cache_take (process_info->symbol_cache, g_steal_pointer (&symbol)); 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) if (process_info == NULL)
continue; 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)); while (gtk_bitset_iter_next (&iter, &i));
} }
@ -202,6 +201,7 @@ sysprof_document_symbols_worker (GTask *task,
void void
_sysprof_document_symbols_new (SysprofDocument *document, _sysprof_document_symbols_new (SysprofDocument *document,
SysprofStrings *strings,
SysprofSymbolizer *symbolizer, SysprofSymbolizer *symbolizer,
GHashTable *pid_to_process_info, GHashTable *pid_to_process_info,
GCancellable *cancellable, GCancellable *cancellable,
@ -218,6 +218,7 @@ _sysprof_document_symbols_new (SysprofDocument *document,
state->document = g_object_ref (document); state->document = g_object_ref (document);
state->symbolizer = g_object_ref (symbolizer); state->symbolizer = g_object_ref (symbolizer);
state->symbols = g_object_new (SYSPROF_TYPE_DOCUMENT_SYMBOLS, NULL); 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); state->pid_to_process_info = g_hash_table_ref (pid_to_process_info);
task = g_task_new (NULL, cancellable, callback, user_data); 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)); g_task_return_error (task, g_steal_pointer (&error));
else else
_sysprof_document_symbols_new (g_task_get_source_object (task), _sysprof_document_symbols_new (g_task_get_source_object (task),
self->strings,
symbolizer, symbolizer,
self->pid_to_process_info, self->pid_to_process_info,
g_task_get_cancellable (task), g_task_get_cancellable (task),

View File

@ -119,6 +119,7 @@ sysprof_multi_symbolizer_prepare_finish (SysprofSymbolizer *symbolizer,
static SysprofSymbol * static SysprofSymbol *
sysprof_multi_symbolizer_symbolize (SysprofSymbolizer *symbolizer, sysprof_multi_symbolizer_symbolize (SysprofSymbolizer *symbolizer,
SysprofStrings *strings,
const SysprofProcessInfo *process_info, const SysprofProcessInfo *process_info,
SysprofAddress address) SysprofAddress address)
{ {
@ -127,7 +128,7 @@ sysprof_multi_symbolizer_symbolize (SysprofSymbolizer *symbolizer,
for (guint i = 0; i < self->symbolizers->len; i++) for (guint i = 0; i < self->symbolizers->len; i++)
{ {
SysprofSymbolizer *child = g_ptr_array_index (self->symbolizers, 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) if (symbol != NULL)
return symbol; return symbol;

View File

@ -22,10 +22,11 @@
#include "sysprof-address-layout-private.h" #include "sysprof-address-layout-private.h"
#include "sysprof-document.h" #include "sysprof-document.h"
#include "sysprof-symbol.h"
#include "sysprof-symbolizer.h"
#include "sysprof-mount-namespace-private.h" #include "sysprof-mount-namespace-private.h"
#include "sysprof-process-info-private.h" #include "sysprof-process-info-private.h"
#include "sysprof-strings-private.h"
#include "sysprof-symbol.h"
#include "sysprof-symbolizer.h"
G_BEGIN_DECLS G_BEGIN_DECLS
@ -49,6 +50,7 @@ struct _SysprofSymbolizerClass
GAsyncResult *result, GAsyncResult *result,
GError **error); GError **error);
SysprofSymbol *(*symbolize) (SysprofSymbolizer *self, SysprofSymbol *(*symbolize) (SysprofSymbolizer *self,
SysprofStrings *strings,
const SysprofProcessInfo *process_info, const SysprofProcessInfo *process_info,
SysprofAddress address); SysprofAddress address);
}; };
@ -63,6 +65,7 @@ gboolean _sysprof_symbolizer_prepare_finish (SysprofSymbolizer *se
GAsyncResult *result, GAsyncResult *result,
GError **error); GError **error);
SysprofSymbol *_sysprof_symbolizer_symbolize (SysprofSymbolizer *self, SysprofSymbol *_sysprof_symbolizer_symbolize (SysprofSymbolizer *self,
SysprofStrings *strings,
const SysprofProcessInfo *process_info, const SysprofProcessInfo *process_info,
SysprofAddress address); SysprofAddress address);

View File

@ -92,8 +92,9 @@ _sysprof_symbolizer_prepare_finish (SysprofSymbolizer *self,
SysprofSymbol * SysprofSymbol *
_sysprof_symbolizer_symbolize (SysprofSymbolizer *self, _sysprof_symbolizer_symbolize (SysprofSymbolizer *self,
SysprofStrings *strings,
const SysprofProcessInfo *process_info, const SysprofProcessInfo *process_info,
SysprofAddress address) 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);
} }