[Vm-dev] An event driven Squeak VM

John M McIntosh johnmci at smalltalkconsulting.com
Tue Nov 10 18:56:27 UTC 2009

On 2009-11-10, at 12:00 AM, Andreas Raab wrote:
> Now, obviously this is inefficient, we'd want to replace the  
> ioProcessEvents() call with something more elaborate that reacts to  
> the incoming OS events, takes the next scheduled delay into account,  
> checks for socket handles etc. But I'm sure you're getting the idea.  
> Instead of wasting our time in the idleProcess, we just return when  
> there's no more work to do and it's up to the caller to run interpret 
> () as often or as rarely as desired.

Well I'm not sure what exactly you are trying to fix or optimize, but  
let me review what happens for the rest of the platforms.

When ioRelinquishProcessorForMicroseconds is called and given a bogus  
magic wait value,  on OS-X we
calculate the wait time based on getNextWakeupTick() and the current  
time with regard to if the
getNextWakeupTick() is zero or in the past.

The getNextWakeupTick() is the time in ms that  the Delay logic thinks  
it has to wait for the set of delays sorted by time to terminate.
I note that this value could be zero on non-morphic systems, but on  
morphic it's always about 16-20 ms because the
Morphic stepper logic wakes up every 1/50 second.

I believe on unix system it just uses the bogus wait value which is  
1000 microseconds.

We then schedule a wait using either a somewhat correct wait value or  
in the unix/linux case 1000 microseconds.

How long the wait takes is determined by the wait logic and the flavor  
of unix, it could be 1 ms, or it could be 10, or 100 ms.
Apple attempts to ensure the time you ask to wait will be the time  
given. Typically unix/linux users see high CPU usage for idle squeak  
images since the wait time could be 1ms, but
might be 10 ms.

Now the wait can be terminated early because a interrupt event (i/o,  
sockets, ui) happen. if so any async file io, or socket interrupts are  
serviced immediately setting flags/semaphores
for the squeak vm to service within the next few ms.

If an external pthread signals a squeak semaphore this does not wake  
the sleeping squeak vm pthread.

also see

Now as for the proposed changes, we would just call the  
ioRelinquishProcessorForMicroseconds() logic after the interpreter()  
On register rich machines (ancient powerpc machines this change would  
be technically more expensive since it loads up 20 some registers
on the entry to interpret() but give it's call rate of 50 times a  
second no-one will notice.

John M. McIntosh <johnmci at smalltalkconsulting.com>   Twitter:   
Corporate Smalltalk Consulting Ltd.  http://www.smalltalkconsulting.com

More information about the Vm-dev mailing list