adjust sync pattern to avoid cross-thread set!

This commit is contained in:
Robby Findler 2013-01-01 22:11:32 -06:00
parent 0f26aafd1f
commit 0d0503bda7

View File

@ -1439,7 +1439,6 @@ TODO
(define logger-editor #f) (define logger-editor #f)
(define logger-messages '()) (define logger-messages '())
(define user-log-receiver-args-str (preferences:get 'drracket:logger-receiver-string)) (define user-log-receiver-args-str (preferences:get 'drracket:logger-receiver-string))
(define user-log-receiver #f)
(define/public (set-user-log-receiver-args str args) (define/public (set-user-log-receiver-args str args)
(set! user-log-receiver-args-str str) (set! user-log-receiver-args-str str)
(update-log-receiver-to-match-str)) (update-log-receiver-to-match-str))
@ -1449,19 +1448,13 @@ TODO
[logging-on? [logging-on?
(update-log-receiver-to-match-str)] (update-log-receiver-to-match-str)]
[else [else
(when user-log-receiver (channel-put user-log-receiver-changed #f)]))
(set! user-log-receiver #f)
(semaphore-post user-log-receiver-changed))]))
(define/private (update-log-receiver-to-match-str) (define/private (update-log-receiver-to-match-str)
(define args (parse-logger-args user-log-receiver-args-str)) (define args (parse-logger-args user-log-receiver-args-str))
(set! user-log-receiver (channel-put user-log-receiver-changed
(and args (and args
(apply make-log-receiver user-logger args))) (apply make-log-receiver user-logger args))))
(semaphore-post user-log-receiver-changed)) (define user-log-receiver-changed (make-channel))
(define/private (inform-user-logger-thread-that-logger-changed)
(semaphore-post user-log-receiver-changed))
(define user-log-receiver-changed (make-semaphore 0))
(thread (thread
(λ () (λ ()
(struct gui-event (start end name) #:prefab) (struct gui-event (start end name) #:prefab)
@ -1476,10 +1469,11 @@ TODO
(semaphore-post sema) (semaphore-post sema)
(for ([vec (in-list (reverse my-evts))]) (for ([vec (in-list (reverse my-evts))])
(new-log-message vec))) (new-log-message vec)))
(let loop () (let loop ([user-log-receiver #f])
(sync (sync
(handle-evt user-log-receiver-changed (handle-evt user-log-receiver-changed
(λ (_) (loop))) (λ (user-log-receiver)
(loop user-log-receiver)))
(if user-log-receiver (if user-log-receiver
(handle-evt user-log-receiver (handle-evt user-log-receiver
(λ (vec) (λ (vec)
@ -1490,7 +1484,7 @@ TODO
(queue-callback user-event-handler-callback #f) (queue-callback user-event-handler-callback #f)
(set! callback-running? #t)) (set! callback-running? #t))
(semaphore-post sema)) (semaphore-post sema))
(loop))) (loop user-log-receiver)))
never-evt))))) never-evt)))))
(define/public (get-logger-messages) logger-messages) (define/public (get-logger-messages) logger-messages)
(define/private (new-log-message vec) (define/private (new-log-message vec)