mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2026-02-10 07:00:53 +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 *
|
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,
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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),
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user