From fb80527d225e52581218f8e8b6cd5905bcd4e9bd Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Mon, 22 May 2023 13:30:04 -0700 Subject: [PATCH] libsysprof-analyze: bsearch jitmap for matching address --- .../sysprof-jitmap-symbolizer.c | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/libsysprof-analyze/sysprof-jitmap-symbolizer.c b/src/libsysprof-analyze/sysprof-jitmap-symbolizer.c index 5a31b6c7..3e08d870 100644 --- a/src/libsysprof-analyze/sysprof-jitmap-symbolizer.c +++ b/src/libsysprof-analyze/sysprof-jitmap-symbolizer.c @@ -20,6 +20,8 @@ #include "config.h" +#include + #include "sysprof-document-jitmap.h" #include "sysprof-document-private.h" #include "sysprof-jitmap-symbolizer.h" @@ -69,8 +71,8 @@ jitmap_clear (gpointer data) } static int -sort_by_address (gconstpointer a, - gconstpointer b) +compare_by_address (gconstpointer a, + gconstpointer b) { const Jitmap *jitmap_a = a; const Jitmap *jitmap_b = b; @@ -120,7 +122,7 @@ sysprof_jitmap_symbolizer_prepare_worker (GTask *task, } } - g_array_sort (self->jitmaps, sort_by_address); + g_array_sort (self->jitmaps, compare_by_address); g_task_return_boolean (task, TRUE); } @@ -170,7 +172,9 @@ sysprof_jitmap_symbolizer_symbolize (SysprofSymbolizer *symbolizer, SysprofAddress address) { SysprofJitmapSymbolizer *self = (SysprofJitmapSymbolizer *)symbolizer; + const Jitmap key = { address, NULL }; guint guess = (address & 0xFFFF) - 1; + const Jitmap *match; if (context != SYSPROF_ADDRESS_CONTEXT_NONE && context != SYSPROF_ADDRESS_CONTEXT_USER) @@ -186,19 +190,27 @@ sysprof_jitmap_symbolizer_symbolize (SysprofSymbolizer *symbolizer, */ if G_LIKELY (guess < self->jitmaps->len) { - const Jitmap *j = &g_array_index (self->jitmaps, Jitmap, guess); + match = &g_array_index (self->jitmaps, Jitmap, guess); - if G_LIKELY (j->address == address) - return _sysprof_symbol_new (g_ref_string_acquire (j->name), - NULL, - NULL, - j->address, - j->address + 1); + if G_LIKELY (match->address == address) + goto create_symbol; } - /* TODO: Binary search for match */ + match = bsearch (&key, + self->jitmaps->data, + self->jitmaps->len, + sizeof (Jitmap), + compare_by_address); - return NULL; + if (match == NULL) + return NULL; + +create_symbol: + return _sysprof_symbol_new (g_ref_string_acquire (match->name), + NULL, + NULL, + match->address, + match->address + 1); } static void