Use the GDB JIT API in a thread-safe manner.

Thanks to Peter Cawley.
This commit is contained in:
Mike Pall 2016-05-03 18:30:01 +02:00
parent ac42037db0
commit 221268b17d

View File

@ -719,6 +719,20 @@ static void gdbjit_buildobj(GDBJITctx *ctx)
/* -- Interface to GDB JIT API -------------------------------------------- */
static int gdbjit_lock;
static void gdbjit_lock_acquire()
{
while (__sync_lock_test_and_set(&gdbjit_lock, 1)) {
/* Just spin; futexes or pthreads aren't worth the portability cost. */
}
}
static void gdbjit_lock_release()
{
__sync_lock_release(&gdbjit_lock);
}
/* Add new entry to GDB JIT symbol chain. */
static void gdbjit_newentry(lua_State *L, GDBJITctx *ctx)
{
@ -730,6 +744,7 @@ static void gdbjit_newentry(lua_State *L, GDBJITctx *ctx)
ctx->T->gdbjit_entry = (void *)eo;
/* Link new entry to chain and register it. */
eo->entry.prev_entry = NULL;
gdbjit_lock_acquire();
eo->entry.next_entry = __jit_debug_descriptor.first_entry;
if (eo->entry.next_entry)
eo->entry.next_entry->prev_entry = &eo->entry;
@ -739,6 +754,7 @@ static void gdbjit_newentry(lua_State *L, GDBJITctx *ctx)
__jit_debug_descriptor.relevant_entry = &eo->entry;
__jit_debug_descriptor.action_flag = GDBJIT_REGISTER;
__jit_debug_register_code();
gdbjit_lock_release();
}
/* Add debug info for newly compiled trace and notify GDB. */
@ -770,6 +786,7 @@ void lj_gdbjit_deltrace(jit_State *J, GCtrace *T)
{
GDBJITentryobj *eo = (GDBJITentryobj *)T->gdbjit_entry;
if (eo) {
gdbjit_lock_acquire();
if (eo->entry.prev_entry)
eo->entry.prev_entry->next_entry = eo->entry.next_entry;
else
@ -779,6 +796,7 @@ void lj_gdbjit_deltrace(jit_State *J, GCtrace *T)
__jit_debug_descriptor.relevant_entry = &eo->entry;
__jit_debug_descriptor.action_flag = GDBJIT_UNREGISTER;
__jit_debug_register_code();
gdbjit_lock_release();
lj_mem_free(J2G(J), eo, eo->sz);
}
}