fix symbol handling in long-message transfer

as well as stack-overflow handling
This commit is contained in:
Matthew Flatt 2011-05-11 15:04:20 -06:00
parent 2bc97ccf59
commit 8492f7c90b
5 changed files with 25 additions and 44 deletions

View File

@ -129,6 +129,14 @@
(define len 1000000)
(define intern-num-sym
(let ([ht (make-hash)])
(lambda (k)
(hash-ref ht k
(lambda ()
(hash-set! ht k (string->symbol (format "~s" k)))
(hash-ref ht k))))))
(define-syntax-rule (test-long msg desc)
(begin
(define l (build-list len msg))
@ -136,8 +144,15 @@
(printf "Master ~a length ~a\n" desc ll)
(define p (place/anon ch
(define wl (length (place-channel-receive ch)))
(define l (place-channel-receive ch))
(define wl (length l))
(printf "Worker length ~a\n" wl)
(when (symbol? (car l))
(for ([v (in-list l)]
[x (in-naturals)])
(unless (and (symbol? v)
(eq? v (intern-num-sym (modulo x 1000))))
(printf "bad ~s\n" v))))
(place-channel-send ch wl)))
@ -220,6 +235,7 @@
(test-long (lambda (x) 3) "Listof ints")
(test-long (lambda (x) #(1 2)) "Listof vectors")
(test-long (lambda (x) (intern-num-sym (modulo x 1000))) "Listof symbols")
(test-long (lambda (x) #s(clown "Binky" "pie")) "Listof prefabs"))

View File

@ -1409,33 +1409,6 @@ static int symbol_obj_FIXUP(void *p, struct NewGC *gc) {
#define symbol_obj_IS_CONST_SIZE 0
#ifdef MZ_USE_PLACES
static int serialized_symbol_obj_SIZE(void *p, struct NewGC *gc) {
Scheme_Symbol *s = (Scheme_Symbol *)p;
return
gcBYTES_TO_WORDS(sizeof(Scheme_Symbol) + s->len - 3);
}
static int serialized_symbol_obj_MARK(void *p, struct NewGC *gc) {
Scheme_Symbol *s = (Scheme_Symbol *)p;
return
gcBYTES_TO_WORDS(sizeof(Scheme_Symbol) + s->len - 3);
}
static int serialized_symbol_obj_FIXUP(void *p, struct NewGC *gc) {
Scheme_Symbol *s = (Scheme_Symbol *)p;
return
gcBYTES_TO_WORDS(sizeof(Scheme_Symbol) + s->len - 3);
}
#define serialized_symbol_obj_IS_ATOMIC 1
#define serialized_symbol_obj_IS_CONST_SIZE 0
#endif
static int cons_cell_SIZE(void *p, struct NewGC *gc) {
return
gcBYTES_TO_WORDS(sizeof(Scheme_Simple_Object));

View File

@ -543,16 +543,6 @@ symbol_obj {
gcBYTES_TO_WORDS(sizeof(Scheme_Symbol) + s->len - 3);
}
#ifdef MZ_USE_PLACES
serialized_symbol_obj {
Scheme_Symbol *s = (Scheme_Symbol *)p;
mark:
size:
gcBYTES_TO_WORDS(sizeof(Scheme_Symbol) + s->len - 3);
}
#endif
cons_cell {
mark:
Scheme_Object *o = (Scheme_Object *)p;

View File

@ -1670,12 +1670,13 @@ static void places_deserialize_worker(Scheme_Object **pso);
static Scheme_Object *places_deserialize_worker_k(void)
{
Scheme_Thread *p = scheme_current_thread;
Scheme_Object **pso = (Scheme_Object **)p->ku.k.p1;
Scheme_Object *pso = (Scheme_Object **)p->ku.k.p1;
p->ku.k.p1 = NULL;
places_deserialize_worker(pso);
return scheme_void;
places_deserialize_worker(&pso);
return pso;
}
#endif
@ -1695,8 +1696,9 @@ static void places_deserialize_worker(Scheme_Object **pso)
# include "mzstkchk.h"
{
Scheme_Thread *p = scheme_current_thread;
p->ku.k.p1 = (void *)pso;
scheme_handle_stack_overflow(places_deserialize_worker_k);
p->ku.k.p1 = *pso;
tmp = scheme_handle_stack_overflow(places_deserialize_worker_k);
*pso = tmp;
return;
}
}

View File

@ -576,7 +576,7 @@ void scheme_register_traversers(void)
GC_REG_TRAV(scheme_windows_path_type, bstring_obj);
GC_REG_TRAV(scheme_symbol_type, symbol_obj);
#ifdef MZ_USE_PLACES
GC_REG_TRAV(scheme_serialized_symbol_type, serialized_symbol_obj);
GC_REG_TRAV(scheme_serialized_symbol_type, bstring_obj);
#endif
GC_REG_TRAV(scheme_keyword_type, symbol_obj);
GC_REG_TRAV(scheme_null_type, char_obj); /* small */