Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.3111.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.3111 Author: eem Time: 23 November 2021, 7:34:50.330398 pm UUID: 27fe97ff-bcae-4575-abf9-276901dda03e Ancestors: VMMaker.oscog-eem.3110
Minor fixes for CoInterpreterMT
=============== Diff against VMMaker.oscog-eem.3110 ===============
Item was changed: ----- Method: CoInterpreterMT>>bindProcess:toId: (in category 'process primitive support') ----- bindProcess: aProcess toId: newId "Change a Process's thread binding and answer 0, otherwise answer a suitable error code. Cases: process is unbound & unaffined id 0 nothing to do id non-zero ensure thread and bind process is affined (temporarily bound to a thread for the duration of a surrender of ownership) id = affined index nothing to do id = 0 nothing to do id ~= 0 && id ~= affined index fail process is bound (permanently bound to a thread) id = bound index nothing to do id ~= bound index set bound index" | threadIdField ownerIndex affinedId | processHasThreadId ifFalse: [^PrimErrUnsupported].
threadIdField := self threadIdFieldOf: aProcess. ownerIndex := self ownerIndexOfThreadId: threadIdField.
"If aProcess is affined (temporarily bound to) a thread then the operation can only succeed if the newId is the same as that aProcess is affined to, or is zero (is unbinding)." (self isAffinedThreadId: threadIdField) ifTrue: [affinedId := self affinedThreadId: threadIdField. (newId = 0 or: [newId = affinedId]) ifTrue: [self setThreadIdFieldOfProcess: aProcess to: newId << ThreadIdShift + affinedId. + ^nil]. - ^0]. ^PrimErrInappropriate].
ownerIndex > 0 ifTrue: [(self startThreadForThreadIndex: ownerIndex) ifFalse: [^PrimErrLimitExceeded]].
self setThreadIdFieldOfProcess: aProcess to: newId << ThreadIdShift. + ^nil! - ^0!
Item was changed: ----- Method: CoInterpreterMT>>primitiveProcessBindToThreadId (in category 'process primitives') ----- primitiveProcessBindToThreadId "Attempt to bind the receiver to the thread with the id of the argument or nil, where the receiver is a Process. If successful the VM will ensure that there are at least id many threads active." | aProcess id | <export: true> - self break. self cCode: [] inSmalltalk: [cogThreadManager isNil ifTrue: [^self primitiveFail]]. processHasThreadId ifFalse: [^self primitiveFailFor: PrimErrUnsupported]. id := self stackTop. aProcess := self stackValue: 1. ((id = objectMemory nilObject or: [(objectMemory isIntegerObject: id) and: [id ~= (objectMemory integerObjectOf: 0)]]) and: [(objectMemory isPointers: aProcess) and: [(objectMemory slotSizeOf: aProcess) >= (ThreadIdIndex + 1)]]) ifFalse: [^self primitiveFailFor: PrimErrBadArgument]. id := id = objectMemory nilObject ifTrue: [0] ifFalse: [objectMemory integerValueOf: id]. id abs >= cogThreadManager maxNumThreads ifTrue: [^self primitiveFailFor: PrimErrLimitExceeded]. (self bindProcess: aProcess toId: id) ifNotNil: [:ec| ^self primitiveFailFor: ec]. id := self ownerIndexOfProcess: aProcess. (aProcess = self activeProcess and: [(activeProcessAffined := id ~= 0) and: [(cogThreadManager vmOwnerIsCompatibleWith: id) not]]) ifTrue: [(self quickFetchInteger: PriorityIndex ofObject: aProcess) < maxWaitingPriority ifTrue: [maxWaitingPriority = self quickFetchInteger: PriorityIndex ofObject: aProcess]. checkThreadActivation := true. self forceInterruptCheck]. self methodReturnReceiver!
vm-dev@lists.squeakfoundation.org