Re: [flexcoders] Bug in EventDispatcher? It shouldn't dispatch new Events if not at top of stack

2006-11-04 Thread Ralf Bokelberg
Beeing able to dispatch events while we are dispatching an event is
the expected behaviour. ActionScript doesn't have threads, so it's
threadsafe per definition. In other words, it never happens, that an
event interrupts a running method. If you dispatch an event while you
are in another event handler, the new event is completely handled
before the remaining handlers of the initial event are called. It's
just simple method calls.

1 dispatch event 1
2   handle event 1
3   dispatch event 2
4   handle event 2
5   handle event 2
6handle event 1
7handle event 1

So what is the exact problem you see? An exception in line 2 doesn't
stop the rest of the handling?

Cheers,
Ralf.

On 11/4/06, ncr100 [EMAIL PROTECTED] wrote:
 This is a complex one.

 Summary:

 I believe I'm not confused with try/catch, but am surprised that the
 EventDispatcher assumes our code is reentrant.  Reentrant like the
 EventDispatcher is dispatching a system Event in the middle of me
 handling other events.  So we're vulnerable to reentrant callbacks
 when we call EventDispatcher.dispatchEvent.

 Details:

 Normally when an null dereference happens an Error is propagated up
 the call stack to a catch handler.

 The bug is this: if in the middle of this call stack there happens to
 be an EventDispatcher.dispatchEvent call and the null pointer happens
 somewhere inside one of the listeners, then the Flash VM runtime
 thingy / implementation of dispatchEvent() itself seems to catch 
 handle the Error, and takes the opportunity to dispatch a pending
 Events.  In my case I've seen a ProgressEvent.SOCKET_DATA being
 dispatched because my server pumped out some data to me really
 quickly, though I assume any pending Event could be dispatched.

 This really causes havoc because our methods aren't reentrant; flash
 isn't multithreaded afaik and we don't think we have to write
 everything thread-safe.

 Here's an illustration I will walk through.  At the start of the stack
 our DTVSocket.onSocketConnect listens for an
 ProgressEvent.SOCKET_DATA, and just got one.  Notice for now the
 EventDispatcher [no source] in the middle of the stack trace.  Capping
 off the stack trace, see our TextUtil.setText method ... it is doing
 something bad, and has just triggered a null pointer exception!

 dtv.util::TextUtil$/setText   (BANG!  null pointer exception)
 MarbachViewer/MarbachViewer::createChannelCanvas
 MarbachViewer/MarbachViewer::subscribeToChannel
 MarbachViewer/MarbachViewer::onConnected
 flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction
 [no source]
 flash.events::EventDispatcher/dispatchEvent [no source]
 dtv.util::DTVSocket/dtv.util:DTVSocket::dispatchOnConnectedEvent
 dtv.util::DTVSocket/dtv.util:DTVSocket::onReceivedSessionTicket
 Function/http://adobe.com/AS3/2006/builtin::call [no source]
 dtv.util::DTVSocket/dtv.util:DTVSocket::onJSON
 dtv.util::DTVSocket/dtv.util:DTVSocket::onData
 dtv.util::DTVSocket/dtv.util:DTVSocket::onSocketData


 Now notice in this second shorter trace the stack has been unwound up
 to the dispatchEvent, but no further.  onSocketData was just passed a
 second, new ProgressEvent.SOCKET_DATA.  It must be that
 EventDispatcher.dispatchEvent caught my setText's null pointer
 exception and dispatched some additional socket data to my
 ProgressEvent.SOCKET_DATA listener.  onSocketData is not thread safe.
   and bad stuff will happen very soon after in our code.

 dtv.util::DTVSocket/dtv.util:DTVSocket::onSocketData(WHOA! Not good)
 flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction
 [no source]
 flash.events::EventDispatcher/dispatchEvent [no source]
 dtv.util::DTVSocket/dtv.util:DTVSocket::dispatchOnConnectedEvent
 dtv.util::DTVSocket/dtv.util:DTVSocket::onReceivedSessionTicket
 Function/http://adobe.com/AS3/2006/builtin::call [no source]
 dtv.util::DTVSocket/dtv.util:DTVSocket::onJSON
 dtv.util::DTVSocket/dtv.util:DTVSocket::onData
 dtv.util::DTVSocket/dtv.util:DTVSocket::onSocketData


 So the deal is this: Beware of event listener entry-points being
 called in a reentrant fashion if your app is handling an exception.
 Kind of like someone hitting you when you're down, flash is asking for
 your app to do stuff when it's crippled.

 A solution is to wrap the guts of all entry points in try/catch
 handlers.  Or maybe only for high-frequency entry points.

 I looked thru these links for insight, perhaps hints indicating this
 kind of behavior but didn't find it:
 http://livedocs.macromedia.com/flex/2/docs/wwhelp/wwhimpl/js/html/wwhelp.htm?href=1890.html
 http://livedocs.macromedia.com/flex/2/langref/statements.html#try..catch..finally

 Happy November!
 Nick




 --
 Flexcoders Mailing List
 FAQ: http://groups.yahoo.com/group/flexcoders/files/flexcodersFAQ.txt
 Search Archives: http://www.mail-archive.com/flexcoders%40yahoogroups.com
 Yahoo! Groups Links







