diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/place-in-channel-fnl.rkt b/pkgs/racket-pkgs/racket-test/tests/racket/place-in-channel-fnl.rkt new file mode 100644 index 0000000000..9344b69838 --- /dev/null +++ b/pkgs/racket-pkgs/racket-test/tests/racket/place-in-channel-fnl.rkt @@ -0,0 +1,15 @@ +#lang racket/base +(require racket/place) + +;; Check finalization of place channels that are +;; abandoned in unreferenced place channels. +(let loop ([n 0]) + (unless (= n 50000) + (define-values (i o) (place-channel)) + (define-values (i2 o2) (place-channel)) + (place-channel-put i o2) + (place-channel-put o i2) + (loop (add1 n)))) +'ok + + diff --git a/racket/src/racket/src/place.c b/racket/src/racket/src/place.c index 0e8be67f4f..fea37c4dd3 100644 --- a/racket/src/racket/src/place.c +++ b/racket/src/racket/src/place.c @@ -2982,6 +2982,11 @@ Scheme_Place_Async_Channel *place_async_channel_create() { static void async_channel_refcount(Scheme_Place_Async_Channel *ch, int for_send, int delta) { + if (!ch->lock) { + /* can happen via finalization, where the channel is already finalized + m(due to the lack of ordering on finalization) */ + return; + } mzrt_mutex_lock(ch->lock); if (for_send) ch->wr_ref += delta;