summaryrefslogtreecommitdiff
path: root/embeddedobj
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2024-09-04 14:38:23 +0500
committerMichael Stahl <michael.stahl@allotropia.de>2024-09-10 11:32:09 +0200
commit084b70defbdeee0b12f7cb6daadcd3fc6d225d60 (patch)
treef990ef5cfcff7825424c704596e61e7ac4f3db94 /embeddedobj
parent439a73bb23d10a797212a380899577cd13ba69fb (diff)
Avoid deadlock
Seen when running an external Java code, with these call stacks: Main thread: win32u.dll!NtUserMsgWaitForMultipleObjectsEx() sal3.dll!osl_waitCondition(void * Condition, const TimeValue * pTimeout) [Inline Frame] vclplug_winlo.dll!osl::Condition::wait(const TimeValue *) vclplug_winlo.dll!SalYieldMutex::doAcquire(unsigned long nLockCount) [Inline Frame] emboleobj.dll!SolarMutexReleaser::{dtor}() emboleobj.dll!OleComponent::getTransferData(const com::sun::star::datatransfer::DataFlavor & aFlavor) emboleobj.dll!OleEmbeddedObject::getPreferredVisualRepresentation(__int64 nAspect) comphelper.dll!comphelper::EmbeddedObjectContainer::GetGraphicReplacementStream(__int64 nViewAspect, const com::sun::star::uno::Reference<com::sun::star::embed::XEmbeddedObject> & xObj, rtl::OUString * pMediaType) [Inline Frame] svtlo.dll!svt::EmbeddedObjectRef::GetGraphicReplacementStream(__int64) svtlo.dll!svt::EmbeddedObjectRef::GetGraphicStream(bool bUpdate) svtlo.dll!svt::EmbeddedObjectRef::GetReplacement(bool bUpdate) svtlo.dll!svt::EmbeddedObjectRef::UpdateReplacement(bool bUpdateOle) swlo.dll!SwWrtShell::CalcAndSetScale(svt::EmbeddedObjectRef & xObj, const SwRect * pFlyPrtRect, const SwRect * pFlyFrameRect, const bool bNoTextFramePrtAreaChanged) swlo.dll!SwContentNotify::ImplDestroy() swlo.dll!SwContentNotify::~SwContentNotify() swlo.dll!SwNoTextFrame::MakeAll(OutputDevice * pRenderContext) swlo.dll!SwFrame::OptPrepareMake() [Inline Frame] swlo.dll!SwFrame::OptCalc() swlo.dll!SwLayAction::FormatContent_(const SwContentFrame * pContent, const SwPageFrame * pPage) swlo.dll!SwLayAction::FormatFlyContent(const SwFlyFrame * pFly) swlo.dll!SwObjectFormatter::FormatObj_(SwAnchoredObject & _rAnchoredObj) swlo.dll!SwObjectFormatterTextFrame::DoFormatObj(SwAnchoredObject & _rAnchoredObj, const bool _bCheckForMovedFwd) swlo.dll!SwObjectFormatter::FormatObjsAtFrame_(SwTextFrame * _pMasterTextFrame) swlo.dll!SwObjectFormatterTextFrame::DoFormatObjs() swlo.dll!SwObjectFormatter::FormatObjsAtFrame(SwFrame & _rAnchorFrame, const SwPageFrame & _rPageFrame, SwLayAction * _pLayAction) swlo.dll!SwLayAction::FormatContent(SwPageFrame * pPage) swlo.dll!SwLayAction::InternalAction(OutputDevice * pRenderContext) [Inline Frame] swlo.dll!SwLayAction::Action(OutputDevice * pRenderContext) swlo.dll!SwLayIdle::SwLayIdle(SwRootFrame * pRt, SwViewShellImp * pI) swlo.dll!SwViewShell::LayoutIdle() swlo.dll!sw::DocumentTimerManager::DoIdleJobs(Timer * __formal) vcllo.dll!Scheduler::CallbackTaskScheduling() vclplug_winlo.dll!WinSalTimer::ImplHandleElapsedTimer() vclplug_winlo.dll!ImplSalYield(bool bWait, bool bHandleAllCurrentEvents) vclplug_winlo.dll!WinSalInstance::DoYield(bool bWait, bool bHandleAllCurrentEvents) vcllo.dll!ImplYield(bool i_bWait, bool i_bAllEvents) vcllo.dll!Application::Execute() sofficeapp.dll!desktop::Desktop::Main() vcllo.dll!ImplSVMain() sofficeapp.dll!soffice_main() [Inline Frame] soffice.bin!sal_main() soffice.bin!main(int argc, char * * argv) [Inline Frame] soffice.bin!invoke_main() soffice.bin!__scrt_common_main_seh() kernel32.dll!BaseThreadInitThunk() ntdll.dll!RtlUserThreadStart() Request thread: ntdll.dll!NtWaitForAlertByThreadId() ntdll.dll!RtlpWaitOnCriticalSection() ntdll.dll!RtlpEnterCriticalSectionContended() ntdll.dll!RtlEnterCriticalSection() sal3.dll!osl_acquireMutex(_oslMutexImpl * Mutex) [Inline Frame] emboleobj.dll!osl::Mutex::acquire() [Inline Frame] emboleobj.dll!osl::Guard<osl::Mutex>::{ctor}(osl::Mutex &) emboleobj.dll!OleComponent::addModifyListener(const com::sun::star::uno::Reference<com::sun::star::util::XModifyListener> & xListener) svtlo.dll!svt::`anonymous namespace'::EmbedEventListener_Impl::Create(svt::EmbeddedObjectRef * p) svtlo.dll!svt::EmbeddedObjectRef::EmbeddedObjectRef(const com::sun::star::uno::Reference<com::sun::star::embed::XEmbeddedObject> & xObj, __int64 nAspect) swlo.dll!SwXFrame::getPropertyValue(const rtl::OUString & rPropertyName) mscx_uno.dll!`anonymous namespace'::cpp_call(bridges::cpp_uno::shared::UnoInterfaceProxy * pThis, bridges::cpp_uno::shared::VtableSlot aVtableSlot, _typelib_TypeDescriptionReference * pReturnTypeRef, long nParams, _typelib_MethodParameter * pParams, void * pUnoReturn, void * * pUnoArgs, _uno_Any * * ppUnoExc) mscx_uno.dll!unoInterfaceProxyDispatch(_uno_Interface * pUnoI, const _typelib_TypeDescription * pMemberTD, void * pReturn, void * * pArgs, _uno_Any * * ppException) binaryurplo.dll!binaryurp::IncomingRequest::execute_throw(binaryurp::BinaryAny * returnValue, std::vector<binaryurp::BinaryAny,std::allocator<binaryurp::BinaryAny>> * outArguments) binaryurplo.dll!binaryurp::IncomingRequest::execute() binaryurplo.dll!request(void * pThreadSpecificData) cppu3.dll!cppu_threadpool::JobQueue::enter(const void * nDisposeId, bool bReturnWhenNoJob) cppu3.dll!cppu_threadpool::ORequestThread::run() cppu3.dll!threadFunc(void * param) sal3.dll!oslWorkerWrapperFunction(void * pData) ucrtbase.dll!thread_start<unsigned int (__cdecl*)(void *),1>() kernel32.dll!BaseThreadInitThunk() ntdll.dll!RtlUserThreadStart() Change-Id: I54d3fd91d8bbf4f52eee2f498c91e06ebc82d836 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172864 Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com> Tested-by: Jenkins (cherry picked from commit 47d8d0cbe73ae4050b3264a465efa695dc621bf2) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172886 Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
Diffstat (limited to 'embeddedobj')
-rw-r--r--embeddedobj/source/msole/olecomponent.cxx3
1 files changed, 2 insertions, 1 deletions
diff --git a/embeddedobj/source/msole/olecomponent.cxx b/embeddedobj/source/msole/olecomponent.cxx
index b9c1c27827bb..dc6ddcdc73a5 100644
--- a/embeddedobj/source/msole/olecomponent.cxx
+++ b/embeddedobj/source/msole/olecomponent.cxx
@@ -1541,7 +1541,7 @@ void SAL_CALL OleComponent::removeCloseListener( const uno::Reference< util::XCl
uno::Any SAL_CALL OleComponent::getTransferData( const datatransfer::DataFlavor& aFlavor )
{
- ::osl::MutexGuard aGuard( m_aMutex );
+ ::osl::ResettableMutexGuard aGuard( m_aMutex );
if ( m_bDisposed )
throw lang::DisposedException(); // TODO
@@ -1585,6 +1585,7 @@ uno::Any SAL_CALL OleComponent::getTransferData( const datatransfer::DataFlavor&
HRESULT hr;
{
+ osl::ResettableMutexGuardScopedReleaser own_releaser(aGuard);
SolarMutexReleaser releaser;
hr = pDataObject->GetData(&aFormat, &aMedium);
}