[Libreoffice] [dev] Re: Debugging Hanging OOo
Knut Olav Bøhmer
bohmer at gmail.com
Sat Jul 30 12:20:40 PDT 2011
Hi,
After looking closer, it actually looks like it IS applied.
Sorry for the confusion.
2011/7/29 Knut Olav Bøhmer <bohmer at gmail.com>:
> Hi,
>
> It does not look like this patch is included in LibreOffice.
> What can we do get it included?
>
>
> ---------- Forwarded message ----------
> From: Carsten Driesner <carsten.driesner at oracle.com>
> Date: 6 December 2010 13:56
> Subject: Re: [dev] Re: Debugging Hanging OOo
> To: dev at openoffice.org
>
>
> Am 06.12.2010 12:32, schrieb Knut Olav Bøhmer:
>>>
>>> I will change the patch to make it work for OOo 3.2.1 so you can test it. My
>>> tests with the latest DEV300 version looks very good and I cannot see a
>>> deadlock anymore. Please stay tuned I will send it to you as soon as
>>> possible.
>>
>> Thank you :)
>
> Hi Knut,
>
> Please look below where I added the content of the patch file.
> Unfortunately the mailing list removes attachments therefore you have
> to copy the patch from this mail to a patch file.
> The patch applies without a problem on OOO320m19.
>
> Regards,
> Carsten
>
> ---
> diff -urp old/sfx2/inc/sfx2/viewsh.hxx new/sfx2/inc/sfx2/viewsh.hxx
> --- old/sfx2/inc/sfx2/viewsh.hxx 2010-03-24 18:53:35.000000000 +0100
> +++ new/sfx2/inc/sfx2/viewsh.hxx 2010-12-06 10:57:07.092319976 +0100
> @@ -36,6 +36,7 @@
> #include <svtools/lstner.hxx>
> #include <com/sun/star/ui/XContextMenuInterceptor.hpp>
> #include <com/sun/star/datatransfer/clipboard/XClipboardListener.hpp>
> +#include <com/sun/star/datatransfer/clipboard/XClipboardNotifier.hpp>
> #include <cppuhelper/interfacecontainer.hxx>
> #include "shell.hxx"
> #include <tools/gen.hxx>
> @@ -304,6 +305,7 @@ public:
> void
> SetAdditionalPrintOptions( const com::sun::star::uno::Sequence <
> com::sun::star::beans::PropertyValue >& );
>
> void
> AddRemoveClipboardListener( const com::sun::star::uno::Reference <
> com::sun::star::datatransfer::clipboard::XClipboardListener>&, BOOL );
> + ::com::sun::star::uno::Reference<
> ::com::sun::star::datatransfer::clipboard::XClipboardNotifier >
> GetClipboardNotifier();
>
> #if _SOLAR__PRIVATE
> SAL_DLLPRIVATE SfxInPlaceClient* GetUIActiveIPClient_Impl() const;
> diff -urp old/sfx2/source/view/viewsh.cxx new/sfx2/source/view/viewsh.cxx
> --- old/sfx2/source/view/viewsh.cxx 2010-03-24 18:53:36.000000000 +0100
> +++ new/sfx2/source/view/viewsh.cxx 2010-12-06 13:31:03.663300701 +0100
> @@ -44,7 +44,6 @@
> #include <com/sun/star/system/SystemShellExecuteFlags.hpp>
> #include <com/sun/star/container/XContainerQuery.hpp>
> #include <com/sun/star/frame/XStorable.hpp>
> -#include <com/sun/star/datatransfer/clipboard/XClipboardNotifier.hpp>
> #include <com/sun/star/datatransfer/clipboard/XClipboard.hpp>
> #include <cppuhelper/implbase1.hxx>
>
> @@ -115,7 +114,9 @@ DBG_NAME(SfxViewShell)
> class SfxClipboardChangeListener : public ::cppu::WeakImplHelper1<
> datatransfer::clipboard::XClipboardListener >
> {
> - SfxViewShell* pViewShell;
> +public:
> + SfxClipboardChangeListener( SfxViewShell* pView, const
> uno::Reference< datatransfer::clipboard::XClipboardNotifier >&
> xClpbrdNtfr );
> + virtual ~SfxClipboardChangeListener();
>
> // XEventListener
> virtual void SAL_CALL disposing( const lang::EventObject& rEventObject )
> @@ -125,54 +126,112 @@ class SfxClipboardChangeListener : publi
> virtual void SAL_CALL changedContents( const
> datatransfer::clipboard::ClipboardEvent& rEventObject )
> throw ( uno::RuntimeException );
>
> -public:
> - SfxClipboardChangeListener( SfxViewShell* pView );
> - virtual ~SfxClipboardChangeListener();
> + void DisconnectViewShell() { m_pViewShell = NULL; }
> + void ChangedContents();
> +
> + enum AsyncExecuteCmd
> + {
> + ASYNCEXECUTE_CMD_DISPOSING,
> + ASYNCEXECUTE_CMD_CHANGEDCONTENTS
> + };
>
> - void DisconnectViewShell() { pViewShell = NULL; }
> + struct AsyncExecuteInfo
> + {
> + AsyncExecuteInfo( AsyncExecuteCmd eCmd, uno::Reference<
> datatransfer::clipboard::XClipboardListener > xThis,
> SfxClipboardChangeListener* pListener ) :
> + m_eCmd( eCmd ), m_xThis( xThis ), m_pListener( pListener ) {}
> +
> + AsyncExecuteCmd m_eCmd;
> + uno::Reference< datatransfer::clipboard::XClipboardListener > m_xThis;
> + SfxClipboardChangeListener* m_pListener;
> + };
> +
> +private:
> + SfxViewShell* m_pViewShell;
> + uno::Reference< datatransfer::clipboard::XClipboardNotifier >
> m_xClpbrdNtfr;
> + uno::Reference< lang::XComponent > m_xCtrl;
> +
> + DECL_STATIC_LINK( SfxClipboardChangeListener,
> AsyncExecuteHdl_Impl, AsyncExecuteInfo* );
> };
>
> -SfxClipboardChangeListener::SfxClipboardChangeListener( SfxViewShell* pView )
> -: pViewShell( 0 )
> +SfxClipboardChangeListener::SfxClipboardChangeListener( SfxViewShell*
> pView, const uno::Reference<
> datatransfer::clipboard::XClipboardNotifier >& xClpbrdNtfr )
> + : m_pViewShell( 0 ), m_xClpbrdNtfr( xClpbrdNtfr )
> {
> - uno::Reference < lang::XComponent > xCtrl(
> pView->GetController(), uno::UNO_QUERY );
> - if ( xCtrl.is() )
> - {
> - xCtrl->addEventListener( uno::Reference <
> lang::XEventListener > ( static_cast < lang::XEventListener* >( this )
> ) );
> - pViewShell = pView;
> - }
> + m_xCtrl = uno::Reference < lang::XComponent >(
> pView->GetController(), uno::UNO_QUERY );
> + if ( m_xCtrl.is() )
> + {
> + m_xCtrl->addEventListener( uno::Reference <
> lang::XEventListener > ( static_cast < lang::XEventListener* >( this )
> ) );
> + m_pViewShell = pView;
> + }
> + if ( m_xClpbrdNtfr.is() )
> + {
> + m_xClpbrdNtfr->addClipboardListener( uno::Reference<
> datatransfer::clipboard::XClipboardListener >(
> + static_cast< datatransfer::clipboard::XClipboardListener*
>>( this )));
> + }
> }
>
> SfxClipboardChangeListener::~SfxClipboardChangeListener()
> {
> }
>
> +void SfxClipboardChangeListener::ChangedContents()
> +{
> + const ::vos::OGuard aGuard( Application::GetSolarMutex() );
> + if( m_pViewShell )
> + {
> + SfxBindings& rBind = m_pViewShell->GetViewFrame()->GetBindings();
> + rBind.Invalidate( SID_PASTE );
> + rBind.Invalidate( SID_PASTE_SPECIAL );
> + rBind.Invalidate( SID_CLIPBOARD_FORMAT_ITEMS );
> + }
> +}
> +
> +IMPL_STATIC_LINK_NOINSTANCE( SfxClipboardChangeListener,
> AsyncExecuteHdl_Impl, AsyncExecuteInfo*, pAsyncExecuteInfo )
> +{
> + if ( pAsyncExecuteInfo )
> + {
> + uno::Reference< datatransfer::clipboard::XClipboardListener >
> xThis( pAsyncExecuteInfo->m_xThis );
> + if ( pAsyncExecuteInfo->m_pListener )
> + {
> + if ( pAsyncExecuteInfo->m_eCmd == ASYNCEXECUTE_CMD_DISPOSING )
> + pAsyncExecuteInfo->m_pListener->DisconnectViewShell();
> + else if ( pAsyncExecuteInfo->m_eCmd ==
> ASYNCEXECUTE_CMD_CHANGEDCONTENTS )
> + pAsyncExecuteInfo->m_pListener->ChangedContents();
> + }
> + }
> + delete pAsyncExecuteInfo;
> +
> + return 0;
> +}
> +
> void SAL_CALL SfxClipboardChangeListener::disposing( const
> lang::EventObject& /*rEventObject*/ )
> throw ( uno::RuntimeException )
> {
> - // either clipboard or ViewShell is going to be destroyed ->
> no interest in listening anymore
> - const ::vos::OGuard aGuard( Application::GetSolarMutex() );
> - if ( pViewShell )
> - {
> - uno::Reference < lang::XComponent > xCtrl(
> pViewShell->GetController(), uno::UNO_QUERY );
> - if ( xCtrl.is() )
> - xCtrl->removeEventListener( uno::Reference <
> lang::XEventListener > ( static_cast < lang::XEventListener* >( this )
> ) );
> - pViewShell->AddRemoveClipboardListener( uno::Reference
> < datatransfer::clipboard::XClipboardListener > (this), FALSE );
> - pViewShell = 0;
> - }
> + // Either clipboard or ViewShell is going to be destroyed -> no
> interest in listening anymore
> + uno::Reference< lang::XComponent > xCtrl( m_xCtrl );
> + uno::Reference< datatransfer::clipboard::XClipboardNotifier >
> xNotify( m_xClpbrdNtfr );
> +
> + uno::Reference< datatransfer::clipboard::XClipboardListener >
> xThis( static_cast< datatransfer::clipboard::XClipboardListener* >(
> this ));
> + if ( xCtrl.is() )
> + xCtrl->removeEventListener( uno::Reference <
> lang::XEventListener > ( static_cast < lang::XEventListener* >( this
> )));
> + if ( xNotify.is() )
> + xNotify->removeClipboardListener( xThis );
> +
> + // Make asynchronous call to avoid locking SolarMutex which is the
> + // root for many deadlocks, especially in conjuction with the "Windows"
> + // based single thread apartment clipboard code!
> + AsyncExecuteInfo* pInfo = new AsyncExecuteInfo(
> ASYNCEXECUTE_CMD_DISPOSING, xThis, this );
> + Application::PostUserEvent( STATIC_LINK( 0,
> SfxClipboardChangeListener, AsyncExecuteHdl_Impl ), pInfo );
> }
>
> void SAL_CALL SfxClipboardChangeListener::changedContents( const
> datatransfer::clipboard::ClipboardEvent& )
> throw ( RuntimeException )
> {
> - const ::vos::OGuard aGuard( Application::GetSolarMutex() );
> - if( pViewShell )
> - {
> - SfxBindings& rBind = pViewShell->GetViewFrame()->GetBindings();
> - rBind.Invalidate( SID_PASTE );
> - rBind.Invalidate( SID_PASTE_SPECIAL );
> - rBind.Invalidate( SID_CLIPBOARD_FORMAT_ITEMS );
> - }
> + // Make asynchronous call to avoid locking SolarMutex which is the
> + // root for many deadlocks, especially in conjuction with the "Windows"
> + // based single thread apartment clipboard code!
> + uno::Reference< datatransfer::clipboard::XClipboardListener >
> xThis( static_cast< datatransfer::clipboard::XClipboardListener* >(
> this ));
> + AsyncExecuteInfo* pInfo = new AsyncExecuteInfo(
> ASYNCEXECUTE_CMD_CHANGEDCONTENTS, xThis, this );
> + Application::PostUserEvent( STATIC_LINK( 0,
> SfxClipboardChangeListener, AsyncExecuteHdl_Impl ), pInfo );
> }
>
>
> @@ -2011,8 +2070,7 @@ void SfxViewShell::SetController( SfxBas
> if ( pImp->xClipboardListener.is() )
> pImp->xClipboardListener->DisconnectViewShell();
>
> - pImp->xClipboardListener = new SfxClipboardChangeListener( this );
> - AddRemoveClipboardListener( pImp->xClipboardListener.get(), TRUE );
> + pImp->xClipboardListener = new SfxClipboardChangeListener( this,
> GetClipboardNotifier() );
> }
>
> Reference < XController > SfxViewShell::GetController()
> @@ -2216,6 +2274,15 @@ BOOL SfxViewShell::Escape()
> return GetViewFrame()->GetBindings().Execute(
> SID_TERMINATE_INPLACEACTIVATION );
> }
>
> +uno::Reference< datatransfer::clipboard::XClipboardNotifier >
> SfxViewShell::GetClipboardNotifier()
> +{
> + uno::Reference< datatransfer::clipboard::XClipboardNotifier >
> xClipboardNotifier;
> + if ( GetViewFrame() )
> + xClipboardNotifier = uno::Reference<
> datatransfer::clipboard::XClipboardNotifier >(
> GetViewFrame()->GetWindow().GetClipboard(), uno::UNO_QUERY );
> +
> + return xClipboardNotifier;
> +}
> +
> void SfxViewShell::AddRemoveClipboardListener( const uno::Reference <
> datatransfer::clipboard::XClipboardListener >& rClp, BOOL bAdd )
> {
> try
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe at openoffice.org
> For additional commands, e-mail: dev-help at openoffice.org
>
>
>
>
> --
> Knut Olav Bøhmer
>
--
Knut Olav Bøhmer
More information about the LibreOffice
mailing list