[Libreoffice] Fwd: [dev] Re: Debugging Hanging OOo
Knut Olav Bøhmer
bohmer at gmail.com
Fri Jul 29 04:43:48 PDT 2011
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
More information about the LibreOffice
mailing list