mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2026-02-12 16:10:54 +00:00
libsysprof-analyze: bsearch jitmap for matching address
This commit is contained in:
@ -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,8 +71,8 @@ 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;
|
||||||
const Jitmap *jitmap_b = b;
|
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);
|
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);
|
||||||
|
|
||||||
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
|
static void
|
||||||
|
|||||||
Reference in New Issue
Block a user