Added support for threads.
authorJan Vrany <jan.vrany@fit.cvut.cz>
Sun, 07 Sep 2014 22:44:55 +0100
changeset 36 095c4b0b74d3
parent 35 c17ecf90e446
child 37 a85f0c91f164
Added support for threads. Each thread group now knows it's threads.
GDBBreakpoint.st
GDBConnection.st
GDBDebugger.st
GDBDebuggerObject.st
GDBThread.st
GDBThreadEvent.st
GDBThreadGroup.st
GDBThreadGroupEvent.st
Make.proto
Make.spec
abbrev.stc
bc.mak
jv_libgdbs.st
libInit.cc
libgdbs.rc
tests/GDBDebuggerTests.st
tests/GDBInternalPipeStreamTests.st
tests/tests.rc
--- a/GDBBreakpoint.st	Sun Sep 07 14:42:02 2014 +0100
+++ b/GDBBreakpoint.st	Sun Sep 07 22:44:55 2014 +0100
@@ -1,6 +1,6 @@
 "{ Package: 'jv:libgdbs' }"
 
-GDBObject subclass:#GDBBreakpoint
+GDBDebuggerObject subclass:#GDBBreakpoint
 	instanceVariableNames:'number type disp enabled addr func file fullname line times'
 	classVariableNames:''
 	poolDictionaries:''
--- a/GDBConnection.st	Sun Sep 07 14:42:02 2014 +0100
+++ b/GDBConnection.st	Sun Sep 07 22:44:55 2014 +0100
@@ -86,12 +86,18 @@
                 ].
             ].
         ].
-        process pid isNil ifTrue:[ ^ self ]. "/ gdb process terninated
+        process pid isNil ifTrue:[ 
+            "/ gdb process terninated
+            (process debuggerOutput isNil or:[ process debuggerOutput atEnd ]) ifTrue:[ 
+                "/ No unprocessed output in stream...
+                ^ self
+            ]
+        ]. 
         eventQueueNotifier wait.
     ] loop.
 
     "Created: / 02-06-2014 / 22:51:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 20-06-2014 / 21:38:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 07-09-2014 / 22:38:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 eventDispatchSingle: aGDBEvent
--- a/GDBDebugger.st	Sun Sep 07 14:42:02 2014 +0100
+++ b/GDBDebugger.st	Sun Sep 07 22:44:55 2014 +0100
@@ -31,6 +31,14 @@
     "Created: / 02-06-2014 / 23:06:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+inferiorForId: id
+    ^ inferiors ? #() detect:[:e | e id = id ] ifNone:[ 
+        self error: ('No inferior (thread group) with id ''%1'' found!!' bindWith: id)
+    ].
+
+    "Created: / 07-09-2014 / 21:22:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 inferiorStderr
     ^ connection inferiorPTY master
 
@@ -149,48 +157,56 @@
     "Modified: / 04-06-2014 / 09:28:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+onThreadCreated:aGDBThreadCreatedEvent
+    | inferior |
+
+    inferior := self inferiorForId: aGDBThreadCreatedEvent threadGroupId.
+    inferior onThreadCreated: aGDBThreadCreatedEvent.
+
+    "Created: / 07-09-2014 / 21:20:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+onThreadExited:aGDBThreadExitedEvent
+    | inferior |
+
+    inferior := self inferiorForId: aGDBThreadExitedEvent threadGroupId.
+    inferior onThreadExited: aGDBThreadExitedEvent.
+
+    "Created: / 07-09-2014 / 21:20:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 onThreadGroupAdded:aGDBThreadGroupAddedEvent 
     | inferior |
     inferiors isNil ifTrue:[
         inferiors := List new.
     ].
-    inferior := GDBThreadGroup newWithId:aGDBThreadGroupAddedEvent id.
+    inferior := GDBThreadGroup newWithDebugger: self id:aGDBThreadGroupAddedEvent threadGroupId.
     inferiors add:inferior.
     aGDBThreadGroupAddedEvent setThreadGroup: inferior
 
-    "Modified: / 07-09-2014 / 13:36:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 07-09-2014 / 21:18:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 onThreadGroupExited:aGDBThreadGroupExitedEvent 
     | inferior |
 
-    inferiors notNil ifTrue:[ 
-        inferior := inferiors detect:[:e | e id = aGDBThreadGroupExitedEvent id ].
-    ].
-    inferior isNil ifTrue:[ 
-        self error:('Mo inferior with id "%1" ' bindWith: aGDBThreadGroupExitedEvent id)
-    ].
+    inferior := self inferiorForId: aGDBThreadGroupExitedEvent threadGroupId.    
     inferior setExitCode: aGDBThreadGroupExitedEvent exitCode.
     aGDBThreadGroupExitedEvent setThreadGroup: inferior
 
     "Created: / 06-09-2014 / 02:37:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 07-09-2014 / 13:36:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 07-09-2014 / 21:23:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 onThreadGroupStarted:aGDBThreadGroupStartedEvent
     | inferior |
 
