Example of non-concurrent code :)

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Example of non-concurrent code :)

Igor Stasenko
mouseTrailFrom: currentBuf
        "Current event, a mouse event buffer, is about to be processed.  If
there are other similar mouse events queued up, then drop them from
the queue, and report the positions inbetween."

        | nextEvent trail |
        trail := (Array new: 1) writeStream.
        trail nextPut: currentBuf third @ currentBuf fourth.
*a* [(nextEvent := Sensor peekEvent) isNil] whileFalse:
                        [nextEvent first = currentBuf first
                                ifFalse: [^trail contents "different event type"].
                        nextEvent fifth = currentBuf fifth
                                ifFalse: [^trail contents "buttons changed"].
                        nextEvent sixth = currentBuf sixth
                                ifFalse: [^trail contents "modifiers changed"].
                        "nextEvent is similar.  Remove it from the queue, and check the next."
*b* nextEvent := Sensor nextEvent.
                        trail nextPut: nextEvent third @ nextEvent fourth].
        ^trail contents


Here, the bug:
first it sends #peekEvent and its not nil.
Okay, then after some logic voodo, it sends nextEvent, without
precaution, that it may also answer nil!

So, if some other process get between these two sends (*a*, *b*) and
fetch/flush all events, a code will fail,
because
'nextEvent third' is DNU , when nextEvent == nil.

The fix is simple:

nextEvent := Sensor nextEvent.
nextEvent ifNotNil: [ trail nextPut: nextEvent third @ nextEvent fourth]

Both Pharo & Squeak contain this bug. But this method slightly differs
from each other.

--
Best regards,
Igor Stasenko AKA sig.

_______________________________________________
Pharo-project mailing list
[hidden email]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
Reply | Threaded
Open this post in threaded view
|

Re: Example of non-concurrent code :)

johnmci
Igor, take a look back in the messages from January 25th 2010
        Re: [Pharo-project] new mac menu code
There may be something related there?


On 2010-10-15, at 9:41 PM, Igor Stasenko wrote:

> mouseTrailFrom: currentBuf
> "Current event, a mouse event buffer, is about to be processed.  If
> there are other similar mouse events queued up, then drop them from
> the queue, and report the positions inbetween."
>
> | nextEvent trail |
> trail := (Array new: 1) writeStream.
> trail nextPut: currentBuf third @ currentBuf fourth.
> *a* [(nextEvent := Sensor peekEvent) isNil] whileFalse:
> [nextEvent first = currentBuf first
> ifFalse: [^trail contents "different event type"].
> nextEvent fifth = currentBuf fifth
> ifFalse: [^trail contents "buttons changed"].
> nextEvent sixth = currentBuf sixth
> ifFalse: [^trail contents "modifiers changed"].
> "nextEvent is similar.  Remove it from the queue, and check the next."
> *b* nextEvent := Sensor nextEvent.
> trail nextPut: nextEvent third @ nextEvent fourth].
> ^trail contents
>
>
> Here, the bug:
> first it sends #peekEvent and its not nil.
> Okay, then after some logic voodo, it sends nextEvent, without
> precaution, that it may also answer nil!
>
> So, if some other process get between these two sends (*a*, *b*) and
> fetch/flush all events, a code will fail,
> because
> 'nextEvent third' is DNU , when nextEvent == nil.
>
> The fix is simple:
>
> nextEvent := Sensor nextEvent.
> nextEvent ifNotNil: [ trail nextPut: nextEvent third @ nextEvent fourth]
>
> Both Pharo & Squeak contain this bug. But this method slightly differs
> from each other.
>
> --
> Best regards,
> Igor Stasenko AKA sig.
>
> _______________________________________________
> Pharo-project mailing list
> [hidden email]
> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
--
===========================================================================
John M. McIntosh <[hidden email]>   Twitter:  squeaker68882
Corporate Smalltalk Consulting Ltd.  http://www.smalltalkconsulting.com
===========================================================================





_______________________________________________
Pharo-project mailing list
[hidden email]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project

smime.p7s (5K) Download Attachment