GDBEventDispatcher.st
author Jan Vrany <jan.vrany@labware.com>
Thu, 07 Dec 2023 12:33:31 +0000
changeset 322 1b26d0a9560c
parent 309 f2481d09d58e
permissions -rw-r--r--
Emit and handle (custom) `-register-changed` notification This commit adds new (custom) asynchronous notification about register value being changed. Standard GDB does not notify MI clients about register value being changed when debugging (for example, by CLI command `set $rax = 1` or via Python's `Value.assign()`). This caused libgdb's register value cache being out of sync. In the past, this was partially worked around by manually emiting the notification on `GDBRegisterWithValue` APIs, but this did not (and could not) handle the case register was changed from GDB command line. To solve this problem, this commit installs a custom Python event handler that emits new GDB/MI notification - `-register-changed` - whenever a register changes after debugee is stopped. This has been enabled by upstream GDB commit 4825fd "gdb/python: implement support for sending custom MI async notifications" On libgdbs side, complete inferior state is invalidated. In theory, one could carefully invalidate only the changed `GDBRegisterWithValue` but in certain cases this could also change the backtrace (for example, if one updates stack pointer) or position in code. So it seems safer to just invalidate everything.
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
272
cdd1c9ad00de Change class categories to facilitate Pharo port
Jan Vrany <jan.vrany@labware.com>
parents: 259
diff changeset
     4
Copyright (C) 2021-2023 LabWare
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     5
259
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
     6
Permission is hereby granted, free of charge, to any person obtaining a copy
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
     7
of this software and associated documentation files (the 'Software'), to deal
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
     8
in the Software without restriction, including without limitation the rights
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
     9
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    10
copies of the Software, and to permit persons to whom the Software is
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    11
furnished to do so, subject to the following conditions:
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    12
259
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    13
The above copyright notice and this permission notice shall be included in all
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    14
copies or substantial portions of the Software.
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    15
259
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    16
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    17
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    18
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    19
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    20
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    21
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    22
SOFTWARE.
218
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
"{ Package: 'jv:libgdbs' }"
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    25
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    26
"{ NameSpace: Smalltalk }"
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    27
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    28
Object subclass:#GDBEventDispatcher
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
    29
	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
    30
	classVariableNames:''
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    31
	poolDictionaries:'GDBDebugFlags'
272
cdd1c9ad00de Change class categories to facilitate Pharo port
Jan Vrany <jan.vrany@labware.com>
parents: 259
diff changeset
    32
	category:'GDB-Internal'
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    33
!
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
!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
    36
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    37
copyright
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
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
    40
Copyright (C) 2015-now Jan Vrany
272
cdd1c9ad00de Change class categories to facilitate Pharo port
Jan Vrany <jan.vrany@labware.com>
parents: 259
diff changeset
    41
Copyright (C) 2021-2023 LabWare
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    42
259
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    43
Permission is hereby granted, free of charge, to any person obtaining a copy
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    44
of this software and associated documentation files (the 'Software'), to deal
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    45
in the Software without restriction, including without limitation the rights
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    46
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    47
copies of the Software, and to permit persons to whom the Software is
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    48
furnished to do so, subject to the following conditions:
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    49
259
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    50
The above copyright notice and this permission notice shall be included in all
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    51
copies or substantial portions of the Software.
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    52
259
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    53
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    54
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    55
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    56
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    57
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    58
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 256
diff changeset
    59
SOFTWARE.
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    60
"
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
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    63
!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
    64
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    65
new
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    66
    "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
    67
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    68
    ^ self basicNew initialize.
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    69
! !
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    70
219
Jan Vrany <jan.vrany@labware.com>
parents: 218
diff changeset
    71
!GDBEventDispatcher methodsFor:'accessing'!
Jan Vrany <jan.vrany@labware.com>
parents: 218
diff changeset
    72
Jan Vrany <jan.vrany@labware.com>
parents: 218
diff changeset
    73
process
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
    74
    ^ thread
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
    75
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
    76
    "Modified: / 26-03-2021 / 13:43:40 / Jan Vrany <jan.vrany@labware.com>"
219
Jan Vrany <jan.vrany@labware.com>
parents: 218
diff changeset
    77
! !
Jan Vrany <jan.vrany@labware.com>
parents: 218
diff changeset
    78
226
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
    79
!GDBEventDispatcher methodsFor:'adding'!
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
    80
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
    81
pushEvent: aGDBEvent
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
    82
    lock critical:[
230
ba4b57758e92 Change `#pushEvent:` to insert event into the current event set
Jan Vrany <jan.vrany@labware.com>
parents: 228
diff changeset
    83
        | index |
ba4b57758e92 Change `#pushEvent:` to insert event into the current event set
Jan Vrany <jan.vrany@labware.com>
parents: 228
diff changeset
    84
287
2fe803e57253 Compatibility: do not use `#findFirst:ifNone:`
Jan Vrany <jan.vrany@labware.com>
parents: 272
diff changeset
    85
        TraceEvents ifTrue: [
2fe803e57253 Compatibility: do not use `#findFirst:ifNone:`
Jan Vrany <jan.vrany@labware.com>
parents: 272
diff changeset
    86
            Logger trace:'event loop: pushing %1' with: aGDBEvent 
2fe803e57253 Compatibility: do not use `#findFirst:ifNone:`
Jan Vrany <jan.vrany@labware.com>
parents: 272
diff changeset
    87
        ].
230
ba4b57758e92 Change `#pushEvent:` to insert event into the current event set
Jan Vrany <jan.vrany@labware.com>
parents: 228
diff changeset
    88
ba4b57758e92 Change `#pushEvent:` to insert event into the current event set
Jan Vrany <jan.vrany@labware.com>
parents: 228
diff changeset
    89
        "/ 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
    90
        "/ 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
    91
        "/ 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
    92
        "/ 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
    93
        "/ 
ba4b57758e92 Change `#pushEvent:` to insert event into the current event set
Jan Vrany <jan.vrany@labware.com>
parents: 228
diff changeset
    94
        "/ 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
    95
        "/ 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
    96
        "/ 
ba4b57758e92 Change `#pushEvent:` to insert event into the current event set
Jan Vrany <jan.vrany@labware.com>
parents: 228
diff changeset
    97
        "/ [1]: https://sourceware.org/pipermail/gdb/2019-June/047938.html
287
2fe803e57253 Compatibility: do not use `#findFirst:ifNone:`
Jan Vrany <jan.vrany@labware.com>
parents: 272
diff changeset
    98
        index := 1.
2fe803e57253 Compatibility: do not use `#findFirst:ifNone:`
Jan Vrany <jan.vrany@labware.com>
parents: 272
diff changeset
    99
        [ index <= queue size and:[(queue at: index) isEventSetProcessingFinishedEvent not] ] whileTrue: [ 
2fe803e57253 Compatibility: do not use `#findFirst:ifNone:`
Jan Vrany <jan.vrany@labware.com>
parents: 272
diff changeset
   100
            index := index + 1.
2fe803e57253 Compatibility: do not use `#findFirst:ifNone:`
Jan Vrany <jan.vrany@labware.com>
parents: 272
diff changeset
   101
        ].
230
ba4b57758e92 Change `#pushEvent:` to insert event into the current event set
Jan Vrany <jan.vrany@labware.com>
parents: 228
diff changeset
   102
        queue add: aGDBEvent beforeIndex: index.
226
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   103
    ].
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   104
    self start
226
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   105
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   106
    "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
   107
    "Modified: / 02-10-2018 / 14:30:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
287
2fe803e57253 Compatibility: do not use `#findFirst:ifNone:`
Jan Vrany <jan.vrany@labware.com>
parents: 272
diff changeset
   108
    "Modified: / 14-07-2023 / 14:29:22 / Jan Vrany <jan.vrany@labware.com>"
226
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   109
!
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   110
226
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   111
pushEventSet: aGDBEventSet
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   112
    lock critical:[
235
51f916ee4111 Renamed `GDBEventSet` to `GDBEventSequence`
Jan Vrany <jan.vrany@labware.com>
parents: 230
diff changeset
   113
        queue add: (GDBEventSequenceProcessingStarted new setEventSet: aGDBEventSet).  
226
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   114
        queue addAll: aGDBEventSet.
235
51f916ee4111 Renamed `GDBEventSet` to `GDBEventSequence`
Jan Vrany <jan.vrany@labware.com>
parents: 230
diff changeset
   115
        queue add: (GDBEventSequenceProcessingFinished new setEventSet: aGDBEventSet).
226
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   116
    ].
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   117
    self start.
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   118
226
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   119
    "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
   120
    "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
   121
    "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
   122
! !
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   123
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   124
!GDBEventDispatcher methodsFor:'initialization'!
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
initialize
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   127
    "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
   128
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   129
    super initialize.
226
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   130
    queue := OrderedCollection new.
309
f2481d09d58e Compatibility: fix mutex creation
Jan Vrany <jan.vrany@labware.com>
parents: 287
diff changeset
   131
    lock := GDBPortlib current newMutex.
218
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
    "Modified: / 02-10-2018 / 14:13:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
309
f2481d09d58e Compatibility: fix mutex creation
Jan Vrany <jan.vrany@labware.com>
parents: 287
diff changeset
   134
    "Modified: / 25-08-2023 / 15:51:36 / 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
   135
!
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   136
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   137
setAnnouncer1: anAnnouncer
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   138
    announcer1 := anAnnouncer
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   139
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   140
    "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
   141
!
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   142
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   143
setAnnouncer2: anAnnouncer
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   144
    announcer2 := anAnnouncer
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   145
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   146
    "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
   147
!
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   148
221
e7a1196c0c41 Make `GDBEvent` to hold on `GDBDebugger` that 'generated" that event
Jan Vrany <jan.vrany@labware.com>
parents: 219
diff changeset
   149
setDebugger: aGDBDebugger
e7a1196c0c41 Make `GDBEvent` to hold on `GDBDebugger` that 'generated" that event
Jan Vrany <jan.vrany@labware.com>
parents: 219
diff changeset
   150
    debugger := aGDBDebugger
e7a1196c0c41 Make `GDBEvent` to hold on `GDBDebugger` that 'generated" that event
Jan Vrany <jan.vrany@labware.com>
parents: 219
diff changeset
   151
e7a1196c0c41 Make `GDBEvent` to hold on `GDBDebugger` that 'generated" that event
Jan Vrany <jan.vrany@labware.com>
parents: 219
diff changeset
   152
    "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
   153
! !
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   154
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   155
!GDBEventDispatcher methodsFor:'private'!
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   156
221
e7a1196c0c41 Make `GDBEvent` to hold on `GDBDebugger` that 'generated" that event
Jan Vrany <jan.vrany@labware.com>
parents: 219
diff changeset
   157
dispatchEvent:aGDBEvent
244
f0e4ddb50242 Split event processing and event delivery
Jan Vrany <jan.vrany@labware.com>
parents: 243
diff changeset
   158
    | deliveries |
f0e4ddb50242 Split event processing and event delivery
Jan Vrany <jan.vrany@labware.com>
parents: 243
diff changeset
   159
221
e7a1196c0c41 Make `GDBEvent` to hold on `GDBDebugger` that 'generated" that event
Jan Vrany <jan.vrany@labware.com>
parents: 219
diff changeset
   160
    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
   161
    TraceEvents ifTrue:[
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   162
        Logger 
256
9e2ac3a4f23c Improved `GDBEvent >> #printOn:`
Jan Vrany <jan.vrany@labware.com>
parents: 244
diff changeset
   163
            log:('event loop: broadcasting %1' bindWith:aGDBEvent)
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   164
            severity:#trace
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   165
            facility:'GDB'
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   166
            originator:self
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   167
            attachment:aGDBEvent
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   168
    ].
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   169
    announcer1 notNil ifTrue:[
244
f0e4ddb50242 Split event processing and event delivery
Jan Vrany <jan.vrany@labware.com>
parents: 243
diff changeset
   170
        deliveries isNil ifTrue: [ deliveries := OrderedCollection new ].
f0e4ddb50242 Split event processing and event delivery
Jan Vrany <jan.vrany@labware.com>
parents: 243
diff changeset
   171
        announcer1 subscriptionsFor: aGDBEvent do: [ :subscription|
f0e4ddb50242 Split event processing and event delivery
Jan Vrany <jan.vrany@labware.com>
parents: 243
diff changeset
   172
            deliveries add: (GDBEventDelivery new subscription: subscription event: aGDBEvent)
f0e4ddb50242 Split event processing and event delivery
Jan Vrany <jan.vrany@labware.com>
parents: 243
diff changeset
   173
        ].
f0e4ddb50242 Split event processing and event delivery
Jan Vrany <jan.vrany@labware.com>
parents: 243
diff changeset
   174
        "/ announcer1 announce:aGDBEvent.
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   175
    ].
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   176
    announcer2 notNil ifTrue:[
244
f0e4ddb50242 Split event processing and event delivery
Jan Vrany <jan.vrany@labware.com>
parents: 243
diff changeset
   177
        deliveries isNil ifTrue: [ deliveries := OrderedCollection new ].
f0e4ddb50242 Split event processing and event delivery
Jan Vrany <jan.vrany@labware.com>
parents: 243
diff changeset
   178
        announcer2 subscriptionsFor: aGDBEvent do: [ :subscription|
f0e4ddb50242 Split event processing and event delivery
Jan Vrany <jan.vrany@labware.com>
parents: 243
diff changeset
   179
            deliveries add: (GDBEventDelivery new subscription: subscription event: aGDBEvent)
f0e4ddb50242 Split event processing and event delivery
Jan Vrany <jan.vrany@labware.com>
parents: 243
diff changeset
   180
        ].
f0e4ddb50242 Split event processing and event delivery
Jan Vrany <jan.vrany@labware.com>
parents: 243
diff changeset
   181
        "/ announcer2 announce:aGDBEvent
f0e4ddb50242 Split event processing and event delivery
Jan Vrany <jan.vrany@labware.com>
parents: 243
diff changeset
   182
    ].
f0e4ddb50242 Split event processing and event delivery
Jan Vrany <jan.vrany@labware.com>
parents: 243
diff changeset
   183
    deliveries notEmptyOrNil ifTrue: [ 
f0e4ddb50242 Split event processing and event delivery
Jan Vrany <jan.vrany@labware.com>
parents: 243
diff changeset
   184
        lock critical:[
f0e4ddb50242 Split event processing and event delivery
Jan Vrany <jan.vrany@labware.com>
parents: 243
diff changeset
   185
            deliveries reverseDo: [:delivery | queue addFirst: delivery ]
f0e4ddb50242 Split event processing and event delivery
Jan Vrany <jan.vrany@labware.com>
parents: 243
diff changeset
   186
        ]
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   187
    ].
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   188
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   189
    "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
   190
    "Modified: / 02-10-2018 / 14:36:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
256
9e2ac3a4f23c Improved `GDBEvent >> #printOn:`
Jan Vrany <jan.vrany@labware.com>
parents: 244
diff changeset
   191
    "Modified: / 22-02-2022 / 11:57:30 / Jan Vrany <jan.vrany@labware.com>"
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   192
!
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   193
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   194
dispatchEvents
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   195
    "Dispatch all events the queue."
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   196
243
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   197
    | currentQueue currentEvent |
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   198
243
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   199
    currentQueue := queue.
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   200
    [
243
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   201
        currentEvent := nil.
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   202
        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
   203
            currentQueue notEmpty ifTrue:[currentEvent := currentQueue removeFirst]
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   204
        ].
243
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   205
        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
   206
            currentEvent dispatchUsing: self
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   207
        ].
243
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   208
        currentEvent notNil.
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   209
    ] whileTrue.
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   210
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   211
    "Created: / 26-03-2021 / 21:10:49 / Jan Vrany <jan.vrany@labware.com>"
244
f0e4ddb50242 Split event processing and event delivery
Jan Vrany <jan.vrany@labware.com>
parents: 243
diff changeset
   212
    "Modified: / 29-03-2021 / 12:18:13 / 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
   213
    "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
   214
! !
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   215
226
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   216
!GDBEventDispatcher methodsFor:'queries'!
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   217
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   218
hasPendingEvents
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   219
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   220
    "/ 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
   221
    "/ 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
   222
    ^ queue notEmpty. 
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   223
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   224
    "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
   225
!
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   226
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   227
hasPendingEventsMatching: aBlock
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   228
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   229
    | anyCommandEventPending |
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   230
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   231
    "/ 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
   232
    "/ collection...
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   233
    lock critical:[
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   234
        anyCommandEventPending := queue anySatisfy: aBlock
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   235
    ].
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   236
    ^ anyCommandEventPending
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   237
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   238
    "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
   239
! !
f6c09fa9424e Move event queue into `GDBEventDispatcher` object
Jan Vrany <jan.vrany@labware.com>
parents: 221
diff changeset
   240
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   241
!GDBEventDispatcher methodsFor:'start & stop'!
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   242
243
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   243
restart
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   244
    "'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
   245
     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
   246
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   247
     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
   248
     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
   249
     #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
   250
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   251
    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
   252
        | new |
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   253
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   254
        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
   255
        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
   256
        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
   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
    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
   259
    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
   260
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   261
    "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
   262
    "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
   263
!
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   264
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   265
start
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   266
    | t |
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   267
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   268
    self assert: queue notNil.
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   269
    self assert: lock notNil.
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   270
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   271
     ((t := thread) isNil or:[t isDead]) ifTrue:[
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   272
        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
   273
                [
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   274
                    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
   275
                ] ensure: [ 
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   276
                    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
   277
                        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
   278
                    ].
aaaf3757899b Allow commands to be sent and waited for from event dispatch loop
Jan Vrany <jan.vrany@labware.com>
parents: 235
diff changeset
   279
                ].
228
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   280
            ] newProcess.
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   281
        thread name:('GDB Event dispatcher').
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   282
        "/thread priority:Processor userBackgroundPriority.
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   283
        thread resume.
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   284
    ].
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   285
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   286
    "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
   287
    "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
   288
    "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
   289
!
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   290
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   291
wait
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   292
    "Wait until all events are processed"
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   293
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   294
    | t |
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   295
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   296
    (t := thread) isNil ifTrue:[^self].
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   297
    thread := nil.
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   298
    t isDead ifTrue: [ ^ self ].
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   299
    t priority:(Processor userSchedulingPriority + 1).
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   300
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   301
    "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
   302
    "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
   303
    "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
   304
! !
04ce643219ce Start event loop process on demand
Jan Vrany <jan.vrany@labware.com>
parents: 226
diff changeset
   305
218
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   306
!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
   307
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   308
version_HG
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   309
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   310
    ^ '$Changeset: <not expanded> $'
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   311
! !
42d5a8a5e14e Encapsulate event dispatch loop logic into single object - a `GDBEventDispatcher`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   312