adjust online check syntax to try to fix a bug where renaming information

can get "stale" and cause DrRacket to deadlock (this commit just sets
up some stuff to make one fix possible, but that fix doesn't seem to
be working, so the actual fix is disabled (see comment in commit))
This commit is contained in:
Robby Findler 2012-01-30 07:45:26 -06:00
parent 019e57b9d7
commit a0ef78e97b
3 changed files with 50 additions and 16 deletions

View File

@ -128,7 +128,8 @@
(list (handler-key handler) (list (handler-key handler)
((handler-proc handler) expanded ((handler-proc handler) expanded
path path
the-source)))) the-source
orig-cust))))
(log-info "expanding-place.rkt: 11 handlers finished") (log-info "expanding-place.rkt: 11 handlers finished")
(parameterize ([current-custodian orig-cust]) (parameterize ([current-custodian orig-cust])

View File

@ -11,20 +11,25 @@
(define obj% (define obj%
(class (annotations-mixin object%) (class (annotations-mixin object%)
(init-field src) (init-field src orig-cust)
(define trace '()) (define trace '())
(define-values (remote local) (place-channel)) (define-values (remote local) (place-channel))
(define table (make-hash)) (define table (make-hash))
(thread
(λ () ;; the hope is that changing the custodian like this
(with-handlers ((exn:fail? (λ (x) (eprintf "online-comp.rkt: thread failed ~a\n" (exn-message x))))) ;; shouldn't leak these threads, but it does seem to
(let loop () ;; so for now we don't use it
(define id/name (place-channel-get local)) (parameterize (#;[current-custodian orig-cust])
(define id (list-ref id/name 0)) (thread
(define name (list-ref id/name 1)) (λ ()
(define res ((hash-ref table id) name)) (with-handlers ((exn:fail? (λ (x) (eprintf "online-comp.rkt: thread failed ~a\n" (exn-message x)))))
(place-channel-put local res))))) (let loop ()
(define id/name (place-channel-get local))
(define id (list-ref id/name 0))
(define name (list-ref id/name 1))
(define res ((hash-ref table id) name))
(place-channel-put local res))))))
(define/override (syncheck:find-source-object stx) (define/override (syncheck:find-source-object stx)
(and (equal? src (syntax-source stx)) (and (equal? src (syntax-source stx))
@ -51,7 +56,7 @@
(define/public (get-trace) (reverse trace)) (define/public (get-trace) (reverse trace))
(super-new))) (super-new)))
(define (go expanded path the-source) (define (go expanded path the-source orig-cust)
(with-handlers ((exn:fail? (λ (x) (with-handlers ((exn:fail? (λ (x)
(printf "~a\n" (exn-message x)) (printf "~a\n" (exn-message x))
(printf "---\n") (printf "---\n")
@ -62,7 +67,9 @@
(printf " ~s\n" x)) (printf " ~s\n" x))
(printf "===\n") (printf "===\n")
(raise x)))) (raise x))))
(define obj (new obj% [src the-source])) (define obj (new obj%
[src the-source]
[orig-cust orig-cust]))
(define-values (expanded-expression expansion-completed) (define-values (expanded-expression expansion-completed)
(make-traversal (current-namespace) (make-traversal (current-namespace)
(get-init-dir path))) (get-init-dir path)))

View File

@ -110,7 +110,10 @@ all of the names in the tools library, for use defining keybindings
(proc-doc/names (proc-doc/names
drracket:module-language-tools:add-online-expansion-handler drracket:module-language-tools:add-online-expansion-handler
(-> path-string? symbol? (-> (is-a?/c drracket:unit:definitions-text<%>) any/c any) void?) (-> path-string? symbol? (-> (is-a?/c drracket:unit:definitions-text<%>)
any/c
any)
void?)
(mod-path id local-handler) (mod-path id local-handler)
@{Registers a pair of procedures with DrRacket's online expansion machinery. @{Registers a pair of procedures with DrRacket's online expansion machinery.
@ -121,11 +124,34 @@ all of the names in the tools library, for use defining keybindings
the fully expanded object to that first procedure. (The procedure is called the fully expanded object to that first procedure. (The procedure is called
in the same context as the expansion process.) in the same context as the expansion process.)
Note that the thread that calls this procedure may be The contract for that procedure is
killed at anytime: DrRacket may kill it when the user types in the buffer @racketblock[(-> syntax? path? any/c custodian?
any)]
There are three other arguments.
@itemize[
@item{
The @racket[path?] argument is the path that was the @racket[current-directory]
when the code was expanded. This directory should be used as the
@racket[current-directory] when resolving module paths obtained from
the syntax object.}
@item{
The third argument is the source object used in the syntax objects that
come from the definitions window in DrRacket. It may be a path (if the file
was saved), but it also might not be. Use @racket[equal?] to compare it
with the @racket[syntax-source] field of syntax objects to determine if
they come from the definitions window.}
@item{ Note that the thread that calls this procedure may be
killed at any time: DrRacket may kill it when the user types in the buffer
(in order to start a new expansion), but bizarro code may also create a separate (in order to start a new expansion), but bizarro code may also create a separate
thread during expansion that lurks around and then mutates arbitrary things. thread during expansion that lurks around and then mutates arbitrary things.
Some code, however, should be longer running, surviving such custodian
shutdowns. To support this, the procedure called in the separate place is
supplied with a more powerful custodian that is not shut down. }]
The result of the procedure is expected to be something that can be sent The result of the procedure is expected to be something that can be sent
across a @racket[place-channel], which is then sent back to the original across a @racket[place-channel], which is then sent back to the original
place where DrRacket itself is running and passed to the @racket[local-handler] place where DrRacket itself is running and passed to the @racket[local-handler]