diff options
author | Jan-Marek Glogowski <glogow@fbihome.de> | 2017-08-28 19:58:32 +0200 |
---|---|---|
committer | Jan-Marek Glogowski <glogow@fbihome.de> | 2017-09-26 09:42:11 +0200 |
commit | 4baec725e0dc0713f0d47003e9b10bc3b62f56ff (patch) | |
tree | 72f21c28416068e46133964e420ca094af8b7587 /vcl/win/window | |
parent | f633dcdfc0ad7a13d096d97b6753b55e8f8a3f07 (diff) |
WIN run main thread redirects ignoring SolarMutex
This way we can drop all the special nReleased handling. Instead
we use the same mechanism as on Mac, where we keep the lock, but
disable it for the main thread. As a security measure we assert on
duplicate redirects, which should not happen.
As a result we can't use SendMessage on the main thread itself,
which would normally just call the WinProc directly. This could be
accomplished by converting the redirect bool into a counter, which
should be safe, as no other thread could acquire the SolarMutex,
as we don't release it.
Change-Id: Icd87b3da37a2489f3cad2bc80215bf93fc41d388
Reviewed-on: https://gerrit.libreoffice.org/42583
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Jan-Marek Glogowski <glogow@fbihome.de>
Diffstat (limited to 'vcl/win/window')
-rw-r--r-- | vcl/win/window/salframe.cxx | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/vcl/win/window/salframe.cxx b/vcl/win/window/salframe.cxx index e2c444a3e182..8a9c6066c461 100644 --- a/vcl/win/window/salframe.cxx +++ b/vcl/win/window/salframe.cxx @@ -1054,10 +1054,15 @@ void WinSalFrame::ReleaseGraphics( SalGraphics* pGraphics ) if ( mpGraphics2->getDefPal() ) SelectPalette( mpGraphics2->getHDC(), mpGraphics2->getDefPal(), TRUE ); mpGraphics2->DeInitGraphics(); - SendMessageW( pSalData->mpFirstInstance->mhComWnd, - SAL_MSG_RELEASEDC, - reinterpret_cast<WPARAM>(mhWnd), - reinterpret_cast<LPARAM>(mpGraphics2->getHDC()) ); + // we don't want to run the WinProc in the main thread directly + // so we don't hit the mbNoYieldLock assert + if ( !pSalData->mpFirstInstance->IsMainThread() ) + SendMessageW( pSalData->mpFirstInstance->mhComWnd, + SAL_MSG_RELEASEDC, + reinterpret_cast<WPARAM>(mhWnd), + reinterpret_cast<LPARAM>(mpGraphics2->getHDC()) ); + else + ReleaseDC( mhWnd, mpGraphics2->getHDC() ); mpGraphics2->setHDC(nullptr); pSalData->mnCacheDCInUse--; } |