libsysprof: add trailing empty kernel node

This can be used so that we always know a symbol will be after the returned
symbol (so we can look for peer address).
This commit is contained in:
Christian Hergert
2019-05-28 13:54:14 -07:00
parent 6e3632c0e5
commit 649dcf3aac

View File

@ -111,6 +111,7 @@ do_shared_init (void)
SysprofKernelSymbols *
_sysprof_kernel_symbols_new_from_kallsyms (SysprofKallsyms *kallsyms)
{
static const SysprofKernelSymbol empty = {0};
SysprofKernelSymbols *self;
const gchar *name;
guint64 addr;
@ -123,6 +124,7 @@ _sysprof_kernel_symbols_new_from_kallsyms (SysprofKallsyms *kallsyms)
self = g_array_new (FALSE, FALSE, sizeof (SysprofKernelSymbol));
G_LOCK (kernel_lock);
while (sysprof_kallsyms_next (kallsyms, &name, &addr, &type))
{
if (!type_is_ignored (type))
@ -135,10 +137,14 @@ _sysprof_kernel_symbols_new_from_kallsyms (SysprofKallsyms *kallsyms)
g_array_append_val (self, sym);
}
}
G_UNLOCK (kernel_lock);
g_array_sort (self, sysprof_kernel_symbol_compare);
/* Always add a trailing node */
g_array_append_val (self, empty);
G_UNLOCK (kernel_lock);
return g_steal_pointer (&self);
}
@ -224,7 +230,8 @@ _sysprof_kernel_symbols_lookup (const SysprofKernelSymbols *self,
ret = sysprof_kernel_symbol_lookup ((SysprofKernelSymbol *)(gpointer)self->data,
address,
0,
self->len - 1);
/* 1 for right-most, 1 for empty node */
self->len - 2);
/* We resolve all symbols, including ignored symbols so that we
* don't give back the wrong function juxtapose an ignored func.