racket / drracket

DrRacket, IDE for Racket
http://www.racket-lang.org/
Other
455 stars 93 forks source link

DrRacket Internal Error around coroutine-value #159

Open AlexKnauth opened 7 years ago

AlexKnauth commented 7 years ago

The error looks like it's coming from line 459 of drracket/private/syncheck/blueboxes-gui.rkt:

(define tag+rng (coroutine-value update-the-strs-coroutine))

In the update-the-strs method. I don't know how this is possible since lines 447-449 should have set the update-the-strs-coroutine variable to be a valid (non-false) coroutine.

(unless update-the-strs-coroutine
  (set! update-the-strs-coroutine
        (coroutine

Unless somehow something else is mutating it in between?

Here's the internal error:

coroutine-value: contract violation
  expected: coroutine?
  given: #f
  in: the 1st argument of
      (-> coroutine? any/c)
  contract from: 
      <pkgs>/gui-lib/framework/private/coroutine.rkt
  blaming: <pkgs>/drracket/drracket/private/syncheck/blueboxes-gui.rkt
   (assuming the contract is correct)
  at: <pkgs>/gui-lib/framework/private/coroutine.rkt:10.3
  context...:
   .../collects/racket/contract/private/blame.rkt:163:0: raise-blame-error16
   .../collects/racket/contract/private/arrow-val-first.rkt:388:18
   .../pkgs/drracket/drracket/private/syncheck/blueboxes-gui.rkt:446:4: update-the-strs method in ...ck/blueboxes-gui.rkt:176:2
   .../pkgs/drracket/drracket/private/syncheck/blueboxes-gui.rkt:652:4: syncheck:update-blue-boxes method in ...ck/blueboxes-gui.rkt:627:2
   .../pkgs/drracket/drracket/private/syncheck/gui.rkt:2090:10: loop
   .../pkgs/gui-lib/framework/private/logging-timer.rkt:41:0: log-timeline/proc
   .../pkgs/gui-lib/mred/private/wx/common/queue.rkt:428:6
   .../pkgs/gui-lib/mred/private/wx/common/queue.rkt:479:32
   .../pkgs/gui-lib/mred/private/wx/common/queue.rkt:627:3
rfindler commented 7 years ago

I don't suppose I'd be so lucky as to get you to tell me how to make this happen reliably?

AlexKnauth commented 7 years ago

I can't make it happen reliably. However, it might be important to know that this happened while I was working on a #lang language that adds a button to DrRacket, and that when you press the button, it adds text to the editor.

rfindler commented 7 years ago

What methods (if any) does your tool override?

AlexKnauth commented 7 years ago

It doesn't override any methods, it just calls methods on the frame, editor, and definitions-text, and it also uses drracket:eval:expand-program to expand the program.

The methods it calls on the frame are:

The methods it calls on the editor are:

AlexKnauth commented 7 years ago

Could my call to the insert-port method trigger the after-insert method, which calls trigger-buffer-changed-callback which sets update-the-strs-coroutine to false?

rfindler commented 7 years ago

I don't see how those could cause problems. I'm stuck for now. (Yes, that could happen, but perhaps not between when it is set! to a non-#f value and when it is looked at ...)

It may be helpful to put printfs into your DrRacket to track which of the (set! update-the-strs-coroutine #f)s is the one triggering it and get the stack at that point via this trick:

(printf "stack....\n")
(for ([x (in-list (continuation-mark-set->context (current-continuation-marks)))])
  (printf "  ~s\n" x))
(printf "-----\n")
AlexKnauth commented 7 years ago

With that code after the set! in trigger-buffer-changed-callback (Line 432), I found several places where my code's method calls call it. Every time this mentions step-4-editor-insert-templates that's my button calling either set-position or insert-port.

Now the question is whether this can happen concurrently with the update-the-strs method.

-----
stack....
  (|trigger-buffer-changed-callback method in ...ck/blueboxes-gui.rkt:176:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/blueboxes-gui.rkt> 428 4 16356 392))
  (for-loop . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 80 2 2759 724))
  (step-4-editor-insert-templates . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 78 0 2663 864))
  (#f . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 43 3 1152 1404))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 428 6 18859 1056))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 479 32 20846 120))
  (call-with-break-parameterization . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/collects/racket/private/more-scheme.rkt> 148 2 4881 517))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 374 18 16779 540))
