From 8492f7c90b4e6927679a8db328b2bd163b5474bf Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 11 May 2011 15:04:20 -0600 Subject: [PATCH] fix symbol handling in long-message transfer as well as stack-overflow handling --- collects/tests/racket/place-channel.rkt | 18 ++++++++++++++++- src/racket/src/mzmark_type.inc | 27 ------------------------- src/racket/src/mzmarksrc.c | 10 --------- src/racket/src/place.c | 12 ++++++----- src/racket/src/type.c | 2 +- 5 files changed, 25 insertions(+), 44 deletions(-) diff --git a/collects/tests/racket/place-channel.rkt b/collects/tests/racket/place-channel.rkt index dd9663bdee..4972bdaa2c 100644 --- a/collects/tests/racket/place-channel.rkt +++ b/collects/tests/racket/place-channel.rkt @@ -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")) diff --git a/src/racket/src/mzmark_type.inc b/src/racket/src/mzmark_type.inc index 4fcd260cac..cd6ab819ae 100644 --- a/src/racket/src/mzmark_type.inc +++ b/src/racket/src/mzmark_type.inc @@ -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)); diff --git a/src/racket/src/mzmarksrc.c b/src/racket/src/mzmarksrc.c index 53a05442f4..0fd07175a6 100644 --- a/src/racket/src/mzmarksrc.c +++ b/src/racket/src/mzmarksrc.c @@ -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; diff --git a/src/racket/src/place.c b/src/racket/src/place.c index 0e308b5788..97c58658d7 100644 --- a/src/racket/src/place.c +++ b/src/racket/src/place.c @@ -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; } } diff --git a/src/racket/src/type.c b/src/racket/src/type.c index 41453b5200..47bbfae3a0 100644 --- a/src/racket/src/type.c +++ b/src/racket/src/type.c @@ -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 */