[Vm-dev] VM Maker: VMMaker.oscog-eem.3094.mcz
commits at source.squeak.org
commits at source.squeak.org
Mon Oct 18 23:13:18 UTC 2021
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
==================== Summary ====================
Time: 18 October 2021, 4:13:04.230908 pm
CoInterpreterMT & StackInterpreter must agree on the defs of DisownVMForFFICall & DisownVMForThreading.
=============== Diff against VMMaker.oscog-eem.3093 ===============
Item was changed:
----- Method: CoInterpreterMT class>>initializeSchedulerIndices (in category 'initialization') -----
"The thread id of a process is either nil or a SmallInteger that defines how a process binds to threads.
If nil, the process may run on any thread.
The least significant bit of threadId is a flag. The most significant bits are a threadId.
If the threadId is nil the process can run on any thread.
If the flag (least significant bit) is set then
If the threadId is positive the process can only be run on the thread with that thread Id.
If the threadId is negative the process must not be run on the thread with that thread Id.
If the flag (least significant bit) is not set then
the thread id will not be negative and if non-zero is the id of the thread the process is currenty running on
The flag is probably a mistake..."
"In part, what's really going on here is an attempt to deal with threading on Mac. Events can only be delivered
on the GUi thread. To avoid blocking and/or crashing the VM by making a blocking (e.g. FFI) call on the GUI
thread we want a nice way of preventing a process from running on the GUI thread. We can then use a process
whose threadId precludes running on the GUI thread to make blocking calls. The alternative, of arranging that
events are delivered to a thread the VM does not run on, is problematic; it cannot support event callbacks."
"So if we simplify, and threadId is only instructive to the VM, (i.e. can say ''run on a given thread'', or ''don't run
on a given thread'', and ''don't care; run on any thread'') and does not necessarily hold the threadId of the thread
the process is currenty bound to, how do we locate the threadId for a process temporarily affined to a thread for
the duration of an FFI call? Note that a process *must* be bound to a thread for the duration of a threaded call
(or foreign callback) so that return occurs on the correct thread. We can use the least significant bit to mean
''temporarily affined'', but we need to support ''don't run on this thread''. We could use bit fields (yuck); we
could allocate a two field object and assign it to threadId when setting a process to not run on a given thread.
This isn't so bad; use negative values to mean ''don't run on this thread'', and positive values to mean ''run on this thread''.
Split the smallest SmallInteger (32-bit, 1 bit sign, 2-bit tags, leaving 29//2) into two 14 bit fields. The least significant
14 bits are the thread id the receiver is temporarily affined to. The most significant 14 bits are the thread id of the
thread the proess is either bound to or excluded from. If zero, the process is agnostic. See CogThreadManager>>#maxNumThreads"
ThreadIdIndex := 4.
ThreadIdShift := 14. "could be 30 in 64-bits"
"disown result/own argument flags"
OwnVMForeignThreadFlag := 1.
VMAlreadyOwnedHenceDoNotDisown := 2.
ProcessUnaffinedOnDisown := 4.
"& defined in StackInterpreter are..."
+ DisownVMForFFICall := 16.
+ DisownVMForThreading := 32.
+ DisownFlagsShift := DisownVMForThreading highBit!
- DisownVMForFFICall := 8.
- DisownVMForThreading := 16.
- DisownFlagsShift := 5!
More information about the Vm-dev