[squeak-dev] The Inbox: System-jar.1367.mcz
commits at source.squeak.org
commits at source.squeak.org
Mon Jul 11 11:21:42 UTC 2022
A new version of System was added to project The Inbox:
==================== Summary ====================
Time: 11 July 2022, 1:21:36.615972 pm
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') -----
"Start a process to watch for low-space conditions."
+ "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.
More information about the Squeak-dev