[Vm-dev] VM Maker: VMMaker.oscog-eem.2865.mcz

commits at source.squeak.org commits at source.squeak.org
Fri Oct 30 14:59:10 UTC 2020


Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2865.mcz

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

Name: VMMaker.oscog-eem.2865
Author: eem
Time: 30 October 2020, 7:58:58.320942 am
UUID: f9e6957e-d20a-47ba-b579-29e37af6cef3
Ancestors: VMMaker.oscog-eem.2864

Get the CoInterpreterMT to simulate.  Refactor _setjmp:/_longjmp:_: for the added use for reentering the thread scheduling loop.

=============== Diff against VMMaker.oscog-eem.2864 ===============

Item was changed:
  ----- Method: CoInterpreter>>_longjmp:_: (in category 'cog jit support') -----
  _longjmp: aJumpBuf _: returnValue
  	"Hack simulation of _setjmp/_longjmp, intended to invoke the most minimal setjmp/longjmp
  	 pair available on the platform; no saving/restoring signal masks, no stack unwinding, etc.
  	 Signal the exception that simulates a longjmp back to the interpreter." 
  	<doNotGenerate>
+ 	self halt: 'This should not be encountered now we use ceInvokeInterpreter!!!!'!
- 	self halt: 'This should not be encountered now we use ceInvokeInterpreter!!!!'.
- 	(aJumpBuf == reenterInterpreter
- 	 and: [returnValue ~= 2 "2 == returnToThreadSchedulingLoopVia:"]) ifTrue:
- 		[self assert: (self isOnRumpCStack: cogit processor sp).
- 		 self assertValidExecutionPointe: instructionPointer r: framePointer s: stackPointer imbar: true line: nil].
- 	aJumpBuf returnValue: returnValue; signal!

Item was changed:
  CoInterpreterPrimitives subclass: #CoInterpreterMT
+ 	instanceVariableNames: 'cogThreadManager checkThreadActivation maxWaitingPriority foreignCallbackPriority deferThreadSwitch disowningVMThread disownCount foreignCallbackProcessSlot willNotThreadWarnCount activeProcessAffined relinquishing processHasThreadId noThreadingOfGUIThread reenterThreadSchedulingLoop'
- 	instanceVariableNames: 'cogThreadManager checkThreadActivation maxWaitingPriority foreignCallbackPriority deferThreadSwitch disowningVMThread disownCount foreignCallbackProcessSlot willNotThreadWarnCount activeProcessAffined relinquishing processHasThreadId noThreadingOfGUIThread'
  	classVariableNames: 'DisownFlagsShift DisownVMForProcessorRelinquish LockGUIThreadFlag LockGUIThreadShift OwnVMForeignThreadFlag ProcessUnaffinedOnDisown ReturnToThreadSchedulingLoop VMAlreadyOwnedHenceDoNotDisown'
  	poolDictionaries: 'VMThreadingConstants'
  	category: 'VMMaker-Multithreading'!

Item was added:
+ ----- Method: CoInterpreterMT>>_longjmp:_: (in category 'cog jit support') -----
+ _longjmp: aJumpBuf _: returnValue
+ 	"Hack simulation of _setjmp/_longjmp, intended to invoke the most minimal setjmp/longjmp
+ 	 pair available on the platform; no saving/restoring signal masks, no stack unwinding, etc.
+ 	 Signal the exception that simulates a longjmp back to the interpreter." 
+ 	<doNotGenerate>
+ 	self assert: aJumpBuf == reenterThreadSchedulingLoop.
+ 	aJumpBuf returnValue: returnValue; signal!

Item was changed:
  ----- Method: CoInterpreterMT>>initializeInterpreter: (in category 'initialization') -----
  initializeInterpreter: bytesToShift 
  	super initializeInterpreter: bytesToShift.
  	foreignCallbackProcessSlot := (objectMemory lengthOf: objectMemory specialObjectsOop) > ForeignCallbackProcess
  										ifTrue: [ForeignCallbackProcess]
+ 										ifFalse: [NilObject].
+ 	self cCode: '' inSmalltalk:
+ 		[reenterThreadSchedulingLoop := ReenterThreadSchedulingLoop new].
+ !
- 										ifFalse: [NilObject]!

Item was added:
+ ----- Method: CoInterpreterMT>>initializeProcessorStackForSimulation: (in category 'initialization') -----
+ initializeProcessorStackForSimulation: vmThread
+ 	<inline: #always>
+ 	self cCode: [] inSmalltalk:
+ 		[| range |
+ 		 range := self cStackRangeForThreadIndex: vmThread index.
+ 		 cogit processor
+ 			setFramePointer: range last
+ 			stackPointer: range last - 32]!