-----
stack....
  (|trigger-buffer-changed-callback method in ...ck/blueboxes-gui.rkt:176:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/blueboxes-gui.rkt> 428 4 16356 392))
  (|after-delete method in ...e-language-tools.rkt:206:4| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/module-language-tools.rkt> 245 6 10565 119))
  (|after-delete method in ...et/private/debug.rkt:1347:4| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/debug.rkt> 1398 6 62045 105))
  (|after-delete method in ...ate/syncheck/gui.rkt:347:8| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/gui.rkt> 352 10 15930 146))
  (|after-delete method in ...ork/private/text.rkt:4432:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/text.rkt> 4633 4 182936 236))
  (core1189 . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 1866 2 91920 12507))
  (|do-insert method in text%| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 1290 2 59028 4601))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 2743 17 129303 745))
  (core3633 . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 2701 2 127177 449))
  (for-loop . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 80 2 2759 724))
  (step-4-editor-insert-templates . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 78 0 2663 864))
  (#f . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 43 3 1152 1404))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 428 6 18859 1056))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 479 32 20846 120))
  (call-with-break-parameterization . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/collects/racket/private/more-scheme.rkt> 148 2 4881 517))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 374 18 16779 540))
-----
stack....
  (|trigger-buffer-changed-callback method in ...ck/blueboxes-gui.rkt:176:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/blueboxes-gui.rkt> 428 4 16356 392))
  (|after-insert method in ...e-language-tools.rkt:206:4| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/module-language-tools.rkt> 242 6 10439 119))
  (|after-insert method in ...et/private/debug.rkt:1347:4| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/debug.rkt> 1394 6 61926 105))
  (|after-insert method in ...ate/syncheck/gui.rkt:347:8| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/gui.rkt> 360 10 16234 146))
  (|after-insert method in ...ork/private/text.rkt:4432:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/text.rkt> 4626 4 182694 236))
  (|after-insert method in .../inline-overview.rkt:29:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/inline-overview.rkt> 84 4 2721 1885))
  (|after-insert method in ...ork/private/text.rkt:4837:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/text.rkt> 4847 4 191799 608))
  (|after-insert method in ...ork/private/text.rkt:527:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/text.rkt> 580 4 24552 237))
  (|do-insert method in text%| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 1290 2 59028 4601))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 2743 17 129303 745))
  (core3633 . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 2701 2 127177 449))
  (for-loop . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 80 2 2759 724))
  (step-4-editor-insert-templates . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 78 0 2663 864))
  (#f . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 43 3 1152 1404))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 428 6 18859 1056))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 479 32 20846 120))
  (call-with-break-parameterization . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/collects/racket/private/more-scheme.rkt> 148 2 4881 517))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 374 18 16779 540))
-----
stack....
  (|trigger-buffer-changed-callback method in ...ck/blueboxes-gui.rkt:176:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/blueboxes-gui.rkt> 428 4 16356 392))
  (for-loop . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 80 2 2759 724))
  (step-4-editor-insert-templates . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 78 0 2663 864))
  (#f . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 43 3 1152 1404))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 428 6 18859 1056))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 479 32 20846 120))
  (call-with-break-parameterization . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/collects/racket/private/more-scheme.rkt> 148 2 4881 517))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 374 18 16779 540))
