[Vm-dev] Win32 Event VM prototype

Andreas Raab andreas.raab at gmx.de
Sat Nov 14 20:52:33 UTC 2009


Stephen Pair wrote:
> You would call sendMessage() in response to Windows messages (it would 
> do nothing but safely and quickly enqueue messages for interpret()). 
> You could have a third call, waitUntilRunnable() and then you would 
> have a loop in an OS level thread that repeatedly calls 
> waitUntilRunnable() followed by interpret().  The Windows messages would 
> be calling sendMessage() to unblock waitUntilRunnable() and queue up 
> work for interpret().

Interestingly, we have all that just under different names. The 
sendMessage() call is implemented in C (via recordMouseEvent, 
recordKeyboardEvent etc) in such that its purpose is to "safely and 
quickly enqueues the nessage for interpret" ;-)

The function waitUntilRunnable() is implemented implicitly via having 
interpret call from the MainWndProc (which isn't called unless there's 
an event) but in an earlier version I wrote a more explicit loop like:

   while(1) {
     /* here goes waitUntilRunnable */
     ioRelinquishProcessorForMicroseconds(1000);
     ioProcessEvents();
     /* and finally interpret() */
     interpret();
   }

The issue with recursion is not as difficult as it might seem. The 
important thing (as you said) is knowing when a callback is "safe". And 
that's actually quite easy to determine - callbacks are safe if and only 
if you're in a primitive because only then all necessary interpreter 
state is sufficiently externalized. The callbackEnter implementation 
already makes use of that and I just haven't adapted all the necessary 
code. (I did prevent callbacks via ioProcessEvents since this is called 
from checkForInterrupts in strange places but that doesn't seem to be 
enough).

Cheers,
   - Andreas



More information about the Vm-dev mailing list