diff options
| author | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2025-02-24 22:43:31 +0200 | 
|---|---|---|
| committer | Andrey Kleshchev <117672381+akleshchev@users.noreply.github.com> | 2025-02-25 22:10:08 +0200 | 
| commit | 056dc00ebe07ba5994a51c7b4eb38d887d4b9355 (patch) | |
| tree | 4e1fcdd3ad820048557d0eaeeeb158cbf7613ac2 | |
| parent | 42e219fb0433e92b51dfbc8daad06044f41fa4c4 (diff) | |
#3591 More test coverage for crashes
| -rw-r--r-- | indra/newview/llappviewer.cpp | 21 | ||||
| -rw-r--r-- | indra/newview/llappviewer.h | 2 | ||||
| -rw-r--r-- | indra/newview/llviewermenu.cpp | 32 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/menu_viewer.xml | 14 | 
4 files changed, 68 insertions, 1 deletions
| diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 6d10d3413b..973cdd53a0 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -5611,6 +5611,27 @@ void LLAppViewer::forceErrorCoroutineCrash()      LLCoros::instance().launch("LLAppViewer::crashyCoro", [] {throw LLException("A deliberate crash from LLCoros"); });  } +void LLAppViewer::forceErrorCoroprocedureCrash() +{ +    LL_WARNS() << "Forcing a crash in LLCoprocedureManager" << LL_ENDL; +    LLCoprocedureManager::instance().enqueueCoprocedure("Upload", "DeliberateCrash", +        [](LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t&, const LLUUID&) +    { +        LL_WARNS() << "Forcing a deliberate bad memory access from LLCoprocedureManager" << LL_ENDL; +        S32* crash = NULL; +        *crash = 0xDEADBEEF; +    }); +} + +void LLAppViewer::forceErrorWorkQueueCrash() +{ +    LL::WorkQueue::ptr_t workqueue = LL::WorkQueue::getInstance("General"); +    if (workqueue) +    { +        workqueue->post([]() { throw LLException("This is a deliberate crash from General Queue"); }); +    } +} +  void LLAppViewer::forceErrorThreadCrash()  {      class LLCrashTestThread : public LLThread diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index b4756eecd6..542379c828 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -175,6 +175,8 @@ public:      virtual void forceErrorOSSpecificException();      virtual void forceErrorDriverCrash();      virtual void forceErrorCoroutineCrash(); +    virtual void forceErrorCoroprocedureCrash(); +    virtual void forceErrorWorkQueueCrash();      virtual void forceErrorThreadCrash();      // The list is found in app_settings/settings_files.xml diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index d92faf4d1b..6281ac1f9e 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -286,6 +286,8 @@ void force_error_software_exception();  void force_error_os_exception();  void force_error_driver_crash();  void force_error_coroutine_crash(); +void force_error_coroprocedure_crash(); +void force_error_work_queue_crash();  void force_error_thread_crash();  void handle_force_delete(); @@ -2634,6 +2636,24 @@ class LLAdvancedForceErrorCoroutineCrash : public view_listener_t      }  }; +class LLAdvancedForceErrorCoroprocedureCrash : public view_listener_t +{ +    bool handleEvent(const LLSD& userdata) +    { +        force_error_coroprocedure_crash(); +        return true; +    } +}; + +class LLAdvancedForceErrorWorkQueueCrash : public view_listener_t +{ +    bool handleEvent(const LLSD& userdata) +    { +        force_error_work_queue_crash(); +        return true; +    } +}; +  class LLAdvancedForceErrorThreadCrash : public view_listener_t  {      bool handleEvent(const LLSD& userdata) @@ -8657,6 +8677,16 @@ void force_error_coroutine_crash()      LLAppViewer::instance()->forceErrorCoroutineCrash();  } +void force_error_coroprocedure_crash() +{ +    LLAppViewer::instance()->forceErrorCoroprocedureCrash(); +} + +void force_error_work_queue_crash() +{ +    LLAppViewer::instance()->forceErrorWorkQueueCrash(); +} +  void force_error_thread_crash()  {      LLAppViewer::instance()->forceErrorThreadCrash(); @@ -9861,6 +9891,8 @@ void initialize_menus()      view_listener_t::addMenu(new LLAdvancedForceErrorSoftwareExceptionCoro(), "Advanced.ForceErrorSoftwareExceptionCoro");      view_listener_t::addMenu(new LLAdvancedForceErrorDriverCrash(), "Advanced.ForceErrorDriverCrash");      view_listener_t::addMenu(new LLAdvancedForceErrorCoroutineCrash(), "Advanced.ForceErrorCoroutineCrash"); +    view_listener_t::addMenu(new LLAdvancedForceErrorCoroprocedureCrash(), "Advanced.ForceErrorCoroprocedureCrash"); +    view_listener_t::addMenu(new LLAdvancedForceErrorWorkQueueCrash(), "Advanced.ForceErrorWorkQueueCrash");      view_listener_t::addMenu(new LLAdvancedForceErrorThreadCrash(), "Advanced.ForceErrorThreadCrash");      view_listener_t::addMenu(new LLAdvancedForceErrorDisconnectViewer(), "Advanced.ForceErrorDisconnectViewer"); diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 0e70e75c0b..349c8d0e20 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -2788,7 +2788,7 @@ function="World.EnvPreset"                   function="Advanced.ForceErrorOSException" />                  <menu_item_call.on_visible                   function="Advanced.EnableErrorOSException" /> -            </menu_item_call>             +            </menu_item_call>              <menu_item_call               label="Force a Crash in a Coroutine"               name="Force a Crash in a Coroutine"> @@ -2796,6 +2796,18 @@ function="World.EnvPreset"                   function="Advanced.ForceErrorCoroutineCrash" />              </menu_item_call>              <menu_item_call +             label="Force a Crash in a Coroprocedure" +             name="Force a Crash in a Coroprocedure"> +                <menu_item_call.on_click +                 function="Advanced.ForceErrorCoroprocedureCrash" /> +            </menu_item_call> +            <menu_item_call +             label="Force a Crash in a Work Queue" +             name="Force a Crash in a Work Queue"> +                <menu_item_call.on_click +                 function="Advanced.ForceErrorWorkQueueCrash" /> +            </menu_item_call> +            <menu_item_call               label="Force a Crash in a Thread"               name="Force a Crash in a Thread">                  <menu_item_call.on_click | 
