lock is needed for writing after all

This commit is contained in:
Matthew Flatt 2011-09-16 14:38:03 -06:00
parent c55cceed8c
commit 24e587a64e

View File

@ -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)