Merge
authorJan Vrany <jan.vrany@labware.com>
Tue, 09 Mar 2021 20:49:55 +0000
changeset 219 f5c899ac62ec
parent 217 011d65a54cc5 (current diff)
parent 218 42d5a8a5e14e (diff)
child 220 372b64967435
Merge
GDBConnection.st
GDBDebugger.st
GDBEventDispatcher.st
Make.proto
Make.spec
abbrev.stc
bc.mak
jv_libgdbs.st
libInit.cc
tests/GDBDebuggerTestsR.st
--- a/GDBConnection.st	Tue Mar 09 12:29:05 2021 +0000
+++ b/GDBConnection.st	Tue Mar 09 20:49:55 2021 +0000
@@ -1,6 +1,7 @@
 "
 jv:libgdbs - GNU Debugger Interface Library
 Copyright (C) 2015-now Jan Vrany
+Copyright (C) 2021 LabWare
 
 This library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
@@ -22,9 +23,8 @@
 
 Object subclass:#GDBConnection
 	instanceVariableNames:'process inferiorPTY eventAnnouncer eventAnnouncerInternal
-		eventQueue eventQueueLock eventDispatchNotifier
-		eventDispatchProcess eventDispatchProcessStopping
-		eventPumpProcess outstandingCommands recorder'
+		eventQueue eventQueueLock eventDispatcher eventPumpProcess
+		outstandingCommands recorder'
 	classVariableNames:''
 	poolDictionaries:'GDBDebugFlags'
 	category:'GDB-Private'
@@ -36,6 +36,7 @@
 "
 jv:libgdbs - GNU Debugger Interface Library
 Copyright (C) 2015-now Jan Vrany
+Copyright (C) 2021 LabWare
 
 This library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
@@ -91,6 +92,12 @@
     "Created: / 19-06-2014 / 22:18:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+eventDispatchProcess
+    ^ eventDispatcher process
+
+    "Created: / 09-03-2021 / 20:51:54 / Jan Vrany <jan.vrany@labware.com>"
+!
+
 inferiorPTY
     ^ inferiorPTY
 !
@@ -142,86 +149,18 @@
 
 !GDBConnection methodsFor:'event dispatching'!
 
-eventDispatchLoop
-    "raise an error: this method should be implemented (TODO)"
-
-    [  
-        | eventQueueEmpty |
-
-        eventQueueEmpty := false.
-        [ eventQueueEmpty ] whileFalse:[
-            | event |
-
-            event := nil.
-            eventQueueLock critical:[ 
-                eventQueueEmpty := eventQueue isEmpty.
-                eventQueueEmpty ifFalse:[ 
-                    event := eventQueue removeFirst.
-                ]
-            ].
-            eventQueueEmpty ifFalse:[
-                (AbortOperationRequest , AbortAllOperationRequest) ignoreIn:[
-                    self eventDispatchSingle: event.
-                ]
-            ].
-        ].
-        eventDispatchProcessStopping == true ifTrue:[ 
-            ^ self.
-        ].
-        eventDispatchNotifier wait.
-    ] loop.
+eventDispatchStart
+    eventDispatcher start
 
     "Created: / 02-06-2014 / 22:51:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 14-01-2018 / 21:54:32 / jv"
