libsysprof-analyze: bsearch jitmap for matching address

This commit is contained in:
Christian Hergert
2023-05-22 13:30:04 -07:00
parent 9e5a241fef
commit fb80527d22

View File

@ -20,6 +20,8 @@
#include "config.h" #include "config.h"
#include <stdlib.h>
#include "sysprof-document-jitmap.h" #include "sysprof-document-jitmap.h"
#include "sysprof-document-private.h" #include "sysprof-document-private.h"
#include "sysprof-jitmap-symbolizer.h" #include "sysprof-jitmap-symbolizer.h"
@ -69,7 +71,7 @@ jitmap_clear (gpointer data)
} }
static int static int
sort_by_address (gconstpointer a, compare_by_address (gconstpointer a,
gconstpointer b) gconstpointer b)
{ {
const Jitmap *jitmap_a = a; const Jitmap *jitmap_a = a;
@ -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); g_task_return_boolean (task, TRUE);
} }
@ -170,7 +172,9 @@ sysprof_jitmap_symbolizer_symbolize (SysprofSymbolizer *symbolizer,
SysprofAddress address) SysprofAddress address)
{ {
SysprofJitmapSymbolizer *self = (SysprofJitmapSymbolizer *)symbolizer; SysprofJitmapSymbolizer *self = (SysprofJitmapSymbolizer *)symbolizer;
const Jitmap key = { address, NULL };
guint guess = (address & 0xFFFF) - 1; guint guess = (address & 0xFFFF) - 1;
const Jitmap *match;
if (context != SYSPROF_ADDRESS_CONTEXT_NONE && if (context != SYSPROF_ADDRESS_CONTEXT_NONE &&
context != SYSPROF_ADDRESS_CONTEXT_USER) context != SYSPROF_ADDRESS_CONTEXT_USER)
@ -186,19 +190,27 @@ sysprof_jitmap_symbolizer_symbolize (SysprofSymbolizer *symbolizer,
*/ */
if G_LIKELY (guess < self->jitmaps->len) 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) if G_LIKELY (match->address == address)
return _sysprof_symbol_new (g_ref_string_acquire (j->name), goto create_symbol;
NULL,
NULL,
j->address,
j->address + 1);
} }
/* TODO: Binary search for match */ match = bsearch (&key,
self->jitmaps->data,
self->jitmaps->len,
sizeof (Jitmap),
compare_by_address);
if (match == NULL)
return NULL; return NULL;
create_symbol:
return _sysprof_symbol_new (g_ref_string_acquire (match->name),
NULL,
NULL,
match->address,
match->address + 1);
} }
static void static void