DRTVWR-476: Infrastructure to help manage long-lived coroutines.
Introduce LLCoros::Stop exception, with subclasses Stopping, Stopped and Shutdown. Add LLCoros::checkStop(), intended to be called periodically by any coroutine with nontrivial lifespan. It checks the LLApp status and, unless isRunning(), throws one of these new exceptions. Make LLCoros::toplevel() catch Stop specially and log forcible coroutine termination. Now that LLApp status matters even in a test program, introduce a trivial LLTestApp subclass whose sole function is to make isRunning() true. (LLApp::setStatus() is protected: only a subclass can call it.) Add LLTestApp instances to lleventcoro_test.cpp and lllogin_test.cpp. Make LLCoros::toplevel() accept parameters by value rather than by const reference so we can continue using them even after context switches. Make private LLCoros::get_CoroData() static. Given that we've observed some coroutines living past LLCoros destruction, making the caller call LLCoros::instance() is more dangerous than encapsulating it within a static method -- since the encapsulated call can check LLCoros::wasDeleted() first and do something reasonable instead. This also eliminates the need for both a const and non-const overload. Defend LLCoros::delete_CoroData() (cleanup function for fiber_specific_ptr for CoroData, implicitly called after coroutine termination) against calls after ~LLCoros(). Add a status string to coroutine-local data, with LLCoro::setStatus(), getStatus() and RAII class TempStatus. Add an optional 'when' string argument to LLCoros::printActiveCoroutines(). Make ~LLCoros() print the coroutines still active at destruction.
Showing
- indra/llcommon/llcoros.cpp 82 additions, 23 deletionsindra/llcommon/llcoros.cpp
- indra/llcommon/llcoros.h 61 additions, 5 deletionsindra/llcommon/llcoros.h
- indra/llcommon/tests/lleventcoro_test.cpp 2 additions, 0 deletionsindra/llcommon/tests/lleventcoro_test.cpp
- indra/test/lltestapp.h 34 additions, 0 deletionsindra/test/lltestapp.h
- indra/viewer_components/login/tests/lllogin_test.cpp 2 additions, 0 deletionsindra/viewer_components/login/tests/lllogin_test.cpp
Loading
Please register or sign in to comment