-    inferiors notNil ifTrue:[ 
-        inferior := inferiors detect:[:e | e id = aGDBThreadGroupStartedEvent id ].
-    ].
-    inferior isNil ifTrue:[ 
-        self error:('Mo inferior with id "%1" ' bindWith: aGDBThreadGroupStartedEvent id)
-    ].
+    inferior := self inferiorForId: aGDBThreadGroupStartedEvent threadGroupId.  
     inferior setPid: aGDBThreadGroupStartedEvent pid.
     aGDBThreadGroupStartedEvent setThreadGroup: inferior
 
     "Created: / 06-09-2014 / 02:37:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 07-09-2014 / 13:36:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 07-09-2014 / 21:23:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBDebugger methodsFor:'finalization'!
@@ -243,10 +259,13 @@
 
         when: GDBThreadGroupAddedEvent      send: #onThreadGroupAdded:  to: self;
         when: GDBThreadGroupStartedEvent    send: #onThreadGroupStarted: to: self;
-        when: GDBThreadGroupExitedEvent     send: #onThreadGroupExited: to: self.
+        when: GDBThreadGroupExitedEvent     send: #onThreadGroupExited: to: self;
+
+        when: GDBThreadCreatedEvent         send: #onThreadCreated:      to: self;
+        when: GDBThreadExitedEvent          send: #onThreadExited:       to: self.
 
     "Created: / 20-06-2014 / 22:07:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 06-09-2014 / 02:30:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 07-09-2014 / 22:29:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 unsubscribe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GDBDebuggerObject.st	Sun Sep 07 22:44:55 2014 +0100
@@ -0,0 +1,18 @@
+"{ Package: 'jv:libgdbs' }"
+
+GDBObject subclass:#GDBDebuggerObject
+	instanceVariableNames:'debugger'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'GDB-Core'
+!
+
+!GDBDebuggerObject methodsFor:'initialization'!
+
+setDebugger: aGDBDebugger
+    self assert: debugger isNil.
+    debugger := aGDBDebugger
+
+    "Created: / 07-09-2014 / 21:17:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- a/GDBThread.st	Sun Sep 07 14:42:02 2014 +0100
+++ b/GDBThread.st	Sun Sep 07 22:44:55 2014 +0100
@@ -1,12 +1,24 @@
 "{ Package: 'jv:libgdbs' }"
 
-GDBObject subclass:#GDBThread
-	instanceVariableNames:'id group'
+GDBDebuggerObject subclass:#GDBThread
+	instanceVariableNames:'id group terminated'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'GDB-Core'
 !
 
+!GDBThread class methodsFor:'instance creation'!
+
+newWithDebugger: debugger id: id group: group
+    ^ self new
+        setDebugger: debugger;
+        setId: id;
+        setGroup: group;
+        yourself.
+
+    "Created: / 07-09-2014 / 21:33:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !GDBThread class methodsFor:'accessing - GDB value descriptors'!
 
 gdbValueDescriptor
@@ -17,3 +29,39 @@
     "Created: / 06-09-2014 / 02:21:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!GDBThread methodsFor:'accessing'!
+
+id
+    ^ id
+
+    "Created: / 07-09-2014 / 22:41:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+terminated
+    ^ terminated ? false
+
+    "Modified: / 07-09-2014 / 21:37:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBThread methodsFor:'initialization'!
+
+setGroup: aGDBThreadGroup
+    self assert: group isNil.
+    group := aGDBThreadGroup.
+
+    "Created: / 07-09-2014 / 21:32:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+setId: tid
+    self assert: id isNil.
+    id := tid.
+
+    "Created: / 07-09-2014 / 21:31:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+setTerminated
+    terminated := true.
+
+    "Created: / 07-09-2014 / 21:37:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- a/GDBThreadEvent.st	Sun Sep 07 14:42:02 2014 +0100
+++ b/GDBThreadEvent.st	Sun Sep 07 22:44:55 2014 +0100
@@ -1,7 +1,7 @@
 "{ Package: 'jv:libgdbs' }"
 
 GDBNotificationEvent subclass:#GDBThreadEvent
-	instanceVariableNames:'id group_id'
+	instanceVariableNames:'thread id group_id'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'GDB-Core-Events'
@@ -18,3 +18,35 @@
     "Created: / 06-09-2014 / 02:08:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!GDBThreadEvent methodsFor:'accessing'!
+
+thread
+    ^ thread
+!
+
+threadGroup
+    ^ thread threadGroup
+
+    "Created: / 07-09-2014 / 18:07:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+threadGroupId
+    ^ group_id
+
+    "Created: / 07-09-2014 / 18:07:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+threadId
+    ^ id
+
+    "Created: / 07-09-2014 / 18:07:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBThreadEvent methodsFor:'initialization'!
+
+setThread: aGDBThread
+    thread := aGDBThread
+
+    "Created: / 07-09-2014 / 15:05:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- a/GDBThreadGroup.st	Sun Sep 07 14:42:02 2014 +0100
+++ b/GDBThreadGroup.st	Sun Sep 07 22:44:55 2014 +0100
@@ -1,6 +1,6 @@
 "{ Package: 'jv:libgdbs' }"
 
-GDBObject subclass:#GDBThreadGroup
+GDBDebuggerObject subclass:#GDBThreadGroup
 	instanceVariableNames:'id pid exit_code threads'
 	classVariableNames:''
 	poolDictionaries:''
