[Vm-dev] VM Maker: VMMaker-dtl.374.mcz

commits at source.squeak.org commits at source.squeak.org
Sat Jan 23 19:20:29 UTC 2016


David T. Lewis uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker-dtl.374.mcz

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

Name: VMMaker-dtl.374
Author: dtl
Time: 23 January 2016, 2:13:16.858 pm
UUID: ec1dc8c8-f83d-45a8-b28b-929bd5296795
Ancestors: VMMaker-dtl.373

VMMaker 4.15.1

As of Kernel-eem.971 in the Squeak trunk update stream, primitiveSignalAtUTCMicroseconds
is a required primitive. Provide an implementation for the context interpreter. Tick resolution
continues to be 1 msec (not microsecond precision).

Refoctoring note: The microsecond primitives are currently implemented separately in
the context interpreter and stack interpreter. Future refactoring could move these to
InterpreterPrimitives, such that the oriiginal millisecond tick resolution would be replaced.

=============== Diff against VMMaker-dtl.373 ===============

Item was changed:
  ----- Method: Interpreter class>>initializePrimitiveTable (in category 'initialization') -----
(excessive size, no diff calculated)

Item was added:
+ ----- Method: Interpreter>>primitiveSignalAtUTCMicroseconds (in category 'system control primitives') -----
+ primitiveSignalAtUTCMicroseconds
+ 	"Cause the time semaphore, if one has been registered, to be
+ 	 signalled when the microsecond clock is greater than or equal to
+ 	 the given tick value. A tick value of zero turns off timer interrupts."
+ 
+ 	"Provided for compatibility with StackInterpreter microsecond implementation.
+ 	This is a required primitive in some newer images, and is implemented here
+ 	with millisecond precision only."
+ 
+ 	| tick sema usecsObj now usecs |
+ 	<var: #usecs type: #usqLong>
+ 	<var: #now type: #usqLong>
+ 	usecsObj := self popStack.
+ 	sema := self popStack.
+ 	usecs := self positive64BitValueOf: usecsObj.
+ 	now := self ioUTCMicroseconds.
+ 	tick := lastTick + (self cCoerce: usecs - now + 500 / 1000 to: #sqInt). "add 500 for rounding"
+ 	self successful
+ 		ifTrue: [(objectMemory fetchClassOf: sema) = (objectMemory splObj: ClassSemaphore)
+ 				ifTrue: [objectMemory
+ 						storePointer: TheTimerSemaphore
+ 						ofObject: objectMemory getSpecialObjectsOop
+ 						withValue: sema.
+ 					nextWakeupTick := tick]
+ 				ifFalse: [objectMemory
+ 						storePointer: TheTimerSemaphore
+ 						ofObject: objectMemory getSpecialObjectsOop
+ 						withValue: objectMemory getNilObj.
+ 					nextWakeupTick := 0]]
+ 		ifFalse: [self unPop: 2]!

Item was changed:
  ----- Method: InterpreterPrimitives>>ioUTCMicroseconds (in category 'FIXME') -----
  ioUTCMicroseconds
  	"Answer the UTC microseconds since the Smalltalk epoch. The value is
  	derived from the Posix epoch (see primitiveUTCMicrosecondClock) with a
  	constant offset corresponding to elapsed microseconds between the two
  	epochs according to RFC 868."
  
  	"Added to Cross/vm/sqVirtualMachine but incompatible with existing timer
  	support in Cross. Implemented here to provide the function not present in
  	the support code. See also primitiveUTCMicrosecondClock."
  
+ 	| clock offset epochDelta |
- 	| clock offset epochDelta uSecs |
  	<export: true>
  	<returnTypeC: 'usqLong'>
  	<var: #clock type: 'sqLong'>
  	<var: #offset type: 'int'>
  	<var: #epochDelta declareC: 'static usqLong epochDelta= 2177452800000000ULL'>
  
  	self flag: #FIXME. "remove this method when platform sources are reconciled"
  
  	(self cCode: 'ioUtcWithOffset(&clock, &offset)' inSmalltalk: [-1]) = -1
  		ifTrue: [^ self primitiveFail].
+ 	^clock + epochDelta.
- 	clock := clock + epochDelta.
- 	uSecs := self positive64BitIntegerFor: clock.
- 	^uSecs.
  !

Item was added:
+ ----- Method: ObjectMemory>>splObj:put: (in category 'interpreter access') -----
+ splObj: index put: anObject
+ 	"Set one of the objects in the SpecialObjectsArray"
+ 	self storePointer: index ofObject: specialObjectsOop withValue: anObject!

Item was changed:
  ----- Method: StackInterpreter class>>additionalHeadersDo: (in category 'translation') -----
  additionalHeadersDo: aBinaryBlock
  	"Evaluate aBinaryBlock with the names and contents of
  	 any additional header files that need to be generated."
  	self objectMemoryClass additionalHeadersDo: aBinaryBlock.
+ 	"aBinaryBlock
- 	aBinaryBlock
  		value: 'vmCallback.h'
+ 		value: self vmCallbackHeader"!
- 		value: self vmCallbackHeader!

Item was changed:
  ----- Method: StackInterpreter class>>declareCVarsIn: (in category 'translation') -----
  declareCVarsIn: aCCodeGenerator
  	self class == thisContext methodClass ifFalse: [^self]. "Don't duplicate decls in subclasses"
  	aCCodeGenerator
  		addHeaderFile:'<stddef.h> /* for e.g. alloca */';
+ 		addHeaderFile:'<setjmp.h>'.
- 		addHeaderFile:'<setjmp.h>';
- 		addHeaderFile:'"vmCallback.h"';
- 		addHeaderFile:'"sqMemoryFence.h"';
- 		addHeaderFile:'"dispdbg.h"'.
  	self declareInterpreterVersionIn: aCCodeGenerator
  		defaultName: 'Stack'.
  	aCCodeGenerator
  		var: #interpreterProxy  type: #'struct VirtualMachine*'.
  	aCCodeGenerator
  		declareVar: #sendTrace type: 'volatile int';
  		declareVar: #byteCount type: 'unsigned long'.
  	"These need to be pointers or unsigned."
  	self declareC: #(instructionPointer method newMethod)
  		as: #usqInt
  		in: aCCodeGenerator.
  	"These are all pointers; char * because Slang has no support for C pointer arithmetic."
  	self declareC: #(localIP localSP localFP stackPointer framePointer stackLimit stackMemory)
  		as: #'char *'
  		in: aCCodeGenerator.
  	self declareC: #(stackPage overflowedPage)
  		as: #'StackPage *'
  		in: aCCodeGenerator.
  	aCCodeGenerator removeVariable: 'stackPages'.  "this is an implicit receiver in the translated code."
  	aCCodeGenerator
  		var: #methodCache
  		declareC: 'long methodCache[MethodCacheSize + 1 /* ', (MethodCacheSize + 1) printString, ' */]'.
  	aCCodeGenerator
  		var: #atCache
  		declareC: 'sqInt atCache[AtCacheTotalSize + 1 /* ', (AtCacheTotalSize + 1) printString, ' */]'.
  	aCCodeGenerator
  		var: #primitiveTable
  		declareC: 'void (*primitiveTable[MaxPrimitiveIndex + 2 /* ', (MaxPrimitiveIndex +2) printString, ' */])(void) = ', self primitiveTableString.
  	self primitiveTable do:
  		[:symbolOrNot|
  		(symbolOrNot isSymbol
  		 and: [symbolOrNot ~~ #primitiveFail]) ifTrue:
  			[(aCCodeGenerator methodNamed: symbolOrNot) ifNotNil:
  				[:tMethod| tMethod returnType: #void]]].
  	aCCodeGenerator
  		var: #primitiveFunctionPointer
  		declareC: 'void (*primitiveFunctionPointer)()'.
  	aCCodeGenerator
  		var: #externalPrimitiveTable
  		declareC: 'void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* ', (MaxExternalPrimitiveTableSize + 1) printString, ' */])(void)'.
  	aCCodeGenerator var: #showSurfaceFn type: #'void *'.
  	aCCodeGenerator
  		var: #jmpBuf
  		declareC: 'jmp_buf jmpBuf[MaxJumpBuf + 1 /* ', (MaxJumpBuf + 1) printString, ' */]'.
  	aCCodeGenerator
  		var: #suspendedCallbacks
  		declareC: 'usqInt suspendedCallbacks[MaxJumpBuf + 1 /* ', (MaxJumpBuf + 1) printString, ' */]'.
  	aCCodeGenerator
  		var: #suspendedMethods
  		declareC: 'usqInt suspendedMethods[MaxJumpBuf + 1 /* ', (MaxJumpBuf + 1) printString, ' */]'.
  	aCCodeGenerator
  		var: #interruptCheckChain
  		declareC: 'void (*interruptCheckChain)(void) = 0'.
  	aCCodeGenerator
  		var: #breakSelector type: #'char *';
  		var: #breakSelectorLength
  		declareC: 'sqInt breakSelectorLength = -1'.
  
  	self declareC: #(nextPollUsecs nextWakeupUsecs longRunningPrimitiveGCUsecs
  					longRunningPrimitiveStartUsecs longRunningPrimitiveStopUsecs)
  		as: #usqLong
  		in: aCCodeGenerator.
  	aCCodeGenerator var: #nextProfileTick type: #sqLong!

Item was changed:
  ----- Method: VMMaker class>>versionString (in category 'version testing') -----
  versionString
  
  	"VMMaker versionString"
  
+ 	^'4.15.1'!
- 	^'4.14.3'!



More information about the Vm-dev mailing list