fix symbol handling in long-message transfer
as well as stack-overflow handling
This commit is contained in:
parent
2bc97ccf59
commit
8492f7c90b
|
@ -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"))
|
||||
|
||||
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue
Block a user