You can use gambit's threads to have one thread block on port I/O and allow another thread to check a condition variable to see if there is available data. So when the reading thread blocks I can't send data on the other thread.
http://dynamo.iro.umontreal.ca/~gambit/wiki/index.php?title=Documentation:Pr... You should use this interface for inter-thread communications. And there is an optional timeout parameter for this function, as well as an optional default value. That seems to be a perfectly good API for what you are looking to do. You can even do something like (define-macro (can-i-haz-mail?) `(let ((noes (cons #f #f))) (not (eq? noes (thread-mailbox-next -inf.0 noes))))) that would return #f if you have no mail, and #t if you have some. Cheers, P! -- Français, English, 日本語, 한국어