[squeak-dev] The Trunk: Kernel-ar.322.mcz

commits at source.squeak.org commits at source.squeak.org
Sat Dec 5 02:29:21 UTC 2009


Andreas Raab uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-ar.322.mcz

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

Name: Kernel-ar.322
Author: ar
Time: 4 December 2009, 6:28:49 am
UUID: 58a79c17-4e44-3d4a-bdd0-3be9630020ea
Ancestors: Kernel-ar.321

Faster #ensure: handling: Instead of having the default path use thisContext>>tempAt:put: (which is very slow for the JIT) use a temp assignment and let only the termination handling actually do #tempAt:put:.

Part 2 updates termination handling to the new scheme.

=============== Diff against Kernel-ar.321 ===============

Item was changed:
  ----- Method: ContextPart>>restart (in category 'controlling') -----
  restart
  	"Unwind thisContext to self and resume from beginning.  Execute unwind blocks when unwinding.  ASSUMES self is a sender of thisContext"
  
  	| ctxt unwindBlock |
  	self isDead ifTrue: [self cannotReturn: nil to: self].
  	self privRefresh.
  	ctxt := thisContext.
  	[	ctxt := ctxt findNextUnwindContextUpTo: self.
  		ctxt isNil
  	] whileFalse: [
+ 		(ctxt tempAt: 2) ifNil:[
+ 			ctxt tempAt: 2 put: true.
+ 			unwindBlock := ctxt tempAt: 1.
- 		unwindBlock := ctxt tempAt: 1.
- 		unwindBlock ifNotNil: [
- 			ctxt tempAt: 1 put: nil.
  			thisContext terminateTo: ctxt.
  			unwindBlock value].
  	].
  	thisContext terminateTo: self.
  	self jump.
  !

Item was changed:
  ----- Method: ContextPart>>resume: (in category 'controlling') -----
  resume: value
  	"Unwind thisContext to self and resume with value as result of last send.  Execute unwind blocks when unwinding.  ASSUMES self is a sender of thisContext"
  
  	| ctxt unwindBlock |
  	self isDead ifTrue: [self cannotReturn: value to: self].
  	ctxt := thisContext.
  	[	ctxt := ctxt findNextUnwindContextUpTo: self.
  		ctxt isNil
  	] whileFalse: [
+ 		(ctxt tempAt: 2) ifNil:[
+ 			ctxt tempAt: 2 put: true.
+ 			unwindBlock := ctxt tempAt: 1.
- 		unwindBlock := ctxt tempAt: 1.
- 		unwindBlock ifNotNil: [
- 			ctxt tempAt: 1 put: nil.
  			thisContext terminateTo: ctxt.
  			unwindBlock value].
  	].
  	thisContext terminateTo: self.
  	^ value
  !

Item was changed:
  ----- Method: Process>>terminate (in category 'changing process state') -----
  terminate 
  	"Stop the process that the receiver represents forever.  Unwind to execute pending ensure:/ifCurtailed: blocks before terminating."
  
  	| ctxt unwindBlock oldList |
  	self isActiveProcess ifTrue: [
  		ctxt := thisContext.
  		[	ctxt := ctxt findNextUnwindContextUpTo: nil.
  			ctxt isNil
  		] whileFalse: [
+ 			(ctxt tempAt: 2) ifNil:[
+ 				ctxt tempAt: 2 put: nil.
+ 				unwindBlock := ctxt tempAt: 1.
- 			unwindBlock := ctxt tempAt: 1.
- 			unwindBlock ifNotNil: [
- 				ctxt tempAt: 1 put: nil.
  				thisContext terminateTo: ctxt.
  				unwindBlock value].
  		].
  		thisContext terminateTo: nil.
  		self suspend.
  	] ifFalse:[
+ 		"Always suspend the process first so it doesn't accidentally get woken up"
+ 		oldList := self suspend.
- 		myList ifNotNil:[oldList := self suspend].
  		suspendedContext ifNotNil:[
  			"Figure out if we are terminating the process while waiting in Semaphore>>critical:
  			In this case, pop the suspendedContext so that we leave the ensure: block inside
  			Semaphore>>critical: without signaling the semaphore."
  			(oldList class == Semaphore and:[
  				suspendedContext method == (Semaphore compiledMethodAt: #critical:)]) ifTrue:[
  					suspendedContext := suspendedContext home.
  			].
  			ctxt := self popTo: suspendedContext bottomContext.
  			ctxt == suspendedContext bottomContext ifFalse: [
  				self debug: ctxt title: 'Unwind error during termination']].
  	].
  !

Item was changed:
  ----- Method: ContextPart>>unwindTo: (in category 'private-exceptions') -----
  unwindTo: aContext
  
  	| ctx unwindBlock |
  	ctx := self.
  	[(ctx := ctx findNextUnwindContextUpTo: aContext) isNil] whileFalse: [
+ 		(ctx tempAt: 2) ifNil:[
+ 			ctx tempAt: 2 put: true.
+ 			unwindBlock := ctx tempAt: 1.
- 		unwindBlock := ctx tempAt: 1.
- 		unwindBlock == nil ifFalse: [
- 			ctx tempAt: 1 put: nil.
  			unwindBlock value]
  	].
  !




More information about the Squeak-dev mailing list