Item was changed:
  ----- Method: CoInterpreterMT>>mapInterpreterOops (in category 'object memory support') -----
  mapInterpreterOops
  	"Map all oops in the interpreter's state to their new values 
  	 during garbage collection or a become: operation."
  	"Assume: All traced variables contain valid oops."
  	<var: #vmThread type: #'CogVMThread *'>
  	super mapInterpreterOops.
  
  	"Per-thread state; trace each thread's own newMethod and stack of awol processes."
  	1 to: cogThreadManager getNumThreads do:
  		[:i| | vmThread |
  		vmThread := cogThreadManager vmThreadAt: i.
  		vmThread state ifNotNil:
  			[(vmThread newMethodOrNull notNil
  			 and: [objectMemory shouldRemapOop: vmThread newMethodOrNull]) ifTrue:
  				[vmThread newMethodOrNull: (objectMemory remapObj: vmThread newMethodOrNull)].
  			 0 to: vmThread awolProcIndex - 1 do:
  				[:j|
  				(objectMemory shouldRemapOop: (vmThread awolProcesses at: j)) ifTrue:
+ 					[vmThread awolProcesses at: j put: (objectMemory remapObj: (vmThread awolProcesses at: j))]]]]!
- 					[vmThread awolProcesses at: j put: (objectMemory remap: (vmThread awolProcesses at: j))]]]]!

Item was changed:
  ----- Method: CoInterpreterMT>>returnToSchedulingLoopAndReleaseVMOrWakeThread:source: (in category 'process primitive support') -----
  returnToSchedulingLoopAndReleaseVMOrWakeThread: vmThread source: source
  	<var: #vmThread type: #'CogVMThread *'>
  	<inline: false>
  	self cCode:
  			[self flag: 'this is just for debugging.  Note the current C stack pointers'.
  			 cogThreadManager currentVMThread
  				cStackPointer: CStackPointer;
  				cFramePointer: CFramePointer]
  		inSmalltalk:
  			[| range |
  			 range := self cStackRangeForThreadIndex: cogThreadManager getVMOwner.
  			 self assert: (range includes: CStackPointer).
  			 self assert: (range includes: CFramePointer)].
  	self recordThreadSwitchTo: (vmThread ifNotNil: [vmThread index] ifNil: [0]) source: source.
  	vmThread
  		ifNotNil: [cogThreadManager wakeVMThreadFor: vmThread index]
  		ifNil: [cogThreadManager releaseVM].
+ 	"I am not frightened of flying.
+ 	 Any value will do.  I don't mind.
+ 	 Why should I be frightened of flying?
+ 	 There's no reason for it."
+ 	self _longjmp: reenterThreadSchedulingLoop _: 1 !
- 	"2 implies returning to the threadSchedulingLoop."
- 	self shouldBeImplemented.
- 	"was: self _longjmp: savedReenterInterpreter _: ReturnToThreadSchedulingLoop.
- 	 But now we have ceInvokeInterpret, not reenterInterpreter, so we have to fugure out a new way in..."!

Item was changed:
  ----- Method: CoInterpreterMT>>threadSchedulingLoop: (in category 'vm scheduling') -----
  threadSchedulingLoop: vmThread
  	"Enter a loop attempting to run the VM with the highest priority process and
  	 blocking on the thread's OS semaphore when unable to run that process.
+ 	 This version is for simulation only, simulating the longjmp back to the real
+ 	 threadSchedulingLoopImplementation: through exception handling."
+ 
+ 	<cmacro: '(vmThread) threadSchedulingLoopImplementation(vmThread)'>
+ 	self initializeProcessorStackForSimulation: vmThread.
+ 	[([self threadSchedulingLoopImplementation: vmThread]
+ 		on: ReenterThreadSchedulingLoop
+ 		do: [:ex| ex return: ex returnValue]) = ReenterThreadSchedulingLoop] whileTrue!
- 	 We will return to this via threadSwitchIfNecessary:from: which is called in the
- 	 middle of transferTo:from: once the active process has been stored in the scheduler."
- 	<var: #vmThread type: #'CogVMThread *'>
- 	| attemptToRun |
- 	<inline: false>
- 	[self assert: vmThread state = CTMAssignableOrInVM.
- 	 attemptToRun := false.
- 	 (cogThreadManager getVMOwner = vmThread index)
- 		ifTrue: [attemptToRun := true]
- 		ifFalse:
- 			[(cogit tryLockVMToIndex: vmThread index) ifTrue:
- 				["If relinquishing is true, then primitiveRelinquishProcessor has disowned the
- 				  VM and only a returning call or callback should take ownership in that case."
- 				 relinquishing
- 					ifTrue: [cogThreadManager releaseVM]
- 					ifFalse: [attemptToRun := true]]].
- 	 attemptToRun ifTrue:
- 		[self tryToExecuteSmalltalk: vmThread].
- 	 (cogThreadManager testVMOwnerIs: vmThread index) ifFalse:
- 		[cogThreadManager waitForWork: vmThread].
- 	 true] whileTrue!