@@ -9,10 +9,10 @@
 
 !GDBThreadGroup class methodsFor:'instance creation'!
 
-newWithId: aString
-    ^ self new setId: aString; yourself
+newWithDebugger: debugger id: aString
+    ^ self new setDebugger: debugger; setId: aString; yourself
 
-    "Created: / 06-09-2014 / 02:31:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 07-09-2014 / 21:18:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBThreadGroup class methodsFor:'accessing - GDB value descriptors'!
@@ -42,13 +42,46 @@
     ^ pid
 !
 
+threadWithId: tid
+    ^ threads ? #() detect:[:e | e id = tid ] ifNone:[
+        self error: ('No thread with id ''%1'' found!!' bindWith: tid)        
+    ].
+
+    "Created: / 07-09-2014 / 21:37:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 threads
     threads isNil ifTrue:[ 
         threads := List new.
+    ]. 
+    ^ threads
+
+    "Modified: / 06-09-2014 / 02:23:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (format): / 07-09-2014 / 21:42:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GDBThreadGroup methodsFor:'event handling'!
+
+onThreadCreated:aGDBThreadCreatedEvent
+    | thread |
+    threads isNil ifTrue:[ 
+        threads := List new.
     ].
-    ^ threads
+    thread := GDBThread newWithDebugger: debugger id: aGDBThreadCreatedEvent threadId group: self.
+    threads add: thread.
+    aGDBThreadCreatedEvent setThread: thread.
+
+    "Created: / 07-09-2014 / 21:25:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
 
-    "Modified: / 06-09-2014 / 02:23:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+onThreadExited:aGDBThreadExitedEvent
+    | thread |
+
+    thread := self threadWithId:aGDBThreadExitedEvent threadId.
+    thread setTerminated.
+    aGDBThreadExitedEvent setThread: thread
+
+    "Created: / 07-09-2014 / 21:25:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBThreadGroup methodsFor:'initialization'!
--- a/GDBThreadGroupEvent.st	Sun Sep 07 14:42:02 2014 +0100
+++ b/GDBThreadGroupEvent.st	Sun Sep 07 22:44:55 2014 +0100
@@ -19,19 +19,23 @@
 
 !GDBThreadGroupEvent methodsFor:'accessing'!
 
-id
-    ^ id
+threadGroup
+    ^ threadGroup
 !
 
-threadGroup
-    ^ threadGroup
+threadGroupId
+    ^ id
+
+    "Created: / 07-09-2014 / 15:08:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBThreadGroupEvent methodsFor:'initialization'!
 
 setThreadGroup: aGDBThreadGroup
-    threadGroup := aGDBThreadGroup
+    self assert: id = aGDBThreadGroup id.
+    threadGroup := aGDBThreadGroup.
 
     "Created: / 07-09-2014 / 12:45:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 07-09-2014 / 18:05:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
--- a/Make.proto	Sun Sep 07 14:42:02 2014 +0100
+++ b/Make.proto	Sun Sep 07 22:44:55 2014 +0100
@@ -141,7 +141,6 @@
 $(OUTDIR)GDBValueDescriptorError.$(O) GDBValueDescriptorError.$(H): GDBValueDescriptorError.st $(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)jv_libgdbs.$(O) jv_libgdbs.$(H): jv_libgdbs.st $(INCLUDE_TOP)/stx/libbasic/LibraryDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/ProjectDefinition.$(H) $(STCHDR)
 $(OUTDIR)GDBAsyncEvent.$(O) GDBAsyncEvent.$(H): GDBAsyncEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)GDBBreakpoint.$(O) GDBBreakpoint.$(H): GDBBreakpoint.st $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBCLICommand.$(O) GDBCLICommand.$(H): GDBCLICommand.st $(INCLUDE_TOP)/jv/libgdbs/GDBCommand.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBCommandEvent.$(O) GDBCommandEvent.$(H): GDBCommandEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBCommandResult.$(O) GDBCommandResult.$(H): GDBCommandResult.st $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
@@ -149,6 +148,7 @@
 $(OUTDIR)GDBCompoundValueDescriptor.$(O) GDBCompoundValueDescriptor.$(H): GDBCompoundValueDescriptor.st $(INCLUDE_TOP)/jv/libgdbs/GDBValueDescriptor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBConnection.$(O) GDBConnection.$(H): GDBConnection.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebugFlags.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBDebugger.$(O) GDBDebugger.$(H): GDBDebugger.st $(INCLUDE_TOP)/jv/libgdbs/GDBCommandStatus.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)GDBDebuggerObject.$(O) GDBDebuggerObject.$(H): GDBDebuggerObject.st $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBEnumValueDescriptor.$(O) GDBEnumValueDescriptor.$(H): GDBEnumValueDescriptor.st $(INCLUDE_TOP)/jv/libgdbs/GDBValueDescriptor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBInternalEvent.$(O) 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)GDBMICommand.$(O) GDBMICommand.$(H): GDBMICommand.st $(INCLUDE_TOP)/jv/libgdbs/GDBCommand.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