-    "Modified: / 02-10-2018 / 13:35:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-eventDispatchProcess
-    ^ eventDispatchProcess
-!
-
-eventDispatchSingle: aGDBEvent
-    TraceEvents ifTrue:[ 
-        Logger log: ('event loop: broadcasting %1 (%2)' bindWith: aGDBEvent class name with: aGDBEvent token) severity: #trace facility: 'GDB' originator: self attachment: aGDBEvent
-    ].
-    eventAnnouncerInternal announce: aGDBEvent.
-    eventAnnouncer announce: aGDBEvent
-
-    "Created: / 02-06-2014 / 22:58:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 27-02-2015 / 09:49:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-eventDispatchStart
-    eventDispatchProcess isNil ifTrue:[
-        eventDispatchProcessStopping := false.
-        eventDispatchProcess := [
-                TraceEvents ifTrue:[
-                    Logger log: 'event loop: starting' severity: #trace facility: 'GDB'
-                ].
-                self eventDispatchLoop.
-            ] newProcess.
-        eventDispatchProcess name:('GDB Event dispatcher (%1)' bindWith:process id).
-        eventDispatchProcess priority:Processor userBackgroundPriority.
-        eventDispatchProcess addExitAction:[ 
-            eventDispatchProcess := nil. 
-            eventDispatchProcessStopping := nil.
-            TraceEvents ifTrue:[
-                Logger log: 'event loop: terminated' severity: #trace facility: 'GDB'
-            ].
-        ].
-        eventDispatchProcess resume.
-    ].
-
-    "Created: / 02-06-2014 / 22:51:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 19-10-2018 / 10:11:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 02-10-2018 / 14:28:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 eventDispatchStop            
-    eventDispatchProcessStopping := true.
-    eventDispatchNotifier signal.
+    eventDispatcher stop
 
     "Created: / 02-06-2014 / 22:52:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 02-10-2018 / 14:00:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 02-10-2018 / 14:28:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBConnection methodsFor:'event pump'!
@@ -328,11 +267,11 @@
 pushEvent: aGDBEvent
     eventQueueLock critical:[
         eventQueue add: aGDBEvent.
-        eventDispatchNotifier signal.
+        eventDispatcher notify.
     ].
 
     "Created: / 02-06-2014 / 22:49:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 02-10-2018 / 14:00:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 02-10-2018 / 14:30:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 pushEventSet: aGDBEventSet
@@ -340,11 +279,11 @@
         eventQueue add: (GDBEventSetProcessingStarted new setEventSet: aGDBEventSet).  
         eventQueue addAll: aGDBEventSet.
         eventQueue add: (GDBEventSetProcessingFinished new setEventSet: aGDBEventSet).
-        eventDispatchNotifier signal.
+        eventDispatcher notify.
     ].
 
     "Created: / 02-06-2014 / 22:42:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 02-10-2018 / 14:00:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 02-10-2018 / 14:30:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBConnection methodsFor:'initialize & release'!
@@ -356,17 +295,23 @@
     ].
     eventQueue := OrderedCollection new.
     eventQueueLock := RecursionLock new.
-    eventDispatchNotifier := Semaphore new.
+    eventAnnouncerInternal := Announcer new.
     eventAnnouncer := Announcer new.
     eventAnnouncer subscriptionRegistry 
         subscriptionClass:GDBEventSubscription.
-    eventAnnouncerInternal := Announcer new.
+    eventDispatcher := GDBEventDispatcher new
+                        setQueue: eventQueue;
+                        setLock: eventQueueLock;
+                        setAnnouncer1: eventAnnouncerInternal;
+                        setAnnouncer2: eventAnnouncer;
+                        yourself.
     outstandingCommands := Set new.
     recorder := GDBMITracer new.
     aGDBProcess connection:self.
 
     "Created: / 20-06-2014 / 21:40:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 12-01-2018 / 00:12:25 / jv"
+    "Modified: / 02-10-2018 / 14:29:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 16-01-2019 / 23:02:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
--- a/GDBDebugger.st	Tue Mar 09 12:29:05 2021 +0000
+++ b/GDBDebugger.st	Tue Mar 09 20:49:55 2021 +0000
@@ -783,7 +783,6 @@
         block value.
         ^ nil
     ].
-    "/ Synchronous send...
     self 
         assert:Processor activeProcess ~~ connection eventDispatchProcess
         message:'Cannot send commands from within event dispatching process. Would deadlock'.            
@@ -832,6 +831,7 @@
     ^ eventHandlers isCollection ifTrue:[ eventsArray ] ifFalse:[ eventsArray first ]
 
     "Created: / 08-03-2015 / 07:28:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 02-10-2018 / 14:26:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified (format): / 03-10-2018 / 12:58:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBEventDispatcher.st	Tue Mar 09 20:49:55 2021 +0000