Item was added:
+ ----- Method: CoInterpreterMT>>threadSchedulingLoopImplementation: (in category 'vm scheduling') -----
+ threadSchedulingLoopImplementation: vmThread
+ 	"Enter a loop attempting to run the VM with the highest priority process and
+ 	 blocking on the thread's OS semaphore when unable to run that process.
+ 	 We will return to this via threadSwitchIfNecessary:from: which is called in the
+ 	 middle of transferTo:from: once the active process has been stored in the scheduler."
+ 	<var: #vmThread type: #'CogVMThread *'>
+ 	| attemptToRun |
+ 	<inline: false>
+ 	self _setjmp: reenterThreadSchedulingLoop.
+ 	[self assert: vmThread state = CTMAssignableOrInVM.
+ 	 attemptToRun := false.
+ 	 (cogThreadManager getVMOwner = vmThread index)
+ 		ifTrue: [attemptToRun := true]
+ 		ifFalse:
+ 			[(cogit tryLockVMToIndex: vmThread index) ifTrue:
+ 				["If relinquishing is true, then primitiveRelinquishProcessor has disowned the
+ 				  VM and only a returning call or callback should take ownership in that case."
+ 				 relinquishing
+ 					ifTrue: [cogThreadManager releaseVM]
+ 					ifFalse: [attemptToRun := true]]].
+ 	 attemptToRun ifTrue:
+ 		[self tryToExecuteSmalltalk: vmThread].
+ 	 (cogThreadManager testVMOwnerIs: vmThread index) ifFalse:
+ 		[cogThreadManager waitForWork: vmThread].
+ 	 true] whileTrue!

Item was added:
+ ----- Method: CogVMSimulator>>_longjmp:_: (in category 'multi-threading simulation switch') -----
+ _longjmp: aJumpBuf _: returnValue
+ 	"This method includes or excludes CoInterpreterMT methods as required.
+ 	 Auto-generated by CogVMSimulator>>ensureMultiThreadingOverridesAreUpToDate"
+ 
+ 	^self perform: #'_longjmp:_:'
+ 		withArguments: {aJumpBuf. returnValue}
+ 		inSuperclass: (cogThreadManager ifNil: [CoInterpreterPrimitives] ifNotNil: [CoInterpreterMT])!

Item was added:
+ Notification subclass: #ReenterThreadSchedulingLoop
+ 	instanceVariableNames: 'returnValue'
+ 	classVariableNames: ''
+ 	poolDictionaries: ''
+ 	category: 'VMMaker-JITSimulation'!

Item was changed:
  ----- Method: StackInterpreter>>_setjmp: (in category 'primitive support') -----
  _setjmp: aJumpBuf
  	"Hack simulation of _setjmp/_longjmp, intended to invoke the most minimal setjmp/longjmp
+ 	 pair available on the platform; no saving/restoring signal masks, no stack unwinding, etc." 
- 	 pair available on the platform; no saving/restoring signal masks, no stack unwinding, etc.
- 	 Assign to reenterInterpreter the exception that when raised simulates a _longjmp back to the interpreter." 
  	<doNotGenerate>
+ 	self assert: (#(ReenterInterpreter ReenterThreadSchedulingLoop) includes: aJumpBuf class name).
- 	reenterInterpreter := ReenterInterpreter new returnValue: 0; yourself.
  	^0!

Item was changed:
  ----- Method: StackInterpreter>>initializeInterpreter: (in category 'initialization') -----
  initializeInterpreter: bytesToShift
  	"Initialize Interpreter state before starting execution of a new image."
  	interpreterProxy := self sqGetInterpreterProxy.
  	self dummyReferToProxy.
  	objectMemory initializeObjectMemory: bytesToShift.
  	self checkAssumedCompactClasses.
  	self initializeExtraClassInstVarIndices.
  	method := newMethod := objectMemory nilObject.
  	self cCode: '' inSmalltalk:
  		[breakSelectorLength ifNil:
  			[breakSelectorLength := objectMemory minSmallInteger].
+ 		 breakLookupClassTag ifNil: [breakLookupClassTag := -1].
+ 		 reenterInterpreter := ReenterInterpreter new].
- 		 breakLookupClassTag ifNil: [breakLookupClassTag := -1]].
  	methodDictLinearSearchLimit := 8.
  	self initialCleanup.
  	LowcodeVM ifTrue: [ self setupNativeStack ].
  	profileSemaphore := profileProcess := profileMethod := objectMemory nilObject.
  	interruptKeycode := 2094. "cmd-. as used for Mac but no other OS"
  	[globalSessionID = 0] whileTrue:
  		[globalSessionID := self
  								cCode: [(self time: #NULL) + self ioMSecs]
  								inSmalltalk: [(Random new next * (SmallInteger maxVal min: 16rFFFFFFFF)) asInteger]].
  	metaAccessorDepth := -2.
  	super initializeInterpreter: bytesToShift!



More information about the Vm-dev mailing list