--- In [email protected], "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::dispatchEven\ tFunction > [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::dispatchEven\ tFunction > [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=00001890.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/