-----
stack....
  (|trigger-buffer-changed-callback method in ...ck/blueboxes-gui.rkt:176:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/blueboxes-gui.rkt> 428 4 16356 392))
  (|after-delete method in ...e-language-tools.rkt:206:4| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/module-language-tools.rkt> 245 6 10565 119))
  (|after-delete method in ...et/private/debug.rkt:1347:4| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/debug.rkt> 1398 6 62045 105))
  (|after-delete method in ...ate/syncheck/gui.rkt:347:8| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/gui.rkt> 352 10 15930 146))
  (|after-delete method in ...ork/private/text.rkt:4432:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/text.rkt> 4633 4 182936 236))
  (core1189 . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 1866 2 91920 12507))
  (|do-insert method in text%| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 1290 2 59028 4601))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 2743 17 129303 745))
  (core3633 . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 2701 2 127177 449))
  (for-loop . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 80 2 2759 724))
  (step-4-editor-insert-templates . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 78 0 2663 864))
  (#f . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 43 3 1152 1404))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 428 6 18859 1056))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 479 32 20846 120))
  (call-with-break-parameterization . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/collects/racket/private/more-scheme.rkt> 148 2 4881 517))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 374 18 16779 540))
-----
stack....
  (|trigger-buffer-changed-callback method in ...ck/blueboxes-gui.rkt:176:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/blueboxes-gui.rkt> 428 4 16356 392))
  (|after-insert method in ...e-language-tools.rkt:206:4| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/module-language-tools.rkt> 242 6 10439 119))
  (|after-insert method in ...et/private/debug.rkt:1347:4| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/debug.rkt> 1394 6 61926 105))
  (|after-insert method in ...ate/syncheck/gui.rkt:347:8| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/gui.rkt> 360 10 16234 146))
  (|after-insert method in ...ork/private/text.rkt:4432:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/text.rkt> 4626 4 182694 236))
  (|after-insert method in .../inline-overview.rkt:29:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/inline-overview.rkt> 84 4 2721 1885))
  (|after-insert method in ...ork/private/text.rkt:4837:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/text.rkt> 4847 4 191799 608))
  (|after-insert method in ...ork/private/text.rkt:527:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/text.rkt> 580 4 24552 237))
  (|do-insert method in text%| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 1290 2 59028 4601))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 2743 17 129303 745))
  (core3633 . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 2701 2 127177 449))
  (for-loop . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 80 2 2759 724))
  (step-4-editor-insert-templates . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 78 0 2663 864))
  (#f . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 43 3 1152 1404))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 428 6 18859 1056))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 479 32 20846 120))
  (call-with-break-parameterization . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/collects/racket/private/more-scheme.rkt> 148 2 4881 517))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 374 18 16779 540))
-----
stack....
  (|trigger-buffer-changed-callback method in ...ck/blueboxes-gui.rkt:176:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/blueboxes-gui.rkt> 428 4 16356 392))
  (for-loop . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 80 2 2759 724))
  (step-4-editor-insert-templates . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 78 0 2663 864))
  (#f . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 43 3 1152 1404))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 428 6 18859 1056))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 479 32 20846 120))
  (call-with-break-parameterization . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/collects/racket/private/more-scheme.rkt> 148 2 4881 517))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 374 18 16779 540))
-----
stack....
  (|trigger-buffer-changed-callback method in ...ck/blueboxes-gui.rkt:176:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/blueboxes-gui.rkt> 428 4 16356 392))
  (|after-delete method in ...e-language-tools.rkt:206:4| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/module-language-tools.rkt> 245 6 10565 119))
  (|after-delete method in ...et/private/debug.rkt:1347:4| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/debug.rkt> 1398 6 62045 105))
  (|after-delete method in ...ate/syncheck/gui.rkt:347:8| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/gui.rkt> 352 10 15930 146))
  (|after-delete method in ...ork/private/text.rkt:4432:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/text.rkt> 4633 4 182936 236))
  (core1189 . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 1866 2 91920 12507))
  (|do-insert method in text%| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 1290 2 59028 4601))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 2743 17 129303 745))
  (core3633 . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 2701 2 127177 449))
  (for-loop . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 80 2 2759 724))
  (step-4-editor-insert-templates . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 78 0 2663 864))
  (#f . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 43 3 1152 1404))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 428 6 18859 1056))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 479 32 20846 120))
  (call-with-break-parameterization . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/collects/racket/private/more-scheme.rkt> 148 2 4881 517))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 374 18 16779 540))
