GDBEventDispatcher.st
author Jan Vrany <jan.vrany@labware.com>
Mon, 28 Jun 2021 12:44:28 +0100
changeset 243 aaaf3757899b
parent 235 51f916ee4111
child 244 f0e4ddb50242
permissions -rw-r--r--
Allow commands to be sent and waited for from event dispatch loop This commit adds so-wanted ability to execute commands and wait for the result within an event handler. This requires a special handling, because even handlers are executed in event dispatching thread and if blocked, no more events are dispatched (including result event). This commit solves this problem by rather complicated trick: it drains "current" event queue, moving all unprocessed events into a "new" one and then force event dispatch, effectively causing subsequent events to be dispatched in a "new" event dispatch thread. This works, because event dispatch thread is started on demand, only when there are events to process. Therefore, draining current queue causes the current event process to terminate after dispatching the current event and subsequent events are handled in new (fresh) thread and everything appears to work.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     1
"
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     2
jv:libgdbs - GNU Debugger Interface Library
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     3
Copyright (C) 2015-now Jan Vrany
219
Jan Vrany <jan.vrany@labware.com>
parents: 218
diff changeset
     4
Copyright (C) 2021 LabWare
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     5
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     6
This library is free software; you can redistribute it and/or
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     7
modify it under the terms of the GNU Lesser General Public
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     8
License as published by the Free Software Foundation; either
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     9
version 2.1 of the License. 
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    10
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    11
This library is distributed in the hope that it will be useful,
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    12
but WITHOUT ANY WARRANTY; without even the implied warranty of
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    14
Lesser General Public License for more details.
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    15
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    16
You should have received a copy of the GNU Lesser General Public
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    17
License along with this library; if not, write to the Free Software
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    18
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    19
"
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    20
"{ Package: 'jv:libgdbs' }"
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    21
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    22
"{ NameSpace: Smalltalk }"
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    23
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    24
Object subclass:#GDBEventDispatcher
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
    25
	instanceVariableNames:'debugger queue lock thread announcer1 announcer2'
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    26
	classVariableNames:''
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    27
	poolDictionaries:'GDBDebugFlags'
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    28
	category:'GDB-Private'
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    29
!
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    30
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    31
!GDBEventDispatcher class methodsFor:'documentation'!
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    32
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    33
copyright
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    34
"
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    35
jv:libgdbs - GNU Debugger Interface Library
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    36
Copyright (C) 2015-now Jan Vrany
219
Jan Vrany <jan.vrany@labware.com>
parents: 218
diff changeset
    37
Copyright (C) 2021 LabWare
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    38
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    39
This library is free software; you can redistribute it and/or
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    40
modify it under the terms of the GNU Lesser General Public
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    41
License as published by the Free Software Foundation; either
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    42
version 2.1 of the License. 
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    43
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    44
This library is distributed in the hope that it will be useful,
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    45
but WITHOUT ANY WARRANTY; without even the implied warranty of
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    46
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    47
Lesser General Public License for more details.
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    48
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    49
You should have received a copy of the GNU Lesser General Public
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    50
License along with this library; if not, write to the Free Software
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    51
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    52
"
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    53
! !
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    54
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    55
!GDBEventDispatcher class methodsFor:'instance creation'!
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    56
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    57
new
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    58
    "return an initialized instance"
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    59
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    60
    ^ self basicNew initialize.
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    61
! !
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    62
219
Jan Vrany <jan.vrany@labware.com>
parents: 218
diff changeset
    63
!GDBEventDispatcher methodsFor:'accessing'!
Jan Vrany <jan.vrany@labware.com>
parents: 218
diff changeset
    64
Jan Vrany <jan.vrany@labware.com>
parents: 218
diff changeset
    65
process
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
    66
    ^ thread
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
    67
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
    68
    "Modified: / 26-03-2021 / 13:43:40 / Jan Vrany <jan.vrany@labware.com>"
219
Jan Vrany <jan.vrany@labware.com>
parents: 218
diff changeset
    69
! !
Jan Vrany <jan.vrany@labware.com>
parents: 218
diff changeset
    70
226
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
    71
!GDBEventDispatcher methodsFor:'adding'!
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
    72
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
    73
