diff --git a/bnc-954345.diff b/bnc-954345.diff new file mode 100644 index 0000000..ed07ecc --- /dev/null +++ b/bnc-954345.diff @@ -0,0 +1,156 @@ +From 611be3d78d45c46c942b88e1149dfc428070fc71 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?L=C3=A1szl=C3=B3=20N=C3=A9meth?= + +Date: Fri, 27 Nov 2015 21:59:30 +0100 +Subject: [PATCH] tdf#95614 fix freezing with linked graphic + +When an unloaded linked picture comes into the visible view +(including repainting a page), SwNoTextFrm::PaintPicture() +starts a thread to load it in the background using the +TriggerAsyncRetrieveInputStream() method of the graphic node. + +To avoid to start a second thread on the same graphic node, +TriggerAsyncRetrieveInputStream() checks mpThreadConsumer, +the graphic node member variable for the possible thread object. + +The problem is that when the thread finished and +SwGrfNode::UpdateLinkWithInputStream() reset mpThreadConsumer, +the graphic object of the graphic node is still in unloaded +state (its type is GRAPHIC_DEFAULT or GRAPHIC_NONE instead of +GRAPHIC_BITMAP or GRAPHIC_GDIMETAFILE) for a while, because +its modification is solved asynchronously after several +SvFileObject::GetData() calls. In the intermediate state +of the graphic object, with the high priority repaints of +the new scheduler, PaintPicture() could start new thread +to load the image again. + +Using the new member variable SwGrfNode::mbUpdateLinkInProgress, +this patch will prevent the graphic node to start newer thread +unnecessarily. + +Change-Id: I9433f0fa4613294103a00a3955fc2f35d8863b59 +--- + sw/inc/ndgrf.hxx | 3 +++ + sw/source/core/doc/notxtfrm.cxx | 15 ++++++++++----- + sw/source/core/graphic/ndgrf.cxx | 7 +++++-- + 3 files changed, 18 insertions(+), 7 deletions(-) + +diff --git a/sw/inc/ndgrf.hxx b/sw/inc/ndgrf.hxx +index 668c5f5..e7b2261 100644 +--- a/sw/inc/ndgrf.hxx ++++ b/sw/inc/ndgrf.hxx +@@ -51,6 +51,7 @@ class SW_DLLPUBLIC SwGrfNode: public SwNoTextNode + + boost::shared_ptr< SwAsyncRetrieveInputStreamThreadConsumer > mpThreadConsumer; + bool mbLinkedInputStreamReady; ++ bool mbUpdateLinkInProgress; + com::sun::star::uno::Reference mxInputStream; + bool mbIsStreamReadOnly; + +@@ -198,6 +199,8 @@ public: + + boost::weak_ptr< SwAsyncRetrieveInputStreamThreadConsumer > GetThreadConsumer() { return mpThreadConsumer;} + bool IsLinkedInputStreamReady() const { return mbLinkedInputStreamReady;} ++ bool IsUpdateLinkInProgress() const { return mbUpdateLinkInProgress;} ++ void SetUpdateLinkInProgress(bool b) { mbUpdateLinkInProgress = b; } + void TriggerAsyncRetrieveInputStream(); + void ApplyInputStream( + com::sun::star::uno::Reference xInputStream, +diff --git a/sw/source/core/doc/notxtfrm.cxx b/sw/source/core/doc/notxtfrm.cxx +index 02a815b..d943e6d 100644 +--- a/sw/source/core/doc/notxtfrm.cxx ++++ b/sw/source/core/doc/notxtfrm.cxx +@@ -897,10 +897,11 @@ void SwNoTextFrm::PaintPicture( vcl::RenderContext* pOut, const SwRect &rGrfArea + { + Size aTmpSz; + ::sfx2::SvLinkSource* pGrfObj = pGrfNd->GetLink()->GetObj(); +- if( !pGrfObj || +- !pGrfObj->IsDataComplete() || +- !(aTmpSz = pGrfNd->GetTwipSize()).Width() || +- !aTmpSz.Height() || !pGrfNd->GetAutoFormatLvl() ) ++ if ( ( !pGrfObj || ++ !pGrfObj->IsDataComplete() || ++ !(aTmpSz = pGrfNd->GetTwipSize()).Width() || ++ !aTmpSz.Height() || !pGrfNd->GetAutoFormatLvl() ) && ++ !pGrfNd->IsUpdateLinkInProgress() ) + { + pGrfNd->TriggerAsyncRetrieveInputStream(); // #i73788# + } +@@ -909,9 +910,13 @@ void SwNoTextFrm::PaintPicture( vcl::RenderContext* pOut, const SwRect &rGrfArea + GetRealURL( *pGrfNd, aText ); + ::lcl_PaintReplacement( aAlignedGrfArea, aText, *pShell, this, false ); + bContinue = false; ++ } else if ( rGrfObj.GetType() != GRAPHIC_DEFAULT && ++ rGrfObj.GetType() != GRAPHIC_NONE && ++ pGrfNd->IsUpdateLinkInProgress() ) ++ { ++ pGrfNd->SetUpdateLinkInProgress( false ); + } + } +- + if( bContinue ) + { + if( rGrfObj.GetGraphic().IsSupportedGraphic()) +diff --git a/sw/source/core/graphic/ndgrf.cxx b/sw/source/core/graphic/ndgrf.cxx +index 5c2867e..dbbe379 100644 +--- a/sw/source/core/graphic/ndgrf.cxx ++++ b/sw/source/core/graphic/ndgrf.cxx +@@ -71,6 +71,7 @@ SwGrfNode::SwGrfNode( + mpReplacementGraphic(0), + // #i73788# + mbLinkedInputStreamReady( false ), ++ mbUpdateLinkInProgress( false ), + mbIsStreamReadOnly( false ) + { + maGrfObj.SetSwapStreamHdl( LINK(this, SwGrfNode, SwapGraphic) ); +@@ -89,6 +90,7 @@ SwGrfNode::SwGrfNode( const SwNodeIndex & rWhere, + mpReplacementGraphic(0), + // #i73788# + mbLinkedInputStreamReady( false ), ++ mbUpdateLinkInProgress( false ), + mbIsStreamReadOnly( false ) + { + maGrfObj.SetSwapStreamHdl( LINK(this, SwGrfNode, SwapGraphic) ); +@@ -112,6 +114,7 @@ SwGrfNode::SwGrfNode( const SwNodeIndex & rWhere, + mpReplacementGraphic(0), + // #i73788# + mbLinkedInputStreamReady( false ), ++ mbUpdateLinkInProgress( false ), + mbIsStreamReadOnly( false ) + { + maGrfObj.SetSwapStreamHdl( LINK(this, SwGrfNode, SwapGraphic) ); +@@ -521,7 +524,6 @@ bool SwGrfNode::SwapIn( bool bWaitForData ) + bool bRet = false; + bInSwapIn = true; + SwBaseLink* pLink = static_cast((::sfx2::SvBaseLink*) refLink); +- + if( pLink ) + { + if( GRAPHIC_NONE == maGrfObj.GetType() || +@@ -1089,7 +1091,6 @@ void SwGrfNode::TriggerAsyncRetrieveInputStream() + OSL_FAIL( " - Method is misused. Method call is only valid for graphic nodes, which refer a linked graphic file" ); + return; + } +- + if ( mpThreadConsumer.get() == 0 ) + { + mpThreadConsumer.reset( new SwAsyncRetrieveInputStreamThreadConsumer( *this ) ); +@@ -1104,6 +1105,7 @@ void SwGrfNode::TriggerAsyncRetrieveInputStream() + } + mpThreadConsumer->CreateThread( sGrfNm, sReferer ); + } ++ + } + + +@@ -1137,6 +1139,7 @@ void SwGrfNode::UpdateLinkWithInputStream() + // #i88291# + mxInputStream.clear(); + GetLink()->clearStreamToLoadFrom(); ++ mbUpdateLinkInProgress = true; + mbLinkedInputStreamReady = false; + mpThreadConsumer.reset(); + } +-- +2.1.4 + diff --git a/libreoffice.changes b/libreoffice.changes index 44e203c..1d8f6c6 100644 --- a/libreoffice.changes +++ b/libreoffice.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Tue Dec 1 13:25:35 UTC 2015 - andras.timar@collabora.com + +- bnc#954345 - LO-L3: Insert-->Image-->Insert as Link hangs writer + * bnc-954345.diff + ------------------------------------------------------------------- Mon Nov 9 09:12:03 UTC 2015 - tchvatal@suse.com @@ -74,7 +80,7 @@ Mon Sep 21 08:55:05 UTC 2015 - tchvatal@suse.com bnc#936188 CVE-2015-5212, bnc#934423 CVE-2015-45513, bnc#934423 CVE-2015-4551, bnc#910805 CVE-2014-8146, bnc#940838 CVE-2015-5214, bnc#936190 CVE-2015-5213, - bnc#936188 CVE-2015-5212, bnc#934423 CVE-2015-4551 + bnc#936188 CVE-2015-5212, bnc#934423 CVE-2015-4551 ------------------------------------------------------------------- Thu Sep 17 13:27:07 UTC 2015 - tchvatal@suse.com @@ -342,7 +348,7 @@ Wed Apr 15 11:42:37 UTC 2015 - tchvatal@suse.com ------------------------------------------------------------------- Tue Apr 14 13:49:22 UTC 2015 - tchvatal@suse.com -- Hopefully fix bnc#913042.Redo check phase that sometimes broke +- Hopefully fix bnc#913042.Redo check phase that sometimes broke .jar generating ------------------------------------------------------------------- diff --git a/libreoffice.spec b/libreoffice.spec index f10a1c9..9764805 100644 --- a/libreoffice.spec +++ b/libreoffice.spec @@ -175,6 +175,8 @@ Patch10: bnc-889755.diff Patch11: bnc-679938.diff # PATCH-FIX-UPSTREAM: taken from Master to fix flaky test Patch12: use-long-for-test-comparsion.patch +# bnc#954345 - LO-L3: Insert-->Image-->Insert as Link hangs writer +Patch13: bnc-954345.diff # try to save space by using hardlinks Patch990: install-with-hardlinks.diff BuildRequires: %{name}-share-linker @@ -1005,6 +1007,7 @@ Provides additional %{langname} translations and resources for %{project}. \ %patch10 -p1 %patch11 -p1 %patch12 -p1 +%patch13 -p1 %patch990 -p1 # 256x256 icons tar -xjf %{SOURCE20}