-----
stack....
  (|trigger-buffer-changed-callback method in ...ck/blueboxes-gui.rkt:176:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/blueboxes-gui.rkt> 428 4 16356 392))
  (|after-insert method in ...e-language-tools.rkt:206:4| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/module-language-tools.rkt> 242 6 10439 119))
  (|after-insert method in ...et/private/debug.rkt:1347:4| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/debug.rkt> 1394 6 61926 105))
  (|after-insert method in ...ate/syncheck/gui.rkt:347:8| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/gui.rkt> 360 10 16234 146))
  (|after-insert method in ...ork/private/text.rkt:4432:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/text.rkt> 4626 4 182694 236))
  (|after-insert method in .../inline-overview.rkt:29:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/inline-overview.rkt> 84 4 2721 1885))
  (|after-insert method in ...ork/private/text.rkt:4837:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/text.rkt> 4847 4 191799 608))
  (|after-insert method in ...ork/private/text.rkt:527:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/text.rkt> 580 4 24552 237))
  (|do-insert method in text%| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 1290 2 59028 4601))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 2743 17 129303 745))
  (core3633 . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 2701 2 127177 449))
  (for-loop . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 80 2 2759 724))
  (step-4-editor-insert-templates . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 78 0 2663 864))
  (#f . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 43 3 1152 1404))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 428 6 18859 1056))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 479 32 20846 120))
  (call-with-break-parameterization . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/collects/racket/private/more-scheme.rkt> 148 2 4881 517))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 374 18 16779 540))
-----
stack....
  (|trigger-buffer-changed-callback method in ...ck/blueboxes-gui.rkt:176:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/blueboxes-gui.rkt> 428 4 16356 392))
  (for-loop . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 80 2 2759 724))
  (step-4-editor-insert-templates . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 78 0 2663 864))
  (#f . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 43 3 1152 1404))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 428 6 18859 1056))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 479 32 20846 120))
  (call-with-break-parameterization . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/collects/racket/private/more-scheme.rkt> 148 2 4881 517))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 374 18 16779 540))
-----
stack....
  (|trigger-buffer-changed-callback method in ...ck/blueboxes-gui.rkt:176:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/blueboxes-gui.rkt> 428 4 16356 392))
  (|after-delete method in ...e-language-tools.rkt:206:4| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/module-language-tools.rkt> 245 6 10565 119))
  (|after-delete method in ...et/private/debug.rkt:1347:4| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/debug.rkt> 1398 6 62045 105))
  (|after-delete method in ...ate/syncheck/gui.rkt:347:8| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/gui.rkt> 352 10 15930 146))
  (|after-delete method in ...ork/private/text.rkt:4432:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/text.rkt> 4633 4 182936 236))
  (core1189 . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 1866 2 91920 12507))
  (|do-insert method in text%| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 1290 2 59028 4601))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 2743 17 129303 745))
  (core3633 . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 2701 2 127177 449))
  (for-loop . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 80 2 2759 724))
  (step-4-editor-insert-templates . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 78 0 2663 864))
  (#f . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 43 3 1152 1404))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 428 6 18859 1056))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 479 32 20846 120))
  (call-with-break-parameterization . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/collects/racket/private/more-scheme.rkt> 148 2 4881 517))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 374 18 16779 540))