-- 
Ralf Bokelberg [EMAIL PROTECTED]
Flex  Flash Consultant 

[flexcoders] Bug in EventDispatcher? It shouldn't dispatch new Events if not at top of stack

2006-11-03 Thread ncr100
This is a complex one.  

Summary: 

I believe I'm not confused with try/catch, but am surprised that the
EventDispatcher assumes our code is reentrant.  Reentrant like the
EventDispatcher is dispatching a system Event in the middle of me
handling other events.  So we're vulnerable to reentrant callbacks
when we call EventDispatcher.dispatchEvent.

Details:

Normally when an null dereference happens an Error is propagated up
the call stack to a catch handler.

The bug is this: if in the middle of this call stack there happens to
be an EventDispatcher.dispatchEvent call and the null pointer happens
somewhere inside one of the listeners, then the Flash VM runtime
thingy / implementation of dispatchEvent() itself seems to catch 
handle the Error, and takes the opportunity to dispatch a pending
Events.  In my case I've seen a ProgressEvent.SOCKET_DATA being
dispatched because my server pumped out some data to me really
quickly, though I assume any pending Event could be dispatched.

This really causes havoc because our methods aren't reentrant; flash
isn't multithreaded afaik and we don't think we have to write
everything thread-safe.

Here's an illustration I will walk through.  At the start of the stack
our DTVSocket.onSocketConnect listens for an
ProgressEvent.SOCKET_DATA, and just got one.  Notice for now the
EventDispatcher [no source] in the middle of the stack trace.  Capping
off the stack trace, see our TextUtil.setText method ... it is doing
something bad, and has just triggered a null pointer exception!

dtv.util::TextUtil$/setText   (BANG!  null pointer exception)
MarbachViewer/MarbachViewer::createChannelCanvas
MarbachViewer/MarbachViewer::subscribeToChannel 
MarbachViewer/MarbachViewer::onConnected
flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction
[no source] 
flash.events::EventDispatcher/dispatchEvent [no source] 
dtv.util::DTVSocket/dtv.util:DTVSocket::dispatchOnConnectedEvent
dtv.util::DTVSocket/dtv.util:DTVSocket::onReceivedSessionTicket 
Function/http://adobe.com/AS3/2006/builtin::call [no source]
dtv.util::DTVSocket/dtv.util:DTVSocket::onJSON  
dtv.util::DTVSocket/dtv.util:DTVSocket::onData  
dtv.util::DTVSocket/dtv.util:DTVSocket::onSocketData


Now notice in this second shorter trace the stack has been unwound up
to the dispatchEvent, but no further.  onSocketData was just passed a
second, new ProgressEvent.SOCKET_DATA.  It must be that
EventDispatcher.dispatchEvent caught my setText's null pointer
exception and dispatched some additional socket data to my
ProgressEvent.SOCKET_DATA listener.  onSocketData is not thread safe.
  and bad stuff will happen very soon after in our code.

dtv.util::DTVSocket/dtv.util:DTVSocket::onSocketData(WHOA! Not good)
flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction
[no source] 
flash.events::EventDispatcher/dispatchEvent [no source] 
dtv.util::DTVSocket/dtv.util:DTVSocket::dispatchOnConnectedEvent
dtv.util::DTVSocket/dtv.util:DTVSocket::onReceivedSessionTicket 
Function/http://adobe.com/AS3/2006/builtin::call [no source]
dtv.util::DTVSocket/dtv.util:DTVSocket::onJSON  
dtv.util::DTVSocket/dtv.util:DTVSocket::onData  
dtv.util::DTVSocket/dtv.util:DTVSocket::onSocketData


So the deal is this: Beware of event listener entry-points being
called in a reentrant fashion if your app is handling an exception. 
Kind of like someone hitting you when you're down, flash is asking for
your app to do stuff when it's crippled.  

A solution is to wrap the guts of all entry points in try/catch
handlers.  Or maybe only for high-frequency entry points.

I looked thru these links for insight, perhaps hints indicating this
kind of behavior but didn't find it:
http://livedocs.macromedia.com/flex/2/docs/wwhelp/wwhimpl/js/html/wwhelp.htm?href=1890.html
http://livedocs.macromedia.com/flex/2/langref/statements.html#try..catch..finally

Happy November!
Nick




--
Flexcoders Mailing List
FAQ: http://groups.yahoo.com/group/flexcoders/files/flexcodersFAQ.txt
Search Archives: http://www.mail-archive.com/flexcoders%40yahoogroups.com 
Yahoo! Groups Links

* To visit your group on the web, go to:
http://groups.yahoo.com/group/flexcoders/

* Your email settings:
Individual Email | Traditional

* To change settings online go to:
http://groups.yahoo.com/group/flexcoders/join
(Yahoo! ID required)

* To change settings via email:
mailto:[EMAIL PROTECTED] 
mailto:[EMAIL PROTECTED]

* To unsubscribe from this group, send an email to:
[EMAIL PROTECTED]

* Your use of Yahoo! Groups is subject to:
http://docs.yahoo.com/info/terms/