@@ -157,11 +157,10 @@
 $(OUTDIR)GDBSessionRecorder.$(O) GDBSessionRecorder.$(H): GDBSessionRecorder.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebugFlags.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBSimulatorProcess.$(O) GDBSimulatorProcess.$(H): GDBSimulatorProcess.st $(INCLUDE_TOP)/jv/libgdbs/GDBProcess.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBStreamOutputEvent.$(O) GDBStreamOutputEvent.$(H): GDBStreamOutputEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)GDBThread.$(O) GDBThread.$(H): GDBThread.st $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)GDBThreadGroup.$(O) GDBThreadGroup.$(H): GDBThreadGroup.st $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBUnixProcess.$(O) GDBUnixProcess.$(H): GDBUnixProcess.st $(INCLUDE_TOP)/jv/libgdbs/GDBProcess.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBAddresValueDescriptor.$(O) GDBAddresValueDescriptor.$(H): GDBAddresValueDescriptor.st $(INCLUDE_TOP)/jv/libgdbs/GDBPrimitiveValueDescriptor.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBValueDescriptor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBBooleanValueDescriptor.$(O) GDBBooleanValueDescriptor.$(H): GDBBooleanValueDescriptor.st $(INCLUDE_TOP)/jv/libgdbs/GDBPrimitiveValueDescriptor.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBValueDescriptor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)GDBBreakpoint.$(O) GDBBreakpoint.$(H): GDBBreakpoint.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebuggerObject.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBConsoleOutputEvent.$(O) GDBConsoleOutputEvent.$(H): GDBConsoleOutputEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBStreamOutputEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBExecutionEvent.$(O) GDBExecutionEvent.$(H): GDBExecutionEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBAsyncEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBExitEvent.$(O) GDBExitEvent.$(H): GDBExitEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBInternalEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
@@ -282,6 +281,8 @@
 $(OUTDIR)GDBStatusEvent.$(O) GDBStatusEvent.$(H): GDBStatusEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBAsyncEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBStringValueDescriptor.$(O) GDBStringValueDescriptor.$(H): GDBStringValueDescriptor.st $(INCLUDE_TOP)/jv/libgdbs/GDBPrimitiveValueDescriptor.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBValueDescriptor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBTargetOutputEvent.$(O) GDBTargetOutputEvent.$(H): GDBTargetOutputEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBStreamOutputEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)GDBThread.$(O) GDBThread.$(H): GDBThread.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebuggerObject.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)GDBThreadGroup.$(O) GDBThreadGroup.$(H): GDBThreadGroup.st $(INCLUDE_TOP)/jv/libgdbs/GDBDebuggerObject.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBBreakpointDeletedEvent.$(O) GDBBreakpointDeletedEvent.$(H): GDBBreakpointDeletedEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBAsyncEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBNotificationEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBBreakpointEvent.$(O) GDBBreakpointEvent.$(H): GDBBreakpointEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBAsyncEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBNotificationEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)GDBLibraryLoadedEvent.$(O) GDBLibraryLoadedEvent.$(H): GDBLibraryLoadedEvent.st $(INCLUDE_TOP)/jv/libgdbs/GDBAsyncEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBEvent.$(H) $(INCLUDE_TOP)/jv/libgdbs/GDBNotificationEvent.$(H) $(INCLUDE_TOP)/stx/goodies/announcements/Announcement.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
--- a/Make.spec	Sun Sep 07 14:42:02 2014 +0100
+++ b/Make.spec	Sun Sep 07 22:44:55 2014 +0100
@@ -64,7 +64,6 @@
 	GDBValueDescriptorError \
 	jv_libgdbs \
 	GDBAsyncEvent \
-	GDBBreakpoint \
 	GDBCLICommand \
 	GDBCommandEvent \
 	GDBCommandResult \
@@ -72,6 +71,7 @@
 	GDBCompoundValueDescriptor \
 	GDBConnection \
 	GDBDebugger \
+	GDBDebuggerObject \
 	GDBEnumValueDescriptor \
 	GDBInternalEvent \
 	GDBMICommand \
@@ -80,11 +80,10 @@
 	GDBSessionRecorder \
 	GDBSimulatorProcess \
 	GDBStreamOutputEvent \
-	GDBThread \
-	GDBThreadGroup \
 	GDBUnixProcess \
 	GDBAddresValueDescriptor \
 	GDBBooleanValueDescriptor \
+	GDBBreakpoint \
 	GDBConsoleOutputEvent \
 	GDBExecutionEvent \
 	GDBExitEvent \
@@ -205,6 +204,8 @@
 	GDBStatusEvent \
 	GDBStringValueDescriptor \
 	GDBTargetOutputEvent \
+	GDBThread \
+	GDBThreadGroup \
 	GDBBreakpointDeletedEvent \
 	GDBBreakpointEvent \
 	GDBLibraryLoadedEvent \
@@ -239,7 +240,6 @@
     $(OUTDIR_SLASH)GDBValueDescriptorError.$(O) \
     $(OUTDIR_SLASH)jv_libgdbs.$(O) \
     $(OUTDIR_SLASH)GDBAsyncEvent.$(O) \
-    $(OUTDIR_SLASH)GDBBreakpoint.$(O) \
     $(OUTDIR_SLASH)GDBCLICommand.$(O) \
     $(OUTDIR_SLASH)GDBCommandEvent.$(O) \
     $(OUTDIR_SLASH)GDBCommandResult.$(O) \
@@ -247,6 +247,7 @@
     $(OUTDIR_SLASH)GDBCompoundValueDescriptor.$(O) \
     $(OUTDIR_SLASH)GDBConnection.$(O) \
     $(OUTDIR_SLASH)GDBDebugger.$(O) \
+    $(OUTDIR_SLASH)GDBDebuggerObject.$(O) \
     $(OUTDIR_SLASH)GDBEnumValueDescriptor.$(O) \
     $(OUTDIR_SLASH)GDBInternalEvent.$(O) \
     $(OUTDIR_SLASH)GDBMICommand.$(O) \
@@ -255,11 +256,10 @@
     $(OUTDIR_SLASH)GDBSessionRecorder.$(O) \
     $(OUTDIR_SLASH)GDBSimulatorProcess.$(O) \
     $(OUTDIR_SLASH)GDBStreamOutputEvent.$(O) \
-    $(OUTDIR_SLASH)GDBThread.$(O) \
-    $(OUTDIR_SLASH)GDBThreadGroup.$(O) \
     $(OUTDIR_SLASH)GDBUnixProcess.$(O) \
     $(OUTDIR_SLASH)GDBAddresValueDescriptor.$(O) \
     $(OUTDIR_SLASH)GDBBooleanValueDescriptor.$(O) \
+    $(OUTDIR_SLASH)GDBBreakpoint.$(O) \
     $(OUTDIR_SLASH)GDBConsoleOutputEvent.$(O) \
     $(OUTDIR_SLASH)GDBExecutionEvent.$(O) \
     $(OUTDIR_SLASH)GDBExitEvent.$(O) \
@@ -380,6 +380,8 @@
     $(OUTDIR_SLASH)GDBStatusEvent.$(O) \
     $(OUTDIR_SLASH)GDBStringValueDescriptor.$(O) \
     $(OUTDIR_SLASH)GDBTargetOutputEvent.$(O) \
+    $(OUTDIR_SLASH)GDBThread.$(O) \
+    $(OUTDIR_SLASH)GDBThreadGroup.$(O) \
     $(OUTDIR_SLASH)GDBBreakpointDeletedEvent.$(O) \
     $(OUTDIR_SLASH)GDBBreakpointEvent.$(O) \
     $(OUTDIR_SLASH)GDBLibraryLoadedEvent.$(O) \
--- a/abbrev.stc	Sun Sep 07 14:42:02 2014 +0100
+++ b/abbrev.stc	Sun Sep 07 22:44:55 2014 +0100
@@ -16,7 +16,6 @@
 GDBValueDescriptorError GDBValueDescriptorError jv:libgdbs 'GDB-Private-Descriptors' 1
 jv_libgdbs jv_libgdbs jv:libgdbs '* Projects & Packages *' 3
 GDBAsyncEvent GDBAsyncEvent jv:libgdbs 'GDB-Core-Events' 0
-GDBBreakpoint GDBBreakpoint jv:libgdbs 'GDB-Core' 0
 GDBCLICommand GDBCLICommand jv:libgdbs 'GDB-Core-Commands' 0
 GDBCommandEvent GDBCommandEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBCommandResult GDBCommandResult jv:libgdbs 'GDB-Core-Commands' 0
@@ -24,6 +23,7 @@
 GDBCompoundValueDescriptor GDBCompoundValueDescriptor jv:libgdbs 'GDB-Private-Descriptors' 0
 GDBConnection GDBConnection jv:libgdbs 'GDB-Private' 0
 GDBDebugger GDBDebugger jv:libgdbs 'GDB-Core' 0
+GDBDebuggerObject GDBDebuggerObject jv:libgdbs 'GDB-Core' 0
 GDBEnumValueDescriptor GDBEnumValueDescriptor jv:libgdbs 'GDB-Private-Descriptors' 0
 GDBInternalEvent GDBInternalEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBMICommand GDBMICommand jv:libgdbs 'GDB-Core-Commands' 0
@@ -32,11 +32,10 @@
 GDBSessionRecorder GDBSessionRecorder jv:libgdbs 'GDB-Private-Simulator' 0
 GDBSimulatorProcess GDBSimulatorProcess jv:libgdbs 'GDB-Private-Simulator' 0
 GDBStreamOutputEvent GDBStreamOutputEvent jv:libgdbs 'GDB-Core-Events' 0
-GDBThread GDBThread jv:libgdbs 'GDB-Core' 0
-GDBThreadGroup GDBThreadGroup jv:libgdbs 'GDB-Core' 0
 GDBUnixProcess GDBUnixProcess jv:libgdbs 'GDB-Private' 0
 GDBAddresValueDescriptor GDBAddresValueDescriptor jv:libgdbs 'GDB-Private-Descriptors' 0
 GDBBooleanValueDescriptor GDBBooleanValueDescriptor jv:libgdbs 'GDB-Private-Descriptors' 0