@@ -0,0 +1,213 @@
+"
+jv:libgdbs - GNU Debugger Interface Library
+Copyright (C) 2015-now Jan Vrany
+Copyright (C) 2021 LabWare
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License. 
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+"
+"{ Package: 'jv:libgdbs' }"
+
+"{ NameSpace: Smalltalk }"
+
+Object subclass:#GDBEventDispatcher
+	instanceVariableNames:'queue lock notifier process stopping announcer1 announcer2'
+	classVariableNames:''
+	poolDictionaries:'GDBDebugFlags'
+	category:'GDB-Private'
+!
+
+!GDBEventDispatcher class methodsFor:'documentation'!
+
+copyright
+"
+jv:libgdbs - GNU Debugger Interface Library
+Copyright (C) 2015-now Jan Vrany
+Copyright (C) 2021 LabWare
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License. 
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+"
+! !
+
+!GDBEventDispatcher class methodsFor:'instance creation'!
+
+new
+    "return an initialized instance"
+
+    ^ self basicNew initialize.
+! !
+
+!GDBEventDispatcher methodsFor:'accessing'!
+
+process
+    ^ process
+! !
+
+!GDBEventDispatcher methodsFor:'dispatching'!
+
+notify
+    "Notify dispatcher that there may be some new
+     events in the queue."
+
+    notifier signal.
+
+    "Created: / 02-10-2018 / 14:24:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+start
+    self assert: queue notNil.
+    self assert: lock notNil.
+
+    process isNil ifTrue:[
+        stopping := false.
+        process := [
+                TraceEvents ifTrue:[
+                    Logger log: 'event loop: starting' severity: #trace facility: 'GDB'
+                ].
+                self dispatch.
+            ] newProcess.
+        process name:('GDB Event dispatcher').
+        process priority:Processor userBackgroundPriority.
+        process addExitAction:[ 
+            process := nil. 
+            stopping := nil.
+            TraceEvents ifTrue:[
+                Logger log: 'event loop: terminated' severity: #trace facility: 'GDB'
+            ].
+        ].
+        process resume.
+    ].
+
+    "Created: / 02-10-2018 / 14:25:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (format): / 02-10-2018 / 16:34:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+stop            
+    stopping := true.
+    notifier signal.
+
+    "Created: / 02-10-2018 / 14:25:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBEventDispatcher methodsFor:'initialization'!
+
+initialize
+    "Invoked when a new instance is created."
+
+    super initialize.
+    notifier := Semaphore new
+
+    "Modified: / 02-10-2018 / 14:13:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+setAnnouncer1: anAnnouncer
+    announcer1 := anAnnouncer
+
+    "Created: / 02-10-2018 / 14:21:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+setAnnouncer2: anAnnouncer
+    announcer2 := anAnnouncer
+
+    "Created: / 02-10-2018 / 14:21:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+setLock: aRecursionLock 
+    lock := aRecursionLock
+
+    "Created: / 02-10-2018 / 14:20:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+setQueue: anOrderedCollection 
+    queue := anOrderedCollection.
+
+    "Created: / 02-10-2018 / 14:20:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBEventDispatcher methodsFor:'private'!
+
+dispatch
+    "raise an error: this method should be implemented (TODO)"
+    
+    [
+        | eventQueueEmpty |
+
+        eventQueueEmpty := false.
+        [ eventQueueEmpty ] whileFalse:[
+            | event |
+
+            event := nil.
+            lock 
+                critical:[
+                    eventQueueEmpty := queue isEmpty.
+                    eventQueueEmpty ifFalse:[
+                        event := queue removeFirst.
+                    ]
+                ].
+            eventQueueEmpty ifFalse:[
+                (AbortOperationRequest , AbortAllOperationRequest) 
+                    ignoreIn:[ self dispatchEvent:event. ]
+            ].
+        ].
+        stopping == true ifTrue:[
+            ^ self.
+        ].
+        notifier wait.
+    ] loop.
+
+    "Created: / 02-06-2014 / 22:51:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 14-01-2018 / 21:54:32 / jv"
+    "Modified: / 02-10-2018 / 13:35:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+dispatchEvent:aGDBEvent 
+    TraceEvents ifTrue:[
+        Logger 
+            log:('event loop: broadcasting %1 (%2)' bindWith:aGDBEvent class name
+                    with:aGDBEvent token)
+            severity:#trace
+            facility:'GDB'
+            originator:self
+            attachment:aGDBEvent
+    ].
+    announcer1 notNil ifTrue:[
+        announcer1 announce:aGDBEvent.
+    ].
+    announcer2 notNil ifTrue:[
+        announcer2 announce:aGDBEvent
+    ].
+
+    "Created: / 02-06-2014 / 22:58:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 02-10-2018 / 14:36:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBEventDispatcher class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
+
--- a/GDBFeatures.st	Tue Mar 09 12:29:05 2021 +0000
+++ b/GDBFeatures.st	Tue Mar 09 20:49:55 2021 +0000
@@ -96,5 +96,12 @@
     "Modified: / 07-02-2018 / 12:51:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!GDBFeatures class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
+
 
 GDBFeatures initialize!
--- a/Make.proto	Tue Mar 09 12:29:05 2021 +0000
+++ b/Make.proto	Tue Mar 09 20:49:55 2021 +0000
@@ -168,6 +168,7 @@
 $(OUTDIR)GDBConnection.$(O) GDBConnection.$(C) GDBConnection.$(H): GDBConnection.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebugFlags.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBDebugger.$(O) GDBDebugger.$(C) GDBDebugger.$(H): GDBDebugger.st $(INCLUDE_TOP)/jv/libgdbs/GDBCommandStatus.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBFeatures.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBDebuggerObject.$(O) GDBDebuggerObject.$(C) GDBDebuggerObject.$(H): GDBDebuggerObject.st $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)GDBEventDispatcher.$(O) GDBEventDispatcher.$(C) GDBEventDispatcher.$(H): GDBEventDispatcher.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebugFlags.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBInternalEvent.$(O) GDBInternalEvent.$(C) GDBInternalEvent.$(H): GDBInternalEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBInvalidObjectError.$(O) GDBInvalidObjectError.$(C) GDBInvalidObjectError.$(H): GDBInvalidObjectError.st $(INCLUDE_TOP)/jv/libgdbs/GDBError.$(H) $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBLocalProcess.$(O) GDBLocalProcess.$(C) GDBLocalProcess.$(H): GDBLocalProcess.st $(INCLUDE_TOP)/jv/libgdbs/GDBProcess.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
--- a/Make.spec	Tue Mar 09 12:29:05 2021 +0000
+++ b/Make.spec	Tue Mar 09 20:49:55 2021 +0000
@@ -92,6 +92,7 @@
 	GDBConnection \
 	GDBDebugger \
 	GDBDebuggerObject \
+	GDBEventDispatcher \
 	GDBInternalEvent \
 	GDBInvalidObjectError \
 	GDBLocalProcess \
@@ -311,6 +312,7 @@
     $(OUTDIR)GDBConnection.$(O) \
     $(OUTDIR)GDBDebugger.$(O) \
     $(OUTDIR)GDBDebuggerObject.$(O) \
+    $(OUTDIR)GDBEventDispatcher.$(O) \
     $(OUTDIR)GDBInternalEvent.$(O) \
     $(OUTDIR)GDBInvalidObjectError.$(O) \
     $(OUTDIR)GDBLocalProcess.$(O) \
--- a/abbrev.stc	Tue Mar 09 12:29:05 2021 +0000
+++ b/abbrev.stc	Tue Mar 09 20:49:55 2021 +0000
@@ -42,6 +42,7 @@
 GDBConnection GDBConnection jv:libgdbs 'GDB-Private' 0
 GDBDebugger GDBDebugger jv:libgdbs 'GDB-Core' 0
 GDBDebuggerObject GDBDebuggerObject jv:libgdbs 'GDB-Core' 0
+GDBEventDispatcher GDBEventDispatcher jv:libgdbs 'GDB-Private' 0
 GDBInternalEvent GDBInternalEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBInvalidObjectError GDBInvalidObjectError jv:libgdbs 'GDB-Core-Exeptions' 1
 GDBLocalProcess GDBLocalProcess jv:libgdbs 'GDB-Private' 0
--- a/bc.mak	Tue Mar 09 12:29:05 2021 +0000
+++ b/bc.mak	Tue Mar 09 20:49:55 2021 +0000
@@ -115,6 +115,7 @@
 $(OUTDIR)GDBConnection.$(O) GDBConnection.$(C) GDBConnection.$(H): GDBConnection.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebugFlags.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBDebugger.$(O) GDBDebugger.$(C) GDBDebugger.$(H): GDBDebugger.st $(INCLUDE_TOP)\jv\libgdbs\GDBCommandStatus.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBFeatures.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBDebuggerObject.$(O) GDBDebuggerObject.$(C) GDBDebuggerObject.$(H): GDBDebuggerObject.st $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)GDBEventDispatcher.$(O) GDBEventDispatcher.$(C) GDBEventDispatcher.$(H): GDBEventDispatcher.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebugFlags.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBInternalEvent.$(O) GDBInternalEvent.$(C) GDBInternalEvent.$(H): GDBInternalEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBInvalidObjectError.$(O) GDBInvalidObjectError.$(C) GDBInvalidObjectError.$(H): GDBInvalidObjectError.st $(INCLUDE_TOP)\jv\libgdbs\GDBError.$(H) $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBLocalProcess.$(O) GDBLocalProcess.$(C) GDBLocalProcess.$(H): GDBLocalProcess.st $(INCLUDE_TOP)\jv\libgdbs\GDBProcess.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
--- a/jv_libgdbs.st	Tue Mar 09 12:29:05 2021 +0000
+++ b/jv_libgdbs.st	Tue Mar 09 20:49:55 2021 +0000
@@ -159,6 +159,7 @@
         GDBConnection
         GDBDebugger
         GDBDebuggerObject
+        GDBEventDispatcher
         GDBInternalEvent
         GDBInvalidObjectError
         GDBLocalProcess
--- a/libInit.cc	Tue Mar 09 12:29:05 2021 +0000
+++ b/libInit.cc	Tue Mar 09 20:49:55 2021 +0000
@@ -57,6 +57,7 @@
 extern void _GDBConnection_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBDebugger_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBDebuggerObject_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _GDBEventDispatcher_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBInternalEvent_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBInvalidObjectError_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _GDBLocalProcess_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
@@ -285,6 +286,7 @@
     _GDBConnection_Init(pass,__pRT__,snd);
     _GDBDebugger_Init(pass,__pRT__,snd);
     _GDBDebuggerObject_Init(pass,__pRT__,snd);
+    _GDBEventDispatcher_Init(pass,__pRT__,snd);
     _GDBInternalEvent_Init(pass,__pRT__,snd);
     _GDBInvalidObjectError_Init(pass,__pRT__,snd);
     _GDBLocalProcess_Init(pass,__pRT__,snd);
--- a/tests/GDBDebuggerTestsR.st	Tue Mar 09 12:29:05 2021 +0000
+++ b/tests/GDBDebuggerTestsR.st	Tue Mar 09 20:49:55 2021 +0000
@@ -1,7 +1,7 @@
 "
 jv:libgdbs - GNU Debugger Interface Library
 Copyright (C) 2015-now Jan Vrany
-Copyright (C) 2020 LabWare
+Copyright (C) 2020-2021 LabWare
 
 This library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
@@ -34,7 +34,7 @@
 "
 jv:libgdbs - GNU Debugger Interface Library
 Copyright (C) 2015-now Jan Vrany
-Copyright (C) 2020 LabWare
+Copyright (C) 2020-2021 LabWare
 
 This library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
@@ -185,11 +185,11 @@
 !
 
 test_basic_01
-    | timeToExit eventPumpProcess eventDispatchProcess|
+    | timeToExit eventPumpProcess eventDispatchProcess |
 
     timeToExit := 0.
     eventPumpProcess := (debugger instVarNamed: #connection) instVarNamed: #eventPumpProcess.
-    eventDispatchProcess := (debugger instVarNamed: #connection) instVarNamed: #eventDispatchProcess.
+    eventDispatchProcess := ((debugger instVarNamed: #connection) instVarNamed: #eventDispatcher) instVarNamed: #process.
     self assert: debugger isConnected.
     self assert: eventPumpProcess isDead not.
     self assert: eventDispatchProcess isDead not.
@@ -207,6 +207,7 @@
     "Created: / 24-06-2014 / 09:06:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 12-01-2018 / 15:29:08 / jv"
     "Modified: / 18-10-2018 / 10:55:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 09-03-2021 / 20:53:19 / Jan Vrany <jan.vrany@labware.com>"
 !
 
 test_breakpoints_01a