pushEvent: aGDBEvent
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
    74
    lock critical:[
230
ba4b57758e92 Change `#pushEvent:` to insert event into the current event set
Jan Vrany <jan.vrany@labware.com>
parents: 228
diff changeset
    75
        | index |
ba4b57758e92 Change `#pushEvent:` to insert event into the current event set
Jan Vrany <jan.vrany@labware.com>
parents: 228
diff changeset
    76
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
    77
        Logger 
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
    78
            log:('event loop: pushing %1 (%2)' bindWith:aGDBEvent class name
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
    79
                    with:aGDBEvent token)
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
    80
            severity:#trace
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
    81
            facility:'GDB'
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
    82
            originator:self
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
    83
            attachment:aGDBEvent.
230
ba4b57758e92 Change `#pushEvent:` to insert event into the current event set
Jan Vrany <jan.vrany@labware.com>
parents: 228
diff changeset
    84
ba4b57758e92 Change `#pushEvent:` to insert event into the current event set
Jan Vrany <jan.vrany@labware.com>
parents: 228
diff changeset
    85
        "/ Sometimes, events are pushed back onto a queue as part of processing
ba4b57758e92 Change `#pushEvent:` to insert event into the current event set
Jan Vrany <jan.vrany@labware.com>
parents: 228
diff changeset
    86
        "/ command post-execute hook (this is mainly unify internal housekeeping
ba4b57758e92 Change `#pushEvent:` to insert event into the current event set
Jan Vrany <jan.vrany@labware.com>
parents: 228
diff changeset
    87
        "/ since GDB does not generate various events when state change is caused by
ba4b57758e92 Change `#pushEvent:` to insert event into the current event set
Jan Vrany <jan.vrany@labware.com>
parents: 228
diff changeset
    88
        "/ an MI command, see [1]).
ba4b57758e92 Change `#pushEvent:` to insert event into the current event set
Jan Vrany <jan.vrany@labware.com>
parents: 228
diff changeset
    89
        "/ 
ba4b57758e92 Change `#pushEvent:` to insert event into the current event set
Jan Vrany <jan.vrany@labware.com>
parents: 228
diff changeset
    90
        "/ In this case we want these artifical events to be processed within current
ba4b57758e92 Change `#pushEvent:` to insert event into the current event set
Jan Vrany <jan.vrany@labware.com>
parents: 228
diff changeset
    91
        "/ event set so internal data are in sync when `#send: ... andWait: true` returns.
ba4b57758e92 Change `#pushEvent:` to insert event into the current event set
Jan Vrany <jan.vrany@labware.com>
parents: 228
diff changeset
    92
        "/ 
ba4b57758e92 Change `#pushEvent:` to insert event into the current event set
Jan Vrany <jan.vrany@labware.com>
parents: 228
diff changeset
    93
        "/ [1]: https://sourceware.org/pipermail/gdb/2019-June/047938.html
ba4b57758e92 Change `#pushEvent:` to insert event into the current event set
Jan Vrany <jan.vrany@labware.com>
parents: 228
diff changeset
    94
        index := queue findFirst:[ :ev | ev isEventSetProcessingFinishedEvent ] ifNone: [queue size + 1].
ba4b57758e92 Change `#pushEvent:` to insert event into the current event set
Jan Vrany <jan.vrany@labware.com>
parents: 228
diff changeset
    95
        queue add: aGDBEvent beforeIndex: index.
226
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
    96
    ].
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
    97
    self start
226
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
    98
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
    99
    "Created: / 02-06-2014 / 22:49:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   100
    "Modified: / 02-10-2018 / 14:30:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
230
ba4b57758e92 Change `#pushEvent:` to insert event into the current event set
Jan Vrany <jan.vrany@labware.com>
parents: 228
diff changeset
   101
    "Modified (comment): / 22-05-2021 / 16:49:54 / Jan Vrany <jan.vrany@labware.com>"
226
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   102
!
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   103
226
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   104
pushEventSet: aGDBEventSet
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   105
    lock critical:[
235
51f916ee4111 Renamed `GDBEventSet` to `GDBEventSequence`
Jan Vrany <jan.vrany@labware.com>
parents: 230
diff changeset
   106
        queue add: (GDBEventSequenceProcessingStarted new setEventSet: aGDBEventSet).  
226
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   107
        queue addAll: aGDBEventSet.
235
51f916ee4111 Renamed `GDBEventSet` to `GDBEventSequence`
Jan Vrany <jan.vrany@labware.com>
parents: 230
diff changeset
   108
        queue add: (GDBEventSequenceProcessingFinished new setEventSet: aGDBEventSet).
226
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   109
    ].
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   110
    self start.
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   111
226
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   112
    "Created: / 02-06-2014 / 22:42:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   113
    "Modified: / 02-10-2018 / 14:30:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
235
51f916ee4111 Renamed `GDBEventSet` to `GDBEventSequence`
Jan Vrany <jan.vrany@labware.com>
parents: 230
diff changeset
   114
    "Modified: / 06-09-2021 / 15:01:58 / Jan Vrany <jan.vrany@labware.com>"
226
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   115
! !
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   116
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   117
!GDBEventDispatcher methodsFor:'initialization'!
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   118
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   119
initialize
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   120
    "Invoked when a new instance is created."
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   121
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   122
    super initialize.
226
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   123
    queue := OrderedCollection new.
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   124
    lock := RecursionLock new.
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   125
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   126
    "Modified: / 02-10-2018 / 14:13:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
226
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   127
    "Modified: / 17-03-2021 / 12:40:41 / Jan Vrany <jan.vrany@labware.com>"
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   128
!
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   129
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   130
setAnnouncer1: anAnnouncer
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   131
    announcer1 := anAnnouncer
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   132
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   133
    "Created: / 02-10-2018 / 14:21:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   134
!
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   135
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   136
setAnnouncer2: anAnnouncer
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   137
    announcer2 := anAnnouncer
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   138
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   139
    "Created: / 02-10-2018 / 14:21:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   140
!
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   141
221
e7a1196c0c41 Make `GDBEvent` to hold on `GDBDebugger` that 'generated" that event
Jan Vrany <jan.vrany@labware.com>
parents: 219
diff changeset
   142
setDebugger: aGDBDebugger
e7a1196c0c41 Make `GDBEvent` to hold on `GDBDebugger` that 'generated" that event
Jan Vrany <jan.vrany@labware.com>
parents: 219
diff changeset
   143
    debugger := aGDBDebugger
e7a1196c0c41 Make `GDBEvent` to hold on `GDBDebugger` that 'generated" that event
Jan Vrany <jan.vrany@labware.com>
parents: 219
diff changeset
   144
e7a1196c0c41 Make `GDBEvent` to hold on `GDBDebugger` that 'generated" that event
Jan Vrany <jan.vrany@labware.com>
parents: 219
diff changeset
   145
    "Created: / 09-03-2021 / 21:02:59 / Jan Vrany <jan.vrany@labware.com>"
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   146
! !
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   147
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   148
!GDBEventDispatcher methodsFor:'private'!
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   149
221
e7a1196c0c41 Make `GDBEvent` to hold on `GDBDebugger` that 'generated" that event
Jan Vrany <jan.vrany@labware.com>
parents: 219
diff changeset
   150
dispatchEvent:aGDBEvent
e7a1196c0c41 Make `GDBEvent` to hold on `GDBDebugger` that 'generated" that event
Jan Vrany <jan.vrany@labware.com>
parents: 219
diff changeset
   151
    aGDBEvent debugger: debugger.
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   152
    TraceEvents ifTrue:[
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   153
        Logger 
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   154
            log:('event loop: broadcasting %1 (%2)' bindWith:aGDBEvent class name
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   155
                    with:aGDBEvent token)
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   156
            severity:#trace
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   157
            facility:'GDB'
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   158
            originator:self
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   159
            attachment:aGDBEvent
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   160
    ].
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   161
    announcer1 notNil ifTrue:[
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   162
        announcer1 announce:aGDBEvent.
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   163
    ].
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   164
    announcer2 notNil ifTrue:[
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   165
        announcer2 announce:aGDBEvent
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   166
    ].
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   167
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   168
    "Created: / 02-06-2014 / 22:58:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   169
    "Modified: / 02-10-2018 / 14:36:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
221
e7a1196c0c41 Make `GDBEvent` to hold on `GDBDebugger` that 'generated" that event
Jan Vrany <jan.vrany@labware.com>
parents: 219
diff changeset
   170
    "Modified: / 09-03-2021 / 21:03:21 / Jan Vrany <jan.vrany@labware.com>"
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   171
!
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   172
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   173
dispatchEvents
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   174
    "Dispatch all events the queue."
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   175
243
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   176
    | currentQueue currentEvent |
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   177
243
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   178
    currentQueue := queue.
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   179
    [
243
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   180
        currentEvent := nil.
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   181
        lock critical:[
243
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   182
            currentQueue notEmpty ifTrue:[currentEvent := currentQueue removeFirst]
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   183
        ].
243
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   184
        currentEvent notNil ifTrue:[
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   185
            currentEvent dispatchUsing: self
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   186
        ].
243
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   187
        currentEvent notNil.
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   188
    ] whileTrue.
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   189
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   190
    "Created: / 26-03-2021 / 21:10:49 / Jan Vrany <jan.vrany@labware.com>"
243
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   191
    "Modified: / 27-03-2021 / 08:19:04 / Jan Vrany <jan.vrany@labware.com>"
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   192
    "Modified: / 28-06-2021 / 12:07:26 / Jan Vrany <jan.vrany@labware.com>"
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   193
! !
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   194
226
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   195
!GDBEventDispatcher methodsFor:'queries'!
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   196
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   197
hasPendingEvents
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   198
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   199
    "/ Note that there's no obligation for this information to
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   200
    "/ be 100% accurate, so no need for symchronization here.
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   201
    ^ queue notEmpty. 
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   202
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   203
    "Created: / 17-03-2021 / 12:36:16 / Jan Vrany <jan.vrany@labware.com>"
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   204
!
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   205
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   206
hasPendingEventsMatching: aBlock
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   207
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   208
    | anyCommandEventPending |
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   209
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   210
    "/ Here, synchronization is required since we iterate over
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   211
    "/ collection...
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   212
    lock critical:[
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   213
        anyCommandEventPending := queue anySatisfy: aBlock
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   214
    ].
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   215
    ^ anyCommandEventPending
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   216
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   217
    "Created: / 17-03-2021 / 12:37:58 / Jan Vrany <jan.vrany@labware.com>"
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   218
! !
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   219
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   220
!GDBEventDispatcher methodsFor:'start & stop'!
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   221
243
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   222
restart
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   223
    "'Restarts' the event dispatch loop if it is running, forcing
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   224
     remaining events (if any) to be processes in a new thread.
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   225
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   226
     This is done by moving all events from current queue object
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   227
     into a new one and then swapping then. This works, because
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   228
     #dispatchEvents do not read queue instvar directly."
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   229
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   230
    lock critical: [ 
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   231
        | new |
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   232
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   233
        new := queue copy.
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   234
        queue removeAll.
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   235
        queue := new.
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   236
    ].
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   237
    thread := nil.
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   238
    self start.
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   239
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   240
    "Created: / 27-03-2021 / 08:26:50 / Jan Vrany <jan.vrany@labware.com>"
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   241
    "Modified: / 28-03-2021 / 22:10:29 / Jan Vrany <jan.vrany@labware.com>"
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   242
!
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   243
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   244
start
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   245
    | t |
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   246
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   247
    self assert: queue notNil.
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   248
    self assert: lock notNil.
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   249
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   250
     ((t := thread) isNil or:[t isDead]) ifTrue:[
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   251
        thread := [
243
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   252
                [
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   253
                    self dispatchEvents.
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   254
                ] ensure: [ 
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   255
                    Processor activeProcess == thread ifTrue: [ 
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   256
                        thread := nil.
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   257
                    ].
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   258
                ].
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   259
            ] newProcess.
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   260
        thread name:('GDB Event dispatcher').
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   261
        "/thread priority:Processor userBackgroundPriority.
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   262
        thread resume.
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   263
    ].
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   264
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   265
    "Created: / 02-10-2018 / 14:25:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   266
    "Modified (format): / 02-10-2018 / 16:34:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
243
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   267
    "Modified: / 28-03-2021 / 22:05:46 / Jan Vrany <jan.vrany@labware.com>"
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   268
!
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   269
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   270
wait
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   271
    "Wait until all events are processed"
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   272
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   273
    | t |
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   274
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   275
    (t := thread) isNil ifTrue:[^self].
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   276
    thread := nil.
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   277
    t isDead ifTrue: [ ^ self ].
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   278
    t priority:(Processor userSchedulingPriority + 1).
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   279
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   280
    "Created: / 02-10-2018 / 14:25:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   281
    "Modified: / 26-03-2021 / 14:17:11 / Jan Vrany <jan.vrany@labware.com>"
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   282
    "Modified (comment): / 26-03-2021 / 21:01:30 / Jan Vrany <jan.vrany@labware.com>"
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   283
! !
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   284
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   285
!GDBEventDispatcher class methodsFor:'documentation'!
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   286
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   287
version_HG
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   288
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   289
    ^ '$Changeset: <not expanded> $'
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   290
! !
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   291