+GDBBreakpoint GDBBreakpoint jv:libgdbs 'GDB-Core' 0
 GDBConsoleOutputEvent GDBConsoleOutputEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBExecutionEvent GDBExecutionEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBExitEvent GDBExitEvent jv:libgdbs 'GDB-Core-Events' 0
@@ -157,6 +156,8 @@
 GDBStatusEvent GDBStatusEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBStringValueDescriptor GDBStringValueDescriptor jv:libgdbs 'GDB-Private-Descriptors' 0
 GDBTargetOutputEvent GDBTargetOutputEvent jv:libgdbs 'GDB-Core-Events' 0
+GDBThread GDBThread jv:libgdbs 'GDB-Core' 0
+GDBThreadGroup GDBThreadGroup jv:libgdbs 'GDB-Core' 0
 GDBBreakpointDeletedEvent GDBBreakpointDeletedEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBBreakpointEvent GDBBreakpointEvent jv:libgdbs 'GDB-Core-Events' 0
 GDBLibraryLoadedEvent GDBLibraryLoadedEvent jv:libgdbs 'GDB-Core-Events' 0
--- a/bc.mak	Sun Sep 07 14:42:02 2014 +0100
+++ b/bc.mak	Sun Sep 07 22:44:55 2014 +0100
@@ -87,7 +87,6 @@
 $(OUTDIR)GDBValueDescriptorError.$(O) GDBValueDescriptorError.$(H): GDBValueDescriptorError.st $(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)jv_libgdbs.$(O) jv_libgdbs.$(H): jv_libgdbs.st $(INCLUDE_TOP)\stx\libbasic\LibraryDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\ProjectDefinition.$(H) $(STCHDR)
 $(OUTDIR)GDBAsyncEvent.$(O) GDBAsyncEvent.$(H): GDBAsyncEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)GDBBreakpoint.$(O) GDBBreakpoint.$(H): GDBBreakpoint.st $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBCLICommand.$(O) GDBCLICommand.$(H): GDBCLICommand.st $(INCLUDE_TOP)\jv\libgdbs\GDBCommand.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBCommandEvent.$(O) GDBCommandEvent.$(H): GDBCommandEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBCommandResult.$(O) GDBCommandResult.$(H): GDBCommandResult.st $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
@@ -95,6 +94,7 @@
 $(OUTDIR)GDBCompoundValueDescriptor.$(O) GDBCompoundValueDescriptor.$(H): GDBCompoundValueDescriptor.st $(INCLUDE_TOP)\jv\libgdbs\GDBValueDescriptor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBConnection.$(O) GDBConnection.$(H): GDBConnection.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebugFlags.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBDebugger.$(O) GDBDebugger.$(H): GDBDebugger.st $(INCLUDE_TOP)\jv\libgdbs\GDBCommandStatus.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)GDBDebuggerObject.$(O) GDBDebuggerObject.$(H): GDBDebuggerObject.st $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBEnumValueDescriptor.$(O) GDBEnumValueDescriptor.$(H): GDBEnumValueDescriptor.st $(INCLUDE_TOP)\jv\libgdbs\GDBValueDescriptor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBInternalEvent.$(O) 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)GDBMICommand.$(O) GDBMICommand.$(H): GDBMICommand.st $(INCLUDE_TOP)\jv\libgdbs\GDBCommand.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
@@ -103,11 +103,10 @@
 $(OUTDIR)GDBSessionRecorder.$(O) GDBSessionRecorder.$(H): GDBSessionRecorder.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebugFlags.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBSimulatorProcess.$(O) GDBSimulatorProcess.$(H): GDBSimulatorProcess.st $(INCLUDE_TOP)\jv\libgdbs\GDBProcess.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBStreamOutputEvent.$(O) GDBStreamOutputEvent.$(H): GDBStreamOutputEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)GDBThread.$(O) GDBThread.$(H): GDBThread.st $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)GDBThreadGroup.$(O) GDBThreadGroup.$(H): GDBThreadGroup.st $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBUnixProcess.$(O) GDBUnixProcess.$(H): GDBUnixProcess.st $(INCLUDE_TOP)\jv\libgdbs\GDBProcess.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBAddresValueDescriptor.$(O) GDBAddresValueDescriptor.$(H): GDBAddresValueDescriptor.st $(INCLUDE_TOP)\jv\libgdbs\GDBPrimitiveValueDescriptor.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBValueDescriptor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBBooleanValueDescriptor.$(O) GDBBooleanValueDescriptor.$(H): GDBBooleanValueDescriptor.st $(INCLUDE_TOP)\jv\libgdbs\GDBPrimitiveValueDescriptor.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBValueDescriptor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)GDBBreakpoint.$(O) GDBBreakpoint.$(H): GDBBreakpoint.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebuggerObject.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBConsoleOutputEvent.$(O) GDBConsoleOutputEvent.$(H): GDBConsoleOutputEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBStreamOutputEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBExecutionEvent.$(O) GDBExecutionEvent.$(H): GDBExecutionEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBAsyncEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBExitEvent.$(O) GDBExitEvent.$(H): GDBExitEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBInternalEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
