diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/place-chmsg-gc.rkt b/pkgs/racket-pkgs/racket-test/tests/racket/place-chmsg-gc.rkt new file mode 100644 index 0000000000..8dac94d01f --- /dev/null +++ b/pkgs/racket-pkgs/racket-test/tests/racket/place-chmsg-gc.rkt @@ -0,0 +1,17 @@ +#lang racket/base +(require racket/place) + +;; Make sure that place channels waiting in a channel +;; are kept properly. N should be large enough to trigger +;; a master collection. + +(define N 10000) +(define-values (i o) (place-channel)) +(for ([j N]) + (define-values (i2 o2) (place-channel)) + (place-channel-put i2 j) + (place-channel-put i o2)) +(for ([j N]) + (unless (eq? j (place-channel-get (place-channel-get o))) + ;; just as likely to crash as get here + (error "failed"))) diff --git a/racket/src/racket/src/mzmark_place.inc b/racket/src/racket/src/mzmark_place.inc index 93c0e2a70d..70b119d937 100644 --- a/racket/src/racket/src/mzmark_place.inc +++ b/racket/src/racket/src/mzmark_place.inc @@ -102,7 +102,7 @@ static int place_async_channel_val_MARK(void *p, struct NewGC *gc) { gcMARK2(SCHEME_CAR(pr), gc); pr = SCHEME_CDR(pr); } - j = ((j + 1) & sz); + j = ((j + 1) % sz); } return @@ -127,7 +127,7 @@ static int place_async_channel_val_FIXUP(void *p, struct NewGC *gc) { gcFIXUP2(SCHEME_CAR(pr), gc); pr = SCHEME_CDR(pr); } - j = ((j + 1) & sz); + j = ((j + 1) % sz); } return diff --git a/racket/src/racket/src/mzmarksrc.c b/racket/src/racket/src/mzmarksrc.c index 7d926e241f..a4bf998059 100644 --- a/racket/src/racket/src/mzmarksrc.c +++ b/racket/src/racket/src/mzmarksrc.c @@ -1601,7 +1601,7 @@ place_async_channel_val { gcMARK2(SCHEME_CAR(pr), gc); pr = SCHEME_CDR(pr); } - j = ((j + 1) & sz); + j = ((j + 1) % sz); } size: