David T. Lewis uploaded a new version of System to project The Treated Inbox: http://source.squeak.org/treated/System-jar.1367.mcz
==================== Summary ====================
Name: System-jar.1367 Author: jar Time: 11 July 2022, 1:21:36.615972 pm UUID: 403676fc-9569-c542-ae88-f17030bb70c5 Ancestors: System-mt.1366
protect LowSpaceWatcher against concurrent invocations
Currently #installLowSpaceWatcher runs unprotected against multiple concurrent invocations; try to run this example in the Workspace:
p1 := [Smalltalk installLowSpaceWatcher] fork. p2 := [Smalltalk installLowSpaceWatcher] fork
Expected behavior is that the LowSpaceWatcher gets reinstalled twice in a row; what's happening now is both invocations will run concurrently, both will block in terminate and then install two LowSpaceWatchers (actually, at the moment there's a little bug in terminate so the concurrent invocations will end up with one process stuck at a semaphore but that's about to be fixed soon)
Alternatively, this could be fixed by running #installLowSpaceWatcher's code as a critical section but that would mean a new class variable which may not be entirely justifiable - but let me know if #critical would be preferable.
=============== Diff against System-mt.1366 ===============
Item was changed: ----- Method: SmalltalkImage>>installLowSpaceWatcher (in category 'memory space') ----- installLowSpaceWatcher "Start a process to watch for low-space conditions." "Smalltalk installLowSpaceWatcher" + + "Run with the highest priority to avoid concurrency issues. + Workspce example: + p1 := [Smalltalk installLowSpaceWatcher] fork. + p2 := [Smalltalk installLowSpaceWatcher] fork + Here both proceses are scheduled in the run queue, then p1 wakes up, starts the LowSpaceProcess + termination and waits on a semaphore until the termination is finished. Before the LowSpaceProcess + can proceed, process p2 wakes up and starts the LowSpaceProcess termination just like p1 and waits + on a semaphore until the termination is finished. Finally the LowSpaceProcess wakes up, unwinds, + unblocks p1 a p2 and terminates. p1 now continues and installs a new LowSpaceProcess and then + p2 does the same. The result will be two processes running the #lowSpaceWatcher method. + Please note this describes the behavior in Squeak 6 using direct process termination; see #terminate."
+ [ + self primSignalAtBytesLeft: 0. "disable low-space interrupts" + LowSpaceProcess == nil ifFalse: [LowSpaceProcess terminate]. + LowSpaceProcess := [self lowSpaceWatcher] newProcess. + LowSpaceProcess priority: Processor lowIOPriority. + LowSpaceProcess resume + ] valueUnpreemptively! - self primSignalAtBytesLeft: 0. "disable low-space interrupts" - LowSpaceProcess == nil ifFalse: [LowSpaceProcess terminate]. - LowSpaceProcess := [self lowSpaceWatcher] newProcess. - LowSpaceProcess priority: Processor lowIOPriority. - LowSpaceProcess resume. - - !
packages@lists.squeakfoundation.org