@@ -228,6 +227,8 @@
 $(OUTDIR)GDBStatusEvent.$(O) GDBStatusEvent.$(H): GDBStatusEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBAsyncEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBStringValueDescriptor.$(O) GDBStringValueDescriptor.$(H): GDBStringValueDescriptor.st $(INCLUDE_TOP)\jv\libgdbs\GDBPrimitiveValueDescriptor.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBValueDescriptor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBTargetOutputEvent.$(O) GDBTargetOutputEvent.$(H): GDBTargetOutputEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBStreamOutputEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)GDBThread.$(O) GDBThread.$(H): GDBThread.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebuggerObject.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)GDBThreadGroup.$(O) GDBThreadGroup.$(H): GDBThreadGroup.st $(INCLUDE_TOP)\jv\libgdbs\GDBDebuggerObject.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBBreakpointDeletedEvent.$(O) GDBBreakpointDeletedEvent.$(H): GDBBreakpointDeletedEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBAsyncEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBNotificationEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBBreakpointEvent.$(O) GDBBreakpointEvent.$(H): GDBBreakpointEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBAsyncEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBNotificationEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)GDBLibraryLoadedEvent.$(O) GDBLibraryLoadedEvent.$(H): GDBLibraryLoadedEvent.st $(INCLUDE_TOP)\jv\libgdbs\GDBAsyncEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBEvent.$(H) $(INCLUDE_TOP)\jv\libgdbs\GDBNotificationEvent.$(H) $(INCLUDE_TOP)\stx\goodies\announcements\Announcement.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
--- a/jv_libgdbs.st	Sun Sep 07 14:42:02 2014 +0100
+++ b/jv_libgdbs.st	Sun Sep 07 22:44:55 2014 +0100
@@ -81,7 +81,6 @@
         GDBValueDescriptorError
         #'jv_libgdbs'
         GDBAsyncEvent
-        GDBBreakpoint
         GDBCLICommand
         GDBCommandEvent
         GDBCommandResult
@@ -89,6 +88,7 @@
         GDBCompoundValueDescriptor
         GDBConnection
         GDBDebugger
+        GDBDebuggerObject
         GDBEnumValueDescriptor
         GDBInternalEvent
         GDBMICommand
@@ -97,11 +97,10 @@
         GDBSessionRecorder
         GDBSimulatorProcess
         GDBStreamOutputEvent
-        GDBThread
-        GDBThreadGroup
         GDBUnixProcess
         GDBAddresValueDescriptor
         GDBBooleanValueDescriptor
+        GDBBreakpoint
         GDBConsoleOutputEvent
         GDBExecutionEvent
         GDBExitEvent
@@ -222,6 +221,8 @@
         GDBStatusEvent
         GDBStringValueDescriptor
         GDBTargetOutputEvent
+        GDBThread
+        GDBThreadGroup
         GDBBreakpointDeletedEvent
         GDBBreakpointEvent
         GDBLibraryLoadedEvent
--- a/libInit.cc	Sun Sep 07 14:42:02 2014 +0100
+++ b/libInit.cc	Sun Sep 07 22:44:55 2014 +0100
@@ -41,7 +41,6 @@
 _GDBValueDescriptorError_Init(pass,__pRT__,snd);
 _jv_137libgdbs_Init(pass,__pRT__,snd);
 _GDBAsyncEvent_Init(pass,__pRT__,snd);
-_GDBBreakpoint_Init(pass,__pRT__,snd);
 _GDBCLICommand_Init(pass,__pRT__,snd);
 _GDBCommandEvent_Init(pass,__pRT__,snd);
 _GDBCommandResult_Init(pass,__pRT__,snd);
@@ -49,6 +48,7 @@
 _GDBCompoundValueDescriptor_Init(pass,__pRT__,snd);
 _GDBConnection_Init(pass,__pRT__,snd);
 _GDBDebugger_Init(pass,__pRT__,snd);
+_GDBDebuggerObject_Init(pass,__pRT__,snd);
 _GDBEnumValueDescriptor_Init(pass,__pRT__,snd);
 _GDBInternalEvent_Init(pass,__pRT__,snd);
 _GDBMICommand_Init(pass,__pRT__,snd);
@@ -57,11 +57,10 @@
 _GDBSessionRecorder_Init(pass,__pRT__,snd);
 _GDBSimulatorProcess_Init(pass,__pRT__,snd);
 _GDBStreamOutputEvent_Init(pass,__pRT__,snd);
-_GDBThread_Init(pass,__pRT__,snd);
-_GDBThreadGroup_Init(pass,__pRT__,snd);
 _GDBUnixProcess_Init(pass,__pRT__,snd);
 _GDBAddresValueDescriptor_Init(pass,__pRT__,snd);
 _GDBBooleanValueDescriptor_Init(pass,__pRT__,snd);
+_GDBBreakpoint_Init(pass,__pRT__,snd);
 _GDBConsoleOutputEvent_Init(pass,__pRT__,snd);
 _GDBExecutionEvent_Init(pass,__pRT__,snd);
 _GDBExitEvent_Init(pass,__pRT__,snd);
@@ -182,6 +181,8 @@
 _GDBStatusEvent_Init(pass,__pRT__,snd);
 _GDBStringValueDescriptor_Init(pass,__pRT__,snd);
 _GDBTargetOutputEvent_Init(pass,__pRT__,snd);
