From 649dcf3aac7fec50c38e42b57ae450607a294d49 Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Tue, 28 May 2019 13:54:14 -0700 Subject: [PATCH] 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). --- src/libsysprof/sysprof-kernel-symbol.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/libsysprof/sysprof-kernel-symbol.c b/src/libsysprof/sysprof-kernel-symbol.c index 3213c8be..98d5f7b3 100644 --- a/src/libsysprof/sysprof-kernel-symbol.c +++ b/src/libsysprof/sysprof-kernel-symbol.c @@ -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.