summaryrefslogtreecommitdiff
path: root/indra/llwindow
diff options
context:
space:
mode:
authorAndrey Lihatskiy <alihatskiy@productengine.com>2024-10-12 11:55:27 +0300
committerAndrey Lihatskiy <alihatskiy@productengine.com>2024-10-12 11:55:27 +0300
commit1b19919eff1104f9f1ee97004420e91c45349e29 (patch)
treea0b7c8b06bf198f1a138c181d086d8c26d11ad72 /indra/llwindow
parent86bf599e2895b60c04fb688b9ad118c83e075be3 (diff)
parent18f23d9a559d3b5ed61d4fc4d3cfa9fa6c50689c (diff)
Merge commit '18f23d9a55' into marchcat/c-develop
# Conflicts: # indra/llwindow/llwindowwin32.cpp # indra/newview/llagent.cpp # indra/newview/llavatarrenderinfoaccountant.cpp # indra/newview/llcontrolavatar.cpp # indra/newview/llinspecttexture.cpp # indra/newview/llviewertexture.cpp # indra/newview/llviewerwindow.cpp # indra/newview/llvoavatar.cpp # indra/newview/llvoavatar.h # indra/newview/llvoavatarself.cpp # indra/newview/llvovolume.cpp
Diffstat (limited to 'indra/llwindow')
-rw-r--r--indra/llwindow/llwindowwin32.cpp60
1 files changed, 36 insertions, 24 deletions
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index f8294f063f..fb3363dad1 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -343,10 +343,9 @@ struct LLWindowWin32::LLWindowWin32Thread : public LL::ThreadPool
LLWindowWin32Thread();
void run() override;
- void close() override;
// closes queue, wakes thread, waits until thread closes
- void wakeAndDestroy();
+ bool wakeAndDestroy();
void glReady()
{
@@ -402,6 +401,7 @@ struct LLWindowWin32::LLWindowWin32Thread : public LL::ThreadPool
// *HACK: Attempt to prevent startup crashes by deferring memory accounting
// until after some graphics setup. See SL-20177. -Cosmic,2023-09-18
bool mGLReady = false;
+ bool mDeleteOnExit = false;
bool mGotGLBuffer = false;
};
@@ -975,7 +975,11 @@ void LLWindowWin32::close()
mhDC = NULL;
mWindowHandle = NULL;
- mWindowThread->wakeAndDestroy();
+ if (mWindowThread->wakeAndDestroy())
+ {
+ // thread will delete itselfs once done
+ mWindowThread = NULL;
+ }
}
bool LLWindowWin32::isValid()
@@ -3095,10 +3099,17 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
break;
}
}
- else
+ else // (NULL == window_imp)
{
- // (NULL == window_imp)
- LL_DEBUGS("Window") << "No window implementation to handle message with, message code: " << U32(u_msg) << LL_ENDL;
+ if (u_msg == WM_DESTROY)
+ {
+ PostQuitMessage(0); // Posts WM_QUIT with an exit code of 0
+ return 0;
+ }
+ else
+ {
+ LL_DEBUGS("Window") << "No window implementation to handle message with, message code: " << U32(u_msg) << LL_ENDL;
+ }
}
// pass unhandled messages down to Windows
@@ -4569,25 +4580,11 @@ std::vector<std::string> LLWindowWin32::getDynamicFallbackFontList()
#endif // LL_WINDOWS
inline LLWindowWin32::LLWindowWin32Thread::LLWindowWin32Thread()
- : LL::ThreadPool("Window Thread", 1, MAX_QUEUE_SIZE, true /*should be false, temporary workaround for SL-18721*/)
+ : LL::ThreadPool("Window Thread", 1, MAX_QUEUE_SIZE, false)
{
LL::ThreadPool::start();
}
-void LLWindowWin32::LLWindowWin32Thread::close()
-{
- if (!mQueue->isClosed())
- {
- LL_WARNS() << "Closing window thread without using destroy_window_handler" << LL_ENDL;
- LL::ThreadPool::close();
-
- // Workaround for SL-18721 in case window closes too early and abruptly
- LLSplashScreen::show();
- LLSplashScreen::update("..."); // will be updated later
- }
-}
-
-
/**
* LogChange is to log changes in status while trying to avoid spamming the
* log with repeated messages, especially in a tight loop. It refuses to log
@@ -4785,14 +4782,19 @@ void LLWindowWin32::LLWindowWin32Thread::run()
}
#endif
}
+
+ if (mDeleteOnExit)
+ {
+ delete this;
+ }
}
-void LLWindowWin32::LLWindowWin32Thread::wakeAndDestroy()
+bool LLWindowWin32::LLWindowWin32Thread::wakeAndDestroy()
{
if (mQueue->isClosed())
{
- LL_WARNS() << "Tried to close Queue. Win32 thread Queue already closed." << LL_ENDL;
- return;
+ LL_WARNS() << "Tried to close Queue. Win32 thread Queue already closed." <<LL_ENDL;
+ return false;
}
// Make sure we don't leave a blank toolbar button.
@@ -4831,6 +4833,15 @@ void LLWindowWin32::LLWindowWin32Thread::wakeAndDestroy()
mGLReady = false;
});
+ mDeleteOnExit = true;
+ SetWindowLongPtr(old_handle, GWLP_USERDATA, NULL);
+
+ // Let thread finish on its own and don't block main thread.
+ for (auto& pair : mThreads)
+ {
+ pair.second.detach();
+ }
+
LL_DEBUGS("Window") << "Closing window's pool queue" << LL_ENDL;
mQueue->close();
@@ -4887,6 +4898,7 @@ void LLWindowWin32::LLWindowWin32Thread::wakeAndDestroy()
}
}
LL_DEBUGS("Window") << "thread pool shutdown complete" << LL_ENDL;
+ return true;
}
void LLWindowWin32::post(const std::function<void()>& func)