���'From Squeak6.1alpha of 26 March 2024 [latest update: #23006] on 28 March 2024 at 2:33:36 pm'! Link subclass: #Process instanceVariableNames: 'suspendedContext priority myList threadAffinity effectiveProcess name island env ' classVariableNames: 'AllProcessesLock AllProcesses ' poolDictionaries: '' category: 'Kernel-Processes'! Model subclass: #ProcessBrowser instanceVariableNames: 'selectedProcess selectedContext methodText processList processListIndex stackList stackListIndex stackDepth sourceMap selectedClass selectedSelector searchString autoUpdateProcess lastUpdate startedCPUWatcher ' classVariableNames: 'Browsers SuspendedProcesses WellKnownProcesses ' poolDictionaries: '' category: 'Tools-Process Browser'! !Process class methodsFor: 'class initialization' stamp: 'mt 3/28/2024 13:12'! initialize AllProcesses := WeakSet new. AllProcessesLock := Mutex new. AllProcessesLock critical: [ Process allSubInstancesDo: [:p | AllProcesses add: p]].! ! !Process class methodsFor: 'utilities' stamp: 'mt 3/28/2024 14:26'! allProcesses ^ AllProcesses asArray copyWithout: nil! ! !Process class methodsFor: 'instance creation' stamp: 'mt 3/28/2024 14:32'! new "Keep track of the processes being created and alive to avoid the need for #allSubInstances in tools such as the ProcessBrowser." | newProcess | newProcess := super new. AllProcessesLock critical: [AllProcesses add: newProcess]. ^ newProcess " [ [] newProcess terminate ] bench. AFTER: '140,000 per second. 7.13 microseconds per run. 35.02 % GC time.' BEFORE: '224,000 per second. 4.47 microseconds per run. 4.38 % GC time.' [aProcessBrowser updateProcessList] bench. -- allow quick updates AFTER: '4,410 per second. 227 microseconds per run. 77.34453 % GC time.' BEFORE: '118 per second. 8.47 milliseconds per run. 2.59792 % GC time.' "! ! !ProcessBrowser methodsFor: 'initialize-release' stamp: 'mt 3/28/2024 13:31'! initialize methodText := ''.. stackDepth := 20. stackListIndex := 0. searchString := ''. startedCPUWatcher := CPUWatcher cpuWatcherEnabled and: [ self startCPUWatcher ]. self updateProcessList; processListIndex: 1. Browsers add: self! ! !ProcessBrowser methodsFor: 'process list' stamp: 'mt 3/28/2024 14:32'! updateProcessList | oldSelectedProcess newIndex | oldSelectedProcess := selectedProcess. processList := selectedProcess := selectedSelector := nil. Smalltalk garbageCollectMost. "lose defunct processes" processList := Process allProcesses reject: [:each | each isTerminated]. processList := processList sorted: [:a :b | a priority >= b priority]. processList := WeakArray withAll: processList. newIndex := processList indexOf: oldSelectedProcess. self changed: #processNameList. self processListIndex: newIndex! ! Model subclass: #ProcessBrowser instanceVariableNames: 'selectedProcess selectedContext methodText processList processListIndex stackList stackListIndex stackDepth sourceMap selectedClass selectedSelector searchString autoUpdateProcess startedCPUWatcher' classVariableNames: 'Browsers SuspendedProcesses WellKnownProcesses' poolDictionaries: '' category: 'Tools-Process Browser'! Process class removeSelector: #allProcessesSorted! Process initialize! Link subclass: #Process instanceVariableNames: 'suspendedContext priority myList threadAffinity effectiveProcess name island env' classVariableNames: 'AllProcesses AllProcessesLock' poolDictionaries: '' category: 'Kernel-Processes'! Process initialize.!