diff options
Diffstat (limited to 'indra/llcommon')
| -rw-r--r-- | indra/llcommon/llcoros.cpp | 36 | ||||
| -rw-r--r-- | indra/llcommon/llcoros.h | 27 | 
2 files changed, 9 insertions, 54 deletions
| diff --git a/indra/llcommon/llcoros.cpp b/indra/llcommon/llcoros.cpp index ab56a3d3b7..b16f166d28 100644 --- a/indra/llcommon/llcoros.cpp +++ b/indra/llcommon/llcoros.cpp @@ -228,22 +228,6 @@ std::string LLCoros::logname()      return data.mName.empty()? data.getKey() : data.mName;  } -void LLCoros::saveException(const std::string& name, std::exception_ptr exc) -{ -    mExceptionQueue.emplace(name, exc); -} - -void LLCoros::rethrow() -{ -    if (! mExceptionQueue.empty()) -    { -        ExceptionData front = mExceptionQueue.front(); -        mExceptionQueue.pop(); -        LL_WARNS("LLCoros") << "Rethrowing exception from coroutine " << front.name << LL_ENDL; -        std::rethrow_exception(front.exception); -    } -} -  void LLCoros::setStackSize(S32 stacksize)  {      LL_DEBUGS("LLCoros") << "Setting coroutine stack size to " << stacksize << LL_ENDL; @@ -312,14 +296,19 @@ static const U32 STATUS_MSC_EXCEPTION = 0xE06D7363; // compiler specific  U32 exception_filter(U32 code, struct _EXCEPTION_POINTERS* exception_infop)  { -    if (code == STATUS_MSC_EXCEPTION) +    if (LLApp::instance()->reportCrashToBugsplat((void*)exception_infop)) +    { +        // Handled +        return EXCEPTION_CONTINUE_SEARCH; +    } +    else if (code == STATUS_MSC_EXCEPTION)      {          // C++ exception, go on          return EXCEPTION_CONTINUE_SEARCH;      } -    else if (!LLApp::instance()->reportCrashToBugsplat((void*)exception_infop)) +    else      { -        // handle it +        // handle it, convert to std::exception          return EXCEPTION_EXECUTE_HANDLER;      } @@ -381,14 +370,7 @@ void LLCoros::toplevel(std::string name, callable_t callable)          // viewer will carry on.          LOG_UNHANDLED_EXCEPTION(STRINGIZE("coroutine " << name));      } -    catch (...) -    { -        // Stash any OTHER kind of uncaught exception in the rethrow() queue -        // to be rethrown by the main fiber. -        LL_WARNS("LLCoros") << "Capturing uncaught exception in coroutine " -                            << name << LL_ENDL; -        LLCoros::instance().saveException(name, std::current_exception()); -    } +    // uncaught exception by default will cause std::terminate()  }  //static diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h index c3820ae987..913414fbc1 100644 --- a/indra/llcommon/llcoros.h +++ b/indra/llcommon/llcoros.h @@ -171,19 +171,6 @@ public:      static std::string getName();      /** -     * rethrow() is called by the thread's main fiber to propagate an -     * exception from any coroutine into the main fiber, where it can engage -     * the normal unhandled-exception machinery, up to and including crash -     * reporting. -     * -     * LLCoros maintains a queue of otherwise-uncaught exceptions from -     * terminated coroutines. Each call to rethrow() pops the first of those -     * and rethrows it. When the queue is empty (normal case), rethrow() is a -     * no-op. -     */ -    void rethrow(); - -    /**       * This variation returns a name suitable for log messages: the explicit       * name for an explicitly-launched coroutine, or "mainN" for the default       * coroutine on a thread. @@ -327,20 +314,6 @@ private:      void toplevel(std::string name, callable_t callable);      struct CoroData;      static CoroData& get_CoroData(const std::string& caller); -    void saveException(const std::string& name, std::exception_ptr exc); - -    struct ExceptionData -    { -        ExceptionData(const std::string& nm, std::exception_ptr exc): -            name(nm), -            exception(exc) -        {} -        // name of coroutine that originally threw this exception -        std::string name; -        // the thrown exception -        std::exception_ptr exception; -    }; -    std::queue<ExceptionData> mExceptionQueue;      S32 mStackSize; | 
