[squeak-dev] The Trunk: Kernel-eem.1184.mcz

commits at source.squeak.org commits at source.squeak.org
Sat Jul 28 16:15:51 UTC 2018

Eliot Miranda uploaded a new version of Kernel to project The Trunk:

==================== Summary ====================

Name: Kernel-eem.1184
Author: eem
Time: 26 July 2018, 9:02:17.653687 pm
UUID: 37221c94-8415-41a5-8535-b047f59150b9
Ancestors: Kernel-eem.1183

Now that Kernel-eem.1183 has fixed the process termination in critical: in the face of higher priority processes issue, we can go back to a simpler implementation of Semaphore>>critical:, albeit one marked with ther <criticalSection> pragma for visibility in Process>>#terminate.

=============== Diff against Kernel-eem.1183 ===============

Item was changed:
  ----- Method: Semaphore>>critical: (in category 'mutual exclusion') -----
  critical: mutuallyExcludedBlock
  	"Evaluate mutuallyExcludedBlock only if the receiver is not currently in
  	the process of running the critical: message. If the receiver is, evaluate
  	mutuallyExcludedBlock after the other critical: message is finished."
+ 	self wait.
+ 	^mutuallyExcludedBlock ensure: [self signal]
- 	| caught |
- 	"We need to catch eventual interruptions very carefully. 
- 	The naive approach of just doing, e.g.,:
- 		self wait.
- 		aBlock ensure:[self signal].
- 	will fail if the active process gets terminated while in the wait.
- 	However, the equally naive:
- 		[self wait.
- 		aBlock value] ensure:[self signal].
- 	will fail too, since the active process may get interrupted while
- 	entering the ensured block and leave the semaphore signaled twice.
- 	To avoid both problems we make use of the fact that interrupts only
- 	occur on sends (or backward jumps) and use an assignment (bytecode)
- 	right before we go into the wait primitive (which cannot be preempted)."
- 	caught := false.
- 	^[
- 		caught := true.
- 		self wait.
- 		mutuallyExcludedBlock value
- 	] ensure: [ caught ifTrue: [self signal] ]

More information about the Squeak-dev mailing list