From 887aada203ecd4e9f96084b71e504b972481e6c8 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Wed, 26 Oct 2011 00:06:29 -0400 Subject: [PATCH] Break threads only after their output-queues have been drained. --- conversation.rkt | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/conversation.rkt b/conversation.rkt index 2887bfe..cace762 100644 --- a/conversation.rkt +++ b/conversation.rkt @@ -156,11 +156,16 @@ acc (choice-evt acc (let-values (((first rest) (dequeue (unbox qb)))) - (handle-evt (channel-put-evt (binding-out-ch b) - first) - (lambda (dummy) - (set-box! qb rest) - (room-main state))))))) + (if (and (departed? first) + (binding-break-on-departure? b)) + (begin (break-thread (binding-thread b)) + never-evt) + (handle-evt (channel-put-evt + (binding-out-ch b) + first) + (lambda (dummy) + (set-box! qb rest) + (room-main state)))))))) (handle-evt (binding-in-ch b) (lambda (message) (room-main (handle-binding-message state b message)))) @@ -231,7 +236,4 @@ (define (enqueue-message! b message) (define qb (binding-queue-box b)) - (if (and (departed? message) - (binding-break-on-departure? b)) - (break-thread (binding-thread b)) - (set-box! qb (enqueue (unbox qb) message)))) + (set-box! qb (enqueue (unbox qb) message)))