ports/pharo/src/LibGDBs-Internal-Portlib-Pharo/GDBPortlibPharo.class.st
author Jan Vrany <jan.vrany@labware.com>
Thu, 31 Aug 2023 13:19:50 +0100
changeset 312 7b90c01d76e2
parent 302 fdfe1a981363
child 320 b52930e757e4
permissions -rw-r--r--
Pharo port: correctly clear `#cli` property ...when CLI window is closed. This allows one to close CLI window and open it again.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
297
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
     1
Class {
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
     2
	#name : #GDBPortlibPharo,
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
     3
	#superclass : #GDBPortlib,
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
     4
	#category : #'LibGDBs-Internal-Portlib-Pharo'
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
     5
}
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
     6
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
     7
{ #category : #initialization }
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
     8
GDBPortlibPharo class >> initialize [
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
     9
	Current := self basicNew initialize.
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    10
	
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    11
	"
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    12
	GDBPortlib current
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    13
	"
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    14
]
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    15
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    16
{ #category : #'user interface' }
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    17
GDBPortlibPharo >> newCLI: aGDBDebugger [
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    18
	"Open GDB CLI for interactive debugging for given debugger.
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    19
	 See `GDBDebugger >> #cli`."
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    20
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    21
	| win |
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    22
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    23
	(Smalltalk includesKey: #TerminalEmulator) ifFalse: [ 
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    24
		self error: 'PTerm not available - you may want to load PTerm from https://github.com/janvrany/PTerm'
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    25
		
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    26
	].
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    27
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    28
	win := aGDBDebugger propertyAt: #cli.
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    29
	win isNil ifTrue: [
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    30
		aGDBDebugger consoleOutput isNil ifTrue:[
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    31
			self error: 'This GDBDebugger does not have CLI channel open - you may want to use GDBUnixProcess.'
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    32
		].
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    33
		win := TerminalEmulator openPTY: aGDBDebugger consoleOutput fileDescriptor.
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    34
		win setLabel: 'GDB CLI'.
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    35
		
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    36
		"When window is closed, forget it (so subsequent call to 
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    37
		`GDBDebugger >> #cli` opens a new CLI window):"
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    38
		win announcer when: WindowClosed do: [ :windowClosed | 
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    39
			windowClosed window == win ifTrue:[ 
312
7b90c01d76e2 Pharo port: correctly clear `#cli` property
Jan Vrany <jan.vrany@labware.com>
parents: 302
diff changeset
    40
				aGDBDebugger propertyAt: #cli put: nil.		
297
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    41
			]
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    42
		].
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    43
		
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    44
		"When GDB terminates, close the CLI."
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    45
		aGDBDebugger announcer when: GDBExitEvent do:[ :exit |
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    46
			| winFromDebugger |
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    47
			
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    48
			winFromDebugger := aGDBDebugger propertyAt: #cli.
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    49
			winFromDebugger notNil ifTrue:[
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    50
				winFromDebugger close.
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    51
			].
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    52
		].
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    53
	
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    54
		"Finally, store the reference to CLI window into debugger
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    55
		 so we can fetch it later..."		
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    56
		aGDBDebugger propertyAt: #cli put: win.		
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    57
	] ifFalse: [ 
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    58
		win activate.
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    59
	].
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    60
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    61
	"Created: / 05-08-2023 / 07:38:23 / Jan Vrany <jan.vrany@labware.com>"
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    62
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    63
]
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    64
302
fdfe1a981363 Compatibility: allow ports to customize semaphore / mutex creation
Jan Vrany <jan.vrany@labware.com>
parents: 297
diff changeset
    65
{ #category : #synchronization }
fdfe1a981363 Compatibility: allow ports to customize semaphore / mutex creation
Jan Vrany <jan.vrany@labware.com>
parents: 297
diff changeset
    66
GDBPortlibPharo >> newMutex [
fdfe1a981363 Compatibility: allow ports to customize semaphore / mutex creation
Jan Vrany <jan.vrany@labware.com>
parents: 297
diff changeset
    67
	^ Mutex new
fdfe1a981363 Compatibility: allow ports to customize semaphore / mutex creation
Jan Vrany <jan.vrany@labware.com>
parents: 297
diff changeset
    68
fdfe1a981363 Compatibility: allow ports to customize semaphore / mutex creation
Jan Vrany <jan.vrany@labware.com>
parents: 297
diff changeset
    69
	"Created: / 18-08-2023 / 14:17:36 / Jan Vrany <jan.vrany@labware.com>"
fdfe1a981363 Compatibility: allow ports to customize semaphore / mutex creation
Jan Vrany <jan.vrany@labware.com>
parents: 297
diff changeset
    70
fdfe1a981363 Compatibility: allow ports to customize semaphore / mutex creation
Jan Vrany <jan.vrany@labware.com>
parents: 297
diff changeset
    71
]
fdfe1a981363 Compatibility: allow ports to customize semaphore / mutex creation
Jan Vrany <jan.vrany@labware.com>
parents: 297
diff changeset
    72
297
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    73
{ #category : #streams }
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    74
GDBPortlibPharo >> newPTY [
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    75
	"Allocate a PTY and return it as an instance of GDBPTY"
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    76
	
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    77
	| fdM fdS name streamM streamS |
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    78
	
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    79
	fdM := LibC posix_openpt: (2"O_RDWR" | 0400"O_NOCTTY" | 04000"O_NONBLOCK").
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    80
	fdM < 0 ifTrue:[ 
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    81
		self error: 'posix_openpt() failed'.
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    82
		^ nil		
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    83
	].
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    84
	LibC grantpt: fdM.
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    85
	LibC unlockpt: fdM.
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    86
	name := LibC ptsname: fdM.
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    87
	name isNil ifTrue:[
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    88
		LibC close: fdM.
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    89
		self error: 'ptsname() failed'.
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    90
		^ nil
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    91
	].
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    92
	fdS := LibC open: name _: 2"O_RDWR".
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    93
	fdS < 0 ifTrue:[
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    94
		LibC close: fdM.
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    95
		self error: 'Failed to open ', name.
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    96
		^ nil.
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    97
	].
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    98
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    99
	streamM := BinaryPipeStream basicNew descriptor: fdM writable: true.
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   100
	streamS := BinaryPipeStream basicNew descriptor: fdS writable: true.
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   101
	
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   102
	^ GDBPTY name: name 
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   103
			masterReadStream: (ZnCharacterReadStream  on: streamM encoding: 'ascii')
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   104
			masterWriteStream: (ZnCharacterWriteStream  on: streamM encoding: 'ascii')
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   105
			slaveReadStream: (ZnCharacterReadStream  on: streamS encoding: 'ascii')
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   106
			slaveWriteStream: (ZnCharacterWriteStream  on: streamS encoding: 'ascii')
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   107
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   108
]
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   109
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   110
{ #category : #streams }
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   111
GDBPortlibPharo >> newPipe [
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   112
	"Create a pipe and return an array with pipe's read end and write end
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   113
	 (in this order) as smalltalk streams."
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   114
	
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   115
	| pipe |
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   116
	
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   117
	pipe := BinaryPipeStream create.
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   118
	^ { ZnCharacterReadStream  on: pipe first  encoding: 'ascii' .
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   119
	    ZnCharacterWriteStream on: pipe second encoding: 'ascii' }
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   120
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   121
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   122
]
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   123
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   124
{ #category : #processes }
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   125
GDBPortlibPharo >> spawn: argv stdin: stdin stdout: stdout stderr: stderr exit: action [ 
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   126
	^ Smalltalk os spawn: argv stdin: stdin stdout: stdout stderr: stderr exit: action 
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   127
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   128
	
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   129
	
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   130
	
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   131
590dadb8382f Add Pharo version of `GDBPortlib`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
   132
]