summaryrefslogtreecommitdiff
path: root/indra/llwindow
diff options
context:
space:
mode:
authorNat Goodspeed <nat@lindenlab.com>2021-11-23 20:48:44 -0500
committerNat Goodspeed <nat@lindenlab.com>2021-11-23 20:48:44 -0500
commit67ace0df9953ce3264048c3946720a9df492edfa (patch)
treeddc205f7b79109c306a328e912c270968f675439 /indra/llwindow
parent2b96f89c2a374d72c0a8bc28a7b06ad4db7eae6e (diff)
SL-16400: Address a couple shutdown crashes.
It can happen that we try to post() work for LLWindowWin32's window thread after the thread's WorkQueue has been closed. Also, instead of giving the "General" ThreadPool static lifespan, put it on the heap, anchored with a static unique_ptr.
Diffstat (limited to 'indra/llwindow')
-rw-r--r--indra/llwindow/llwindowwin32.cpp10
1 files changed, 9 insertions, 1 deletions
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index af7b8d91f0..7f8f88a749 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -351,7 +351,15 @@ struct LLWindowWin32::LLWindowWin32Thread : public LL::ThreadPool
template <typename CALLABLE>
void post(CALLABLE&& func)
{
- getQueue().post(std::forward<CALLABLE>(func));
+ try
+ {
+ getQueue().post(std::forward<CALLABLE>(func));
+ }
+ catch (const LLThreadSafeQueueInterrupt&)
+ {
+ // Shutdown timing is tricky. The main thread can end up trying
+ // to post a cursor position after having closed the WorkQueue.
+ }
}
/**