tdf#122927 prevent SolarMutex deadlock on join()
The AsyncRequests thread can be blocked in a SolarMutexGuard, so we have to release the mutex before calling join(). But there is also a static AsyncRequests object inside the VistaFilePickerEventHandler::impl_sendEvent function, which will just be cleaned up at DLL atexit. "Luckily" it won't ever run, so it doesn't need to be joined and we can use isRunning to detect it, prevent releasing a non- existing SolarMutex at this point and so won't crash LO on exit. Change-Id: I0c56b89a11f96be54e82b756c5e18a058b04a41d Reviewed-on: https://gerrit.libreoffice.org/66901 Tested-by: Jenkins Reviewed-by: Jan-Marek Glogowski <glogow@fbihome.de>
This commit is contained in:
@@ -289,6 +289,7 @@ public:
|
||||
void VistaFilePickerEventHandler::impl_sendEvent( EEventType eEventType,
|
||||
::sal_Int16 nControlID)
|
||||
{
|
||||
// See special handling in ~AsyncRequests for this static
|
||||
static AsyncRequests aNotify(RequestHandlerRef(new AsyncPickerEvents()));
|
||||
|
||||
::cppu::OInterfaceContainerHelper* pContainer = m_lListener.getContainer( cppu::UnoType<css::ui::dialogs::XFilePickerListener>::get());
|
||||
|
@@ -75,7 +75,14 @@ AsyncRequests::~AsyncRequests()
|
||||
aLock.clear();
|
||||
// <- SYNCHRONIZED
|
||||
|
||||
join();
|
||||
// The static AsyncRequests aNotify in VistaFilePickerEventHandler::impl_sendEvent
|
||||
// is destructed at DLL atexit. But it won't run, so needs no join and release of
|
||||
// the already destructed SolarMutex, which would crash LO on exit.
|
||||
if (isRunning())
|
||||
{
|
||||
SolarMutexReleaser aReleaser;
|
||||
join();
|
||||
}
|
||||
}
|
||||
|
||||
void AsyncRequests::triggerJobExecution()
|
||||
|
Reference in New Issue
Block a user