-----
stack....
  (|trigger-buffer-changed-callback method in ...ck/blueboxes-gui.rkt:176:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/blueboxes-gui.rkt> 428 4 16356 392))
  (|after-insert method in ...e-language-tools.rkt:206:4| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/module-language-tools.rkt> 242 6 10439 119))
  (|after-insert method in ...et/private/debug.rkt:1347:4| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/debug.rkt> 1394 6 61926 105))
  (|after-insert method in ...ate/syncheck/gui.rkt:347:8| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/gui.rkt> 360 10 16234 146))
  (|after-insert method in ...ork/private/text.rkt:4432:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/text.rkt> 4626 4 182694 236))
  (|after-insert method in .../inline-overview.rkt:29:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/inline-overview.rkt> 84 4 2721 1885))
  (|after-insert method in ...ork/private/text.rkt:4837:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/text.rkt> 4847 4 191799 608))
  (|after-insert method in ...ork/private/text.rkt:527:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/text.rkt> 580 4 24552 237))
  (|do-insert method in text%| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 1290 2 59028 4601))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 2743 17 129303 745))
  (core3633 . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 2701 2 127177 449))
  (for-loop . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 80 2 2759 724))
  (step-4-editor-insert-templates . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 78 0 2663 864))
  (#f . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 43 3 1152 1404))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 428 6 18859 1056))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 479 32 20846 120))
  (call-with-break-parameterization . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/collects/racket/private/more-scheme.rkt> 148 2 4881 517))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 374 18 16779 540))
-----
stack....
  (|trigger-buffer-changed-callback method in ...ck/blueboxes-gui.rkt:176:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/blueboxes-gui.rkt> 428 4 16356 392))
  (for-loop . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 80 2 2759 724))
  (step-4-editor-insert-templates . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 78 0 2663 864))
  (#f . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 43 3 1152 1404))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 428 6 18859 1056))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 479 32 20846 120))
  (call-with-break-parameterization . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/collects/racket/private/more-scheme.rkt> 148 2 4881 517))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 374 18 16779 540))
-----
stack....
  (|trigger-buffer-changed-callback method in ...ck/blueboxes-gui.rkt:176:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/blueboxes-gui.rkt> 428 4 16356 392))
  (|after-delete method in ...e-language-tools.rkt:206:4| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/module-language-tools.rkt> 245 6 10565 119))
  (|after-delete method in ...et/private/debug.rkt:1347:4| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/debug.rkt> 1398 6 62045 105))
  (|after-delete method in ...ate/syncheck/gui.rkt:347:8| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/gui.rkt> 352 10 15930 146))
  (|after-delete method in ...ork/private/text.rkt:4432:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/text.rkt> 4633 4 182936 236))
  (core1189 . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 1866 2 91920 12507))
  (|do-insert method in text%| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 1290 2 59028 4601))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 2743 17 129303 745))
  (core3633 . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 2701 2 127177 449))
  (for-loop . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 80 2 2759 724))
  (step-4-editor-insert-templates . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 78 0 2663 864))
  (#f . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 43 3 1152 1404))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 428 6 18859 1056))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 479 32 20846 120))
  (call-with-break-parameterization . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/collects/racket/private/more-scheme.rkt> 148 2 4881 517))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 374 18 16779 540))
