lock is needed for writing after all
This commit is contained in:
parent
c55cceed8c
commit
24e587a64e
|
@ -22,12 +22,12 @@ extern MZ_DLLIMPORT int GC_is_marked(void *);
|
||||||
|
|
||||||
THREAD_LOCAL_DECL(static void **codetab_tree);
|
THREAD_LOCAL_DECL(static void **codetab_tree);
|
||||||
THREAD_LOCAL_DECL(static int during_set);
|
THREAD_LOCAL_DECL(static int during_set);
|
||||||
|
|
||||||
#ifdef MZ_USE_PLACES
|
#ifdef MZ_USE_PLACES
|
||||||
/* This table is shared but not locked; we rely on x86-TSO
|
|
||||||
and the fact that entries are only added (never removed)
|
|
||||||
to skip the lock: */
|
|
||||||
static void **shared_codetab_tree;
|
static void **shared_codetab_tree;
|
||||||
|
/* The table is shared but not locked for read; We rely on x86-TSO
|
||||||
|
and the fact that kentries are only added (never removed)
|
||||||
|
to skip the lock. */
|
||||||
|
static mzrt_mutex *shared_codetab_lock;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int do_clear_symbols(void **t, uintptr_t start, int offset, uintptr_t addr, int clearing);
|
static int do_clear_symbols(void **t, uintptr_t start, int offset, uintptr_t addr, int clearing);
|
||||||
|
@ -100,6 +100,13 @@ void scheme_jit_add_symbol(uintptr_t start, uintptr_t end, void *value, int gc_a
|
||||||
|
|
||||||
#ifdef MZ_USE_PLACES
|
#ifdef MZ_USE_PLACES
|
||||||
if (!gc_able) {
|
if (!gc_able) {
|
||||||
|
if (!shared_codetab_lock) {
|
||||||
|
/* this function will be called in the main place
|
||||||
|
before others are started, so a lazy lock creation
|
||||||
|
is ok */
|
||||||
|
mzrt_mutex_create(&shared_codetab_lock);
|
||||||
|
}
|
||||||
|
mzrt_mutex_lock(shared_codetab_lock);
|
||||||
if (!shared_codetab_tree)
|
if (!shared_codetab_tree)
|
||||||
shared_codetab_tree = malloc_node(0);
|
shared_codetab_tree = malloc_node(0);
|
||||||
the_tree = shared_codetab_tree;
|
the_tree = shared_codetab_tree;
|
||||||
|
@ -218,6 +225,12 @@ void scheme_jit_add_symbol(uintptr_t start, uintptr_t end, void *value, int gc_a
|
||||||
do_clear_symbols(the_tree, start, 0, 0, 0);
|
do_clear_symbols(the_tree, start, 0, 0, 0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef MZ_USE_PLACES
|
||||||
|
if (!gc_able) {
|
||||||
|
mzrt_mutex_unlock(shared_codetab_lock);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static int do_clear_symbols(void **t, uintptr_t start, int offset, uintptr_t addr, int clearing)
|
static int do_clear_symbols(void **t, uintptr_t start, int offset, uintptr_t addr, int clearing)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user