[Places] prevent green thread switch during master allocation

This commit is contained in:
Kevin Tew 2010-04-15 18:10:50 -04:00
parent 918f2caf34
commit 4f29962d9c
3 changed files with 18 additions and 0 deletions

View File

@ -587,6 +587,7 @@ Scheme_Struct_Type *scheme_make_prefab_struct_type_in_master(Scheme_Object *base
# ifdef MZ_PRECISE_GC
original_gc = GC_switch_to_master_gc();
scheme_start_atomic();
# endif
cname = scheme_places_deep_copy(base);
@ -598,6 +599,7 @@ Scheme_Struct_Type *scheme_make_prefab_struct_type_in_master(Scheme_Object *base
stype = scheme_make_prefab_struct_type_raw(cname, parent, num_fields, num_uninit_fields, cuninit_val, cimm_array);
# ifdef MZ_PRECISE_GC
scheme_end_atomic_no_swap();
GC_switch_back_from_master(original_gc);
# endif
@ -853,9 +855,11 @@ void* scheme_master_fast_path(int msg_type, void *msg_payload) {
# ifdef MZ_PRECISE_GC
original_gc = GC_switch_to_master_gc();
scheme_start_atomic();
# endif
o = scheme_master_place_handlemsg(msg_type, msg_payload);
# ifdef MZ_PRECISE_GC
scheme_end_atomic_no_swap();
GC_switch_back_from_master(original_gc);
# endif

View File

@ -2008,9 +2008,13 @@ static void putenv_str_table_put_name(Scheme_Object *name, Scheme_Object *value)
void *original_gc;
Scheme_Object *name_copy;
original_gc = GC_switch_to_master_gc();
scheme_start_atomic();
name_copy = (Scheme_Object *) clone_str_with_gc((const char *) name);
create_putenv_str_table_if_needed();
scheme_hash_set(putenv_str_table, name_copy, value);
scheme_end_atomic_no_swap();
GC_switch_back_from_master(original_gc);
#else
create_putenv_str_table_if_needed();
@ -2026,10 +2030,14 @@ static void putenv_str_table_put_name_value(Scheme_Object *name, Scheme_Object *
Scheme_Object *name_copy;
Scheme_Object *value_copy;
original_gc = GC_switch_to_master_gc();
scheme_start_atomic();
name_copy = (Scheme_Object *) clone_str_with_gc((const char *) name);
value_copy = (Scheme_Object *) clone_str_with_gc((const char *) value);
create_putenv_str_table_if_needed();
scheme_hash_set(putenv_str_table, name_copy, value_copy);
scheme_end_atomic_no_swap();
GC_switch_back_from_master(original_gc);
#else
create_putenv_str_table_if_needed();
@ -2044,8 +2052,12 @@ static Scheme_Object *putenv_str_table_get(Scheme_Object *name) {
void *original_gc;
Scheme_Object *value;
original_gc = GC_switch_to_master_gc();
scheme_start_atomic();
create_putenv_str_table_if_needed();
value = scheme_hash_get(putenv_str_table, name);
scheme_end_atomic_no_swap();
GC_switch_back_from_master(original_gc);
return value;
#else

View File

@ -3994,6 +3994,7 @@ static Scheme_Struct_Type *lookup_prefab(Scheme_Object *key) {
# if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC)
void *original_gc;
original_gc = GC_switch_to_master_gc();
scheme_start_atomic();
# endif
if (prefab_table) {
@ -4001,6 +4002,7 @@ static Scheme_Struct_Type *lookup_prefab(Scheme_Object *key) {
}
# if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC)
scheme_end_atomic_no_swap();
GC_switch_back_from_master(original_gc);
# endif