From a5f26013ab67c3a8e580415519ad92fb6a54b7bd Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sun, 21 Jul 2013 16:35:56 -0600 Subject: [PATCH] place: fix finalizaiton of place channels stuck in a GC'ed channel Lack of ordering on finalization requires some care for explicit clean-up actions in a finalizer. --- .../tests/racket/place-in-channel-fnl.rkt | 15 +++++++++++++++ racket/src/racket/src/place.c | 5 +++++ 2 files changed, 20 insertions(+) create mode 100644 pkgs/racket-pkgs/racket-test/tests/racket/place-in-channel-fnl.rkt 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;