-----
stack....
  (|trigger-buffer-changed-callback method in ...ck/blueboxes-gui.rkt:176:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/blueboxes-gui.rkt> 428 4 16356 392))
  (|after-insert method in ...e-language-tools.rkt:206:4| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/module-language-tools.rkt> 242 6 10439 119))
  (|after-insert method in ...et/private/debug.rkt:1347:4| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/debug.rkt> 1394 6 61926 105))
  (|after-insert method in ...ate/syncheck/gui.rkt:347:8| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/drracket/drracket/private/syncheck/gui.rkt> 360 10 16234 146))
  (|after-insert method in ...ork/private/text.rkt:4432:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/text.rkt> 4626 4 182694 236))
  (|after-insert method in .../inline-overview.rkt:29:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/inline-overview.rkt> 84 4 2721 1885))
  (|after-insert method in ...ork/private/text.rkt:4837:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/text.rkt> 4847 4 191799 608))
  (|after-insert method in ...ork/private/text.rkt:527:2| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/framework/private/text.rkt> 580 4 24552 237))
  (|do-insert method in text%| . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 1290 2 59028 4601))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 2743 17 129303 745))
  (core3633 . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wxme/text.rkt> 2701 2 127177 449))
  (for-loop . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 80 2 2759 724))
  (step-4-editor-insert-templates . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 78 0 2663 864))
  (#f . #(struct:srcloc #<path:/Users/Alex/Desktop/racketcon2017/step-4/lang/step-4-button.rkt> 43 3 1152 1404))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 428 6 18859 1056))
  (#f . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 479 32 20846 120))
  (call-with-break-parameterization . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/collects/racket/private/more-scheme.rkt> 148 2 4881 517))
  (loop . #(struct:srcloc #<path:/Applications/Racket/2017-10-29/Racket v6.11.0.2/share/pkgs/gui-lib/mred/private/wx/common/queue.rkt> 374 18 16779 540))
-----
rfindler commented 7 years ago

The way GUIs work, it should never happen concurrently. You should be able to tell this by checking to see if (eq? (current-thread) (eventspace-handler-thread (current-eventspace))) is true or not. Well, I suppose your tool could be making new eventspaces and calling methods from their handler threads. Is it doing that?

AlexKnauth commented 7 years ago

If I save the old thread (the one my button callback is called in) and compare it to the current-thread when I'm inserting, those threads are different. This is probably because drracket:eval:expand-program is creating a new eventspace, and its calling its function arguments within that eventspace.

Does that mean it can be concurrent with the blueboxes update-the-strs method?

I noticed DrRacket's check-syntax doesn't use the eventspace that drracket:eval:expand-program gives it, but puts it in the old eventspace, which it saved from before it started expanding. When you were talking about "The way GUIs work" were you talking about Check Syntax switching back to the old saved eventspace?

My button does not do that, it stays in the eventspace that drracket:eval:expand-program gave it. Does this provide the unexpected concurrency that broke it?

rfindler commented 7 years ago

Yes, it can be concurrent and this is rightly considered a bug in your tool. You may not call any GUI methods from any thread except the eventspace main thread.

re: "ways GUIs work", yes, that's the kind of thing I had in mind. more generally, I was just saying you need to design your concurrent program to work properly and one of the requirements there is that you don't do GUI things on a non-GUI thread (unless you specially design a thread-safe interface you call, of course, but that's your job, not the GUI's job).

Do keep in mind that just saving the eventspace and queue'ing a callback onto it may or may not be the right thing. There really is concurrency here, so some holistic planning is required.

AlexKnauth commented 7 years ago

Should the documentation for drracket:eval:expand-program be updated with an example of saving the old eventspace, switching to it, and using queue-callback, whenever you want to call GUI methods?

rfindler commented 7 years ago

Maybe someone shoudl write something about how to program GUIs and write multi-threaded programs and that could be linked to from there.

mfelleisen commented 7 years ago

@rfinder I still think this would be a cool research area for types/contracts that inform Alex (and me, who has had similar bugs) of the concurrency violation.

Alternatively, I would love to explore whether running all of this in Syndicate would eliminate these bugs.

On Oct 31, 2017, at 4:54 PM, Robby Findler notifications@github.com wrote:

Maybe someone shoudl write something about how to program GUIs and write multi-threaded programs and that could be linked to from there. — You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub, or mute the thread.

rfindler commented 7 years ago

I completely agree that there should be something type/contract-like that would let people know the invariants here.

I think that syndicate would help. I'm not sure how it plugs in. I'll note that CML already does help in a huge way here (and it gets used a whole lot) but no one reached for it (probably because they didn't get a contract violation!). Would syndicate suffer from the same problem (namely that people would't know to reach for it and how to plug it in)?

mfelleisen commented 7 years ago

This would be a worthwhile experiment.

On Nov 1, 2017, at 11:20 AM, Robby Findler notifications@github.com wrote:

I completely agree that there should be something type/contract-like that would let people know the invariants here.

I think that syndicate would help. I'm not sure how it plugs in. I'll note that CML already does help in a huge way here (and it gets used a whole lot) but no one reached for it (probably because they didn't get a contract violation!). Would syndicate suffer from the same problem (namely that people would't know to reach for it and how to plug it in)?

— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or mute the thread.