OK, I've modified my application to use wApp->bind() as shown below.

Unfortunately, if a session dies, my application still crashes, as before:
==================
terminate called after throwing an instance of 'Wt::WException'
  what():  doRecursiveEventLoop(): session was killed

#5  0x00b3a183 in std::terminate() () from /usr/lib/libstdc++.so.6
#6  0x00b3a2c2 in __cxa_throw () from /usr/lib/libstdc++.so.6
#7  0x01767af8 in Wt::WebSession::doRecursiveEventLoop (
    this=0xb5e3f850)
    at /usr/local/src/wt-3.2.3/src/web/WebSession.C:1051
#8  0x0143a7da in Wt::WDialog::exec (this=0x87fedb8, 
    animation=...) at /usr/local/src/wt-3.2.3/src/Wt/WDialog.C:292
#9  0x08125562 in Login_GUI::confirm (this=0x87fed48, 
    message=..., info=..., id=..., passwd=..., name=..., 
    location=..., comment=...) at src/view/Login_GUI.cpp:75
#10 0x0816e002 in UIServer::showLogin (this=0x876aeb8, 
    message=..., info=...) at src/view/UIServer.cpp:716
#11 0x0816f107 in UIServer::processStatusEvent (this=0x876aeb8, 
    event=...) at src/view/UIServer.cpp:920
#12 0x0816f01c in UIServer::notifyStatusEvent (this=0x876aeb8)
    at src/view/UIServer.cpp:913
#13 0x08150537 in boost::_mfi::mf0<void, UIServer>::operator() (
    this=0x87fed10, p=0x876aeb8)
======================
Although the session was killed, the WServer::post() call still invokes the 
callback, which eventually tries to post a WDialog.   
Wt::WebSession::doRecursiveEventLoop sees the session is dead, and throws an 
error.

What I don't understand is how this could happen.  WServer::post() schedules a 
call to 
WebController::handleApplicationEvent(), which checks whether the session 
corresponding to sessionID is alive before it invokes the session's callback.


On Nov 13, 2012, at 9:30 AM, Joseph VanAndel <vanan...@ucar.edu> wrote:

> Yes, although the logic is more complex, I can have the bound function 
> callback into the shared object to retrieve the data that I wanted to pass to 
> the bound function.
> 
> For my application, I have a UIServer object (1 per session) and a 
> StatusServer (singleton), which relays status messages between sessions.
> UIServer ctor calls
> StatusServer::connect( this, 
>     wApp->bind( boost::bind( &UIServer::notifyStatusEvent, this) )) 
> 
> StatusServer::postStatusEvent() will save a copy of the event in a 
> per-session queue.
> and  calls WServer::post(sessionid, callback), which indirectly calls
> UIServer::notifyStatusEvent()
> 
> UIServer::notifyStatusEvent() calls 
> StatusServer::getEvent() to retrieve the event, and call
> UIServer::processStatusEvent() to handle the StatusEvent.
> 
> 
> It would be quite helpful if <Wt_src>/examples/simplechat used 
> WApplication::bind().  
> 
> I appreciate any examples, but examples that correctly handle real-world 
> situations, like browser sessions being closed are MUCH more useful.  As far 
> as I can tell, because simplechat doesn't use WApplication::bind(), it may 
> not safely handle browser sessions that are closed. 
> 
> If I get the chance, I'll submit a rewritten simplechat example that uses 
> WApplication::bind(), but as they say "It won't be pretty!"
> 
> 
> On Nov 13, 2012, at 4:44 AM, Koen Deforche wrote:
> 
>> Hey Joseph, Rob,
>> 
>> I guess you are both indicating a limitation: WApplication::bind()
>> essentially returns a function without arguments, and thus all
>> arguments already have to be bound before the call, which makes it
>> useless when you want to pass on information from the external source.
>> 
>> As a workaround, perhaps you can rather than 'push' new information,
>> make the bound function 'poll' the information from the shared object
>> ?
>> 
>> I believe it should be possible to make WApplication::bind() work
>> properly with any kind of function, including functions with free
>> parameters -- although that requires a bit of digging into the
>> meta-function possiblities of boost-ified c++...
>> 
>> In any case, using WApplication::bind() later on is not very useful --
>> it needs to happen with the session lock and with the objects bound
>> guaranteed to be alive at the moment of calling WApplication::bind().
>> 
>> Regards,
>> koen
>> 
>> ------------------------------------------------------------------------------
>> Monitor your physical, virtual and cloud infrastructure from a single
>> web console. Get in-depth insight into apps, servers, databases, vmware,
>> SAP, cloud infrastructure, etc. Download 30-day Free Trial.
>> Pricing starts from $795 for 25 servers or applications!
>> http://p.sf.net/sfu/zoho_dev2dev_nov
>> _______________________________________________
>> witty-interest mailing list
>> witty-interest@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/witty-interest
> 
> 
> ------------------------------------------------------------------------------
> Monitor your physical, virtual and cloud infrastructure from a single
> web console. Get in-depth insight into apps, servers, databases, vmware,
> SAP, cloud infrastructure, etc. Download 30-day Free Trial.
> Pricing starts from $795 for 25 servers or applications!
> http://p.sf.net/sfu/zoho_dev2dev_nov
> _______________________________________________
> witty-interest mailing list
> witty-interest@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/witty-interest


------------------------------------------------------------------------------
Monitor your physical, virtual and cloud infrastructure from a single
web console. Get in-depth insight into apps, servers, databases, vmware,
SAP, cloud infrastructure, etc. Download 30-day Free Trial.
Pricing starts from $795 for 25 servers or applications!
http://p.sf.net/sfu/zoho_dev2dev_nov
_______________________________________________
witty-interest mailing list
witty-interest@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/witty-interest

Reply via email to