Move wait-for-members and spy-on to conversation.rkt

This commit is contained in:
Tony Garnock-Jones 2011-10-24 18:33:49 -04:00
parent c79eaf055f
commit 67a00406d0
2 changed files with 25 additions and 22 deletions

View File

@ -9,8 +9,11 @@
(require "standard-thread.rkt")
(provide make-room
room?
room-name
join-room
wait-for-members
spy-on
;; Management and communication
(struct-out arrived)
@ -51,6 +54,28 @@
#:invisible? [invisible? #f])
(make-object membership% (room-ch room) name break-on-departure? invisible?))
(define (wait-for-members room members)
(define handle (join-room room (gensym 'wait-for-members) #:invisible? #t))
(let loop ((remaining-members members))
(if (null? remaining-members)
#t
(match (send handle listen)
((arrived who) (loop (remove who remaining-members)))
((departed who _) (if (member who members)
(error 'wait-for-members "Waited-for member exited")
(loop remaining-members)))
(_ (loop remaining-members)))))
(send handle depart))
(define (spy-on room)
(thread (lambda ()
(define spy-name (gensym 'spy))
(define handle (join-room room spy-name #:invisible? #t))
(let loop ()
(define message (send handle listen))
(log-info (format "~s/~s: ~s" spy-name (room-name room) message))
(loop)))))
(define membership%
(class* object% ()
(init room-init)

View File

@ -639,28 +639,6 @@
SSH_MSG_DEBUG handle-msg-debug
SSH_MSG_KEXINIT handle-msg-kexinit))
(define (spy-on room)
(define handle (join-room room (gensym 'spy) #:invisible? #t))
(define (loop)
(write (list (room-name room) (send handle listen)))
(newline)
(flush-output)
(loop))
(thread loop))
(define (wait-for-members room members)
(define handle (join-room room (gensym 'wait-for-members) #:invisible? #t))
(let loop ((remaining-members members))
(if (null? remaining-members)
#t
(match (send handle listen)
((arrived who) (loop (remove who remaining-members)))
((departed who _) (if (member who members)
(error 'wait-for-members "Waited-for member exited")
(loop remaining-members)))
(_ (loop remaining-members)))))
(send handle depart))
(define (ssh-session role in out)
(define io-room (make-room (gensym 'ssh-session-io-room)))
(spy-on io-room)