[squeak-dev] Re: [Vm-dev] The serverMode flag and some thoughts on event polling

David T. Lewis lewis at mail.msen.com
Fri Aug 26 11:37:14 UTC 2011


On Thu, Aug 25, 2011 at 01:01:10PM -0400, Dimitry Golubovsky wrote:
>  
> Hi,
> 
> [this is not really about VM alone, but rather how image and VM
> interact - hence posting to multiple lists]

Dimitry,

Thank you for this detailed and helpful explanation. I hope it
generates some follow up discussion.

Dave


> 
> In the process of porting Cog to Android, I observed the following
> pattern. If a scrollbar's "up" or "down" button is held pressed
> (prolonged tap on a button) for few seconds, the VM freezes, and gets
> killed by Android. Digging down the code got me to the
> WorldState>>interCyclePause: method. When there are morphs requesting
> stepping by shorter than certain time interval, the process
> responsibke for running step methods keeps looping without giving up
> to lower priority processes (and the host OS). ScrollBar seems to
> decrease the stepping interval over time to simulate accelerated
> scrolling.
> 
> In order to port Cog to Android, I turned it into an event-driven VM
> based on ideas found in [1]. The same was done by Andreas for his
> earlier Classic VM port. My approach is a bit different such as the
> longjmp call is made as part of the relinquishProcessor primitive.
> Such primitive is called only from the lowest priority (idle) process
> which only can run when there are no external events to deal with. The
> event-driven VM needs to exit from the interpreter to the host process
> in order to obtain any input events. Thus, non-interrupted polling
> just deadlocks the interpreter as it cannot exit to the host process
> to get more events, yet keeps polling for them.
> 
> The serverMode flag [2] (aka Mantis #6581) came to rescue. With such
> flag set to true, polling for events always yields CPU for 50ms (which
> in the Android case is meaningless anyway: I would not give the VM
> idle timer more often than 10 times per sec, so 50ms granularity is
> just not handleable). Anyway this does the trick as the lowest
> priority process gets its CPU time, and exits the interpreter to the
> host process. With serverMode = true I can tap a scroller button as
> long as I want, and even the text cursor in a workspace keeps blinking
> which means that stepping works and VM is alive. BTW in Android, the
> interpreter will be called as soon as any user action is intercepted,
> so responsiveness is not degraded regardless of the delay introduced
> by serverMode.
> 
> I have found at least one place (this is in PharoCore) where
> serverMode is not honored: PolygonMorph class >> fromHand: (this
> method creates a polygon drawn by the mouse)
> 
> This method has code pieces (repeating multiple times btw - why is it
> not a separate method?)
> 
> [Sensor anyButtonPressed] whileFalse:
>   			[self currentWorld displayWorldSafely; runStepMethods].
> 
> which is clearly grabbing the event sensor to the polygon morph while
> keeping other morphs stepped, so the VM does not seem dead entirely.
> In my case though executing PolygonMorph fromHand: defaultHand freezes
> the VM immediately as this is uninterrupted polling again.
> 
> While I'll try to experiment with inserting interCyclePause somewhere
> in these loops, there are broader questions on how event polling is
> done these days:
> 
> 1. Are there other morphs in packages not included in PharoCore where
> event grabbing is done such way?
> 
> 1a. Is this possible in general to have such functionality properly
> embedded in WorldState instead of having it in a morph itself, if
> event grabbing is needed?
> 
> 2. Are there images in active development (other than PharoCore, and
> Squeak) where event polling is done without an option to relinquish
> processor?
> 
> In fact, this VM freezing on stepping morphs was a big issue, and it
> mainly kept me from moving towards the public release. Now that it
> seems to be solved (unless there is a flaw in my logic above) it takes
> me closer to finishing the Cog for Android port.
> 
> Thanks.
> 
> ------------------------------------------
> [1] http://lists.squeakfoundation.org/pipermail/vm-dev/2009-November/003385.html
> [2] http://bugs.squeak.org/view.php?id=6581
> 
> -- 
> Dimitry Golubovsky
> 
> Anywhere on the Web



More information about the Squeak-dev mailing list