edwin/intmod: Hack Edwin data structures ONLY in editor-thread.
authorMatt Birkholz <matt@birchwood-abbey.net>
Fri, 16 Mar 2018 03:02:11 +0000 (20:02 -0700)
committerMatt Birkholz <matt@birchwood-abbey.net>
Fri, 16 Mar 2018 03:02:11 +0000 (20:02 -0700)
src/edwin/intmod.scm

index f7ad3947f79da405cce13719ab98dc932760db80..eb951db563099c924d8bf9b3ffc6f436480d1717 100644 (file)
@@ -114,32 +114,39 @@ evaluated in the specified inferior REPL buffer."
       (buffer-put! buffer 'MAJOR-MODE-LOCKED #t))
   (if (environment? environment)
       (local-set-variable! scheme-environment environment buffer))
-  (create-thread editor-thread-root-continuation
-    (lambda ()
-      (let ((port
-            (make-interface-port buffer
-                                 (let ((thread (current-thread)))
-                                   (detach-thread thread)
-                                   thread))))
-       (attach-buffer-interface-port! buffer port)
-       (parameterize* (list (cons param:%exit-hook inferior-repl/%exit)
-                            (cons param:quit-hook inferior-repl/quit))
-         (lambda ()
-           (dynamic-wind
-            (lambda () unspecific)
-            (lambda ()
-              (repl/start (make-repl #f
-                                     port
-                                     environment
-                                     #f
-                                     `((ERROR-DECISION ,error-decision))
-                                     user-initial-prompt)
-                          (make-init-message message)))
-            (lambda ()
-              (signal-thread-event editor-thread
-                (lambda ()
-                  (unwind-inferior-repl-buffer buffer)))))))))
-    buffer))
+  (let ((return (make-thread-queue 1))
+       (proceed (make-thread-queue 1)))
+    (create-thread editor-thread-root-continuation
+      (lambda ()
+       (let ((port
+              (make-interface-port buffer
+                                   (let ((thread (current-thread)))
+                                     (detach-thread thread)
+                                     thread))))
+         (thread-queue/queue! return port) ;pass port to editor-thread
+         (thread-queue/dequeue! proceed) ;wait for port to be attached
+         (parameterize* (list (cons param:%exit-hook inferior-repl/%exit)
+                              (cons param:quit-hook inferior-repl/quit))
+           (lambda ()
+             (dynamic-wind
+              (lambda () unspecific)
+              (lambda ()
+                (repl/start
+                 (make-repl #f
+                            port
+                            environment
+                            #f
+                            `((ERROR-DECISION ,error-decision))
+                            user-initial-prompt)
+                 (make-init-message message)))
+              (lambda ()
+                (signal-thread-event editor-thread
+                  (lambda ()
+                    (unwind-inferior-repl-buffer buffer)))))))))
+      buffer)
+    (let ((port (thread-queue/dequeue! return)))
+      (attach-buffer-interface-port! buffer port)
+      (thread-queue/queue! proceed 'ready))))
 
 (define (make-init-message message)
   (if message