From e1fced48977c94a80d9937ab043449b42205a593 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 20 Apr 2011 06:55:37 -0600 Subject: [PATCH] places: clean up bad-message reporting, simplify some code --- src/racket/src/places.c | 271 +++++++++++----------------------------- 1 file changed, 71 insertions(+), 200 deletions(-) diff --git a/src/racket/src/places.c b/src/racket/src/places.c index 6418485cf2..00b3fff29e 100644 --- a/src/racket/src/places.c +++ b/src/racket/src/places.c @@ -38,7 +38,7 @@ static Scheme_Object *scheme_places_deep_copy_to_master(Scheme_Object *so); /* Scheme_Object *scheme_places_deep_copy(Scheme_Object *so); */ #if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC) -static Scheme_Object *scheme_places_deep_copy_worker(Scheme_Object *so, Scheme_Hash_Table *ht); +static Scheme_Object *scheme_places_deep_copy_worker(Scheme_Object *so, Scheme_Hash_Table **ht); #endif # ifdef MZ_PRECISE_GC @@ -763,58 +763,58 @@ static Scheme_Object *scheme_place_p(int argc, Scheme_Object *args[]) Scheme_Object *scheme_places_deep_copy(Scheme_Object *so) { #if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC) - Scheme_Object *new_so = so; - if (SCHEME_INTP(so)) { - return so; - } - - switch (so->type) { - case scheme_pair_type: - case scheme_vector_type: - case scheme_struct_type_type: - case scheme_structure_type: - { - Scheme_Hash_Table *ht; - ht = scheme_make_hash_table(SCHEME_hash_ptr); - new_so = scheme_places_deep_copy_worker(so, ht); - } - break; - default: - new_so = scheme_places_deep_copy_worker(so, NULL); - break; - } - return new_so; + Scheme_Hash_Table *ht = NULL; + return scheme_places_deep_copy_worker(so, &ht); #else return so; #endif } -#if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC) -Scheme_Object *scheme_places_deep_copy_worker(Scheme_Object *so, Scheme_Hash_Table *ht) -{ - Scheme_Object *new_so = so; - if (SCHEME_INTP(so)) { - return so; - } - if (ht) { - Scheme_Object *r; - if ((r = scheme_hash_get(ht, so))) { - return r; - } - } +static void bad_place_message(Scheme_Object *so) { + scheme_arg_mismatch("place-channel-send", + "cannot transmit a message containing value: ", + so); +} - switch (so->type) { +static Scheme_Object *trivial_copy(Scheme_Object *so) +{ + switch (SCHEME_TYPE(so)) { + case scheme_integer_type: case scheme_true_type: case scheme_false_type: case scheme_null_type: case scheme_void_type: - /* place_bi_channels are allocated in the master and can be passed along as is */ - case scheme_place_bi_channel_type: - new_so = so; - break; + case scheme_place_bi_channel_type: /* allocated in the master and can be passed along as is */ + return so; case scheme_place_type: - new_so = ((Scheme_Place *) so)->channel; + return ((Scheme_Place *) so)->channel; break; + case scheme_byte_string_type: + case scheme_flvector_type: + case scheme_fxvector_type: + if (SHARED_ALLOCATEDP(so)) + return so; + } + + return NULL; +} + +Scheme_Object *scheme_places_deep_copy_worker(Scheme_Object *so, Scheme_Hash_Table **ht) +{ + Scheme_Object *new_so = so; + + /* First, check for simple values that don't need to be hashed: */ + new_so = trivial_copy(so); + if (new_so) return new_so; + + if (*ht) { + Scheme_Object *r; + if ((r = scheme_hash_get(*ht, so))) { + return r; + } + } + + switch (SCHEME_TYPE(so)) { case scheme_char_type: new_so = scheme_make_char(SCHEME_CHAR_VAL(so)); break; @@ -850,21 +850,17 @@ Scheme_Object *scheme_places_deep_copy_worker(Scheme_Object *so, Scheme_Hash_Tab new_so = scheme_make_sized_offset_char_string(SCHEME_CHAR_STR_VAL(so), 0, SCHEME_CHAR_STRLEN_VAL(so), 1); break; case scheme_byte_string_type: - if (SHARED_ALLOCATEDP(so)) { - new_so = so; - } - else { - new_so = scheme_make_sized_offset_byte_string(SCHEME_BYTE_STR_VAL(so), 0, SCHEME_BYTE_STRLEN_VAL(so), 1); - } + /* not allocated as shared, since that's covered above */ + new_so = scheme_make_sized_offset_byte_string(SCHEME_BYTE_STR_VAL(so), 0, SCHEME_BYTE_STRLEN_VAL(so), 1); break; case scheme_unix_path_type: case scheme_windows_path_type: - new_so = scheme_make_sized_offset_path(SCHEME_BYTE_STR_VAL(so), 0, SCHEME_BYTE_STRLEN_VAL(so), 1); + new_so = scheme_make_sized_offset_kind_path(SCHEME_BYTE_STR_VAL(so), 0, SCHEME_BYTE_STRLEN_VAL(so), 1, + SCHEME_TYPE(so)); break; case scheme_symbol_type: if (SCHEME_SYM_UNINTERNEDP(so)) { - scheme_log_abort("cannot copy uninterned symbol"); - abort(); + bad_place_message(so); } else { new_so = scheme_make_sized_offset_byte_string((char *)so, SCHEME_SYMSTR_OFFSET(so), SCHEME_SYM_LEN(so), 1); new_so->type = scheme_serialized_symbol_type; @@ -900,10 +896,8 @@ Scheme_Object *scheme_places_deep_copy_worker(Scheme_Object *so, Scheme_Hash_Tab } break; case scheme_fxvector_type: - if (SHARED_ALLOCATEDP(so)) { - new_so = so; - } - else { + /* not allocated as shared, since that's covered above */ + { Scheme_Vector *vec; intptr_t i; intptr_t size = SCHEME_FXVEC_SIZE(so); @@ -916,10 +910,8 @@ Scheme_Object *scheme_places_deep_copy_worker(Scheme_Object *so, Scheme_Hash_Tab } break; case scheme_flvector_type: - if (SHARED_ALLOCATEDP(so)) { - new_so = so; - } - else { + /* not allocated as shared, since that's covered above */ + { Scheme_Double_Vector *vec; intptr_t i; intptr_t size = SCHEME_FLVEC_SIZE(so); @@ -942,18 +934,14 @@ Scheme_Object *scheme_places_deep_copy_worker(Scheme_Object *so, Scheme_Hash_Tab int local_slots = stype->num_slots - (ptype ? ptype->num_slots : 0); int i = 0; - if (!stype->prefab_key) { - scheme_log_abort("cannot copy non prefab structure"); - abort(); - } - { - for (i = 0; i < local_slots; i++) { - if (!stype->immutables || stype->immutables[i] != 1) { - scheme_log_abort("cannot copy mutable prefab structure"); - abort(); - } + if (!stype->prefab_key) + bad_place_message(so); + for (i = 0; i < local_slots; i++) { + if (!stype->immutables || stype->immutables[i] != 1) { + bad_place_message(so); } } + nprefab_key = scheme_places_deep_copy_worker(stype->prefab_key, ht); nst = (Scheme_Serialized_Structure*) scheme_make_serialized_struct_instance(nprefab_key, size); for (i = 0; i type) { - case scheme_true_type: - case scheme_false_type: - case scheme_null_type: - case scheme_void_type: - /* place_bi_channels are allocated in the master and can be passed along as is */ - case scheme_place_bi_channel_type: - return so; - default: - break; - } + new_so = trivial_copy(so); + if (new_so) return new_so; GC_create_message_allocator(); new_so = scheme_places_deep_copy(so); @@ -1283,18 +1258,8 @@ Scheme_Object *scheme_places_deserialize(Scheme_Object *so, void *msg_memory) { #if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC) Scheme_Object *new_so; - if (SCHEME_INTP(so)) { return so; } - switch (so->type) { - case scheme_true_type: - case scheme_false_type: - case scheme_null_type: - case scheme_void_type: - /* place_bi_channels are allocated in the master and can be passed along as is */ - case scheme_place_bi_channel_type: - return so; - default: - break; - } + new_so = trivial_copy(so); + if (new_so) return new_so; /* small messages are deamed to be < 1k, this could be tuned in either direction */ if (GC_message_allocator_size(msg_memory) < 1024) { @@ -1356,100 +1321,6 @@ Scheme_Object *scheme_place_receive(int argc, Scheme_Object *args[]) { } # ifdef MZ_PRECISE_GC -void force_hash_worker(Scheme_Object *so, Scheme_Hash_Table *ht); -Scheme_Hash_Table *force_hash(Scheme_Object *so) { - if (SCHEME_INTP(so)) { - return NULL; - } - - switch (so->type) { - case scheme_pair_type: - case scheme_vector_type: - case scheme_struct_type_type: - case scheme_structure_type: - { - Scheme_Hash_Table *ht; - ht = scheme_make_hash_table(SCHEME_hash_ptr); - force_hash_worker(so, ht); - return ht; - } - break; - default: - break; - } - return NULL; -} - -void force_hash_worker(Scheme_Object *so, Scheme_Hash_Table *ht) -{ - if (SCHEME_INTP(so)) { - return; - } - if (ht) { - Scheme_Object *r; - if ((r = scheme_hash_get(ht, so))) { - return; - } - } - - switch (so->type) { - case scheme_true_type: - case scheme_false_type: - case scheme_null_type: - case scheme_char_type: - case scheme_rational_type: - case scheme_float_type: - case scheme_double_type: - case scheme_complex_type: - case scheme_char_string_type: - case scheme_byte_string_type: - case scheme_unix_path_type: - case scheme_symbol_type: - case scheme_place_bi_channel_type: - case scheme_flvector_type: - break; - case scheme_pair_type: - { - force_hash_worker(SCHEME_CAR(so), ht); - force_hash_worker(SCHEME_CDR(so), ht); - } - break; - case scheme_vector_type: - { - intptr_t i; - intptr_t size = SCHEME_VEC_SIZE(so); - for (i = 0; i stype; - intptr_t i; - intptr_t size = stype->num_slots; - - if (stype->prefab_key) - force_hash_worker((Scheme_Object*)stype->prefab_key, ht); - - for (i = 0; i slots[i], ht); - } - } - break; - case scheme_resolved_module_path_type: - default: - scheme_log_abort("cannot force hash"); - abort(); - break; - } - if (ht) { - scheme_hash_set(ht, so, NULL); - } - return; -} - void scheme_spawn_master_place() { mzrt_proc_first_thread_init();