+_GDBThread_Init(pass,__pRT__,snd);
+_GDBThreadGroup_Init(pass,__pRT__,snd);
 _GDBBreakpointDeletedEvent_Init(pass,__pRT__,snd);
 _GDBBreakpointEvent_Init(pass,__pRT__,snd);
 _GDBLibraryLoadedEvent_Init(pass,__pRT__,snd);
--- a/libgdbs.rc	Sun Sep 07 14:42:02 2014 +0100
+++ b/libgdbs.rc	Sun Sep 07 22:44:55 2014 +0100
@@ -25,7 +25,7 @@
       VALUE "LegalCopyright", "My CopyRight or CopyLeft\0"
       VALUE "ProductName", "LibraryName\0"
       VALUE "ProductVersion", "6.2.4.0\0"
-      VALUE "ProductDate", "Sun, 07 Sep 2014 13:39:29 GMT\0"
+      VALUE "ProductDate", "Sun, 07 Sep 2014 21:43:46 GMT\0"
     END
 
   END
--- a/tests/GDBDebuggerTests.st	Sun Sep 07 14:42:02 2014 +0100
+++ b/tests/GDBDebuggerTests.st	Sun Sep 07 22:44:55 2014 +0100
@@ -65,13 +65,16 @@
 !GDBDebuggerTests methodsFor:'tests - threads'!
 
 test_inferiors_01a
-    | event |
+    | tgevent tevent |
 
     simulator := GDBSimulatorProcess new record: GDBSimulatorResource session_factorial_01.
     simulator start.
     debugger := GDBDebugger newWithProcess: simulator.
     debugger announcer when: GDBThreadGroupEvent do:[:ev |  
-        event := ev.
+        tgevent := ev.
+    ].
+    debugger announcer when: GDBThreadEvent do:[:ev |  
+        tevent := ev.
     ].
 
     debugger send: (GDBMI_file_exec_and_symbols new arguments: {'/home/jv/Private/Projects/SmalltalkX/sources/branches/jv1/build/jv/libgdbs/tests/c/factorial'}).
@@ -84,19 +87,33 @@
     "/ self assert: debugger inferiors anElement == event threadGroup.
 
     debugger send: (GDBCLICommand new value: 'r').
+    Delay waitForMilliseconds: 100. "/ Give it chance to catch up with events.  
 
+    self assert: tgevent notNil.
+    self assert: tevent notNil.
     self assert: debugger inferiors size == 1.
     self assert: debugger inferiors anElement pid = 7719.
-    self assert: debugger inferiors anElement == event threadGroup.
+    self assert: debugger inferiors anElement == tgevent threadGroup.
+    self assert: debugger inferiors anElement threads size == 1.
+    self assert: debugger inferiors anElement threads anElement == tevent thread.
+    self assert: debugger inferiors anElement threads anElement terminated not.
+
+    tgevent := tevent := nil.
 
     debugger send: (GDBCLICommand new value: 'del 1').
     debugger send: (GDBCLICommand new value: 'c').
+    Delay waitForMilliseconds: 100. "/ Give it chance to catch up with events.  
 
+    self assert: tgevent notNil.
     self assert: debugger inferiors size == 1.
     self assert: debugger inferiors anElement exitCode = 23.
-    self assert: debugger inferiors anElement == event threadGroup.
+    self assert: debugger inferiors anElement == tgevent threadGroup.
+    self assert: debugger inferiors anElement threads size == 1.
+    self assert: debugger inferiors anElement threads anElement == tevent thread.
+    self assert: debugger inferiors anElement threads anElement terminated.
 
     "Created: / 07-09-2014 / 13:37:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 07-09-2014 / 22:40:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBDebuggerTests class methodsFor:'documentation'!
--- a/tests/GDBInternalPipeStreamTests.st	Sun Sep 07 14:42:02 2014 +0100
+++ b/tests/GDBInternalPipeStreamTests.st	Sun Sep 07 22:44:55 2014 +0100
@@ -499,6 +499,20 @@
     self assert: t2 isDead.
 
     "Created: / 07-09-2014 / 07:51:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_10
+    | pipe |
+
+    pipe := GDBInternalPipeStream new.
+    pipe nextPutAll:'12345'.
+    pipe close.
+    self assert: pipe atEnd not.
+    self assert: pipe next == $1.
+    self assert: (pipe next:4) = '2345'.    
+    self assert: pipe atEnd.
+
+    "Created: / 07-09-2014 / 21:59:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !GDBInternalPipeStreamTests class methodsFor:'documentation'!
--- a/tests/tests.rc	Sun Sep 07 14:42:02 2014 +0100
+++ b/tests/tests.rc	Sun Sep 07 22:44:55 2014 +0100
@@ -25,7 +25,7 @@
       VALUE "LegalCopyright", "My CopyRight or CopyLeft\0"
       VALUE "ProductName", "LibraryName\0"
       VALUE "ProductVersion", "6.2.4.0\0"
-      VALUE "ProductDate", "Sun, 07 Sep 2014 13:39:31 GMT\0"
+      VALUE "ProductDate", "Sun, 07 Sep 2014 21:43:47 GMT\0"
     END
 
   END