[Places] prevent green thread switch during master allocation
This commit is contained in:
parent
918f2caf34
commit
4f29962d9c
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user