framework/inc/dispatch/interceptionhelper.hxx    |    2 -
 framework/source/dispatch/interceptionhelper.cxx |   26 ++++++++++++++++++-----
 2 files changed, 21 insertions(+), 7 deletions(-)

New commits:
commit 6568768caf4e05d83495eecad4dca23d641795ca
Author:     Vasily Melenchuk <vasily.melenc...@cib.de>
AuthorDate: Mon Sep 10 22:40:46 2018 +0300
Commit:     Vasily Melenchuk <vasily.melenc...@cib.de>
CommitDate: Mon Sep 10 23:01:07 2018 +0300

    framework: mutex locking revision
    
    - revert own mutex, use SolarMutex as before
    - extend SolarMutex protected area until queryDispatch() finish
    
    Change-Id: Ie94b120a594aff8a3a443b3eb6ee723eb3d5a26f

diff --git a/framework/inc/dispatch/interceptionhelper.hxx 
b/framework/inc/dispatch/interceptionhelper.hxx
index 8ada47f696a2..ee6ae9db1b97 100755
--- a/framework/inc/dispatch/interceptionhelper.hxx
+++ b/framework/inc/dispatch/interceptionhelper.hxx
@@ -146,8 +146,6 @@ class InterceptionHelper : public  ::cppu::WeakImplHelper<
                    The last or the first registered one. */
         static bool m_bPreferrFirstInterceptor;
 
-        osl::Mutex m_Mutex;
-
     // native interface
 
     public:
diff --git a/framework/source/dispatch/interceptionhelper.cxx 
b/framework/source/dispatch/interceptionhelper.cxx
index 9342cfab8f52..55ee63ba1e83 100644
--- a/framework/source/dispatch/interceptionhelper.cxx
+++ b/framework/source/dispatch/interceptionhelper.cxx
@@ -43,7 +43,7 @@ css::uno::Reference< css::frame::XDispatch > SAL_CALL 
InterceptionHelper::queryD
                                                                                
               sal_Int32        nSearchFlags    )
     throw(css::uno::RuntimeException, std::exception)
 {
-    osl::Guard<osl::Mutex> aGuard(m_Mutex);
+    SolarMutexGuard aLock;
 
     // a) first search an interceptor, which match to this URL by its URL 
pattern registration
     //    Note: if it return NULL - it does not mean an empty interceptor list 
automatically!
@@ -99,8 +99,6 @@ css::uno::Sequence< css::uno::Reference< 
css::frame::XDispatch > > SAL_CALL Inte
 void SAL_CALL InterceptionHelper::registerDispatchProviderInterceptor(const 
css::uno::Reference< css::frame::XDispatchProviderInterceptor >& xInterceptor)
     throw(css::uno::RuntimeException, std::exception)
 {
-    osl::Guard<osl::Mutex> aGuard(m_Mutex);
-
     // reject incorrect calls of this interface method
     css::uno::Reference< css::frame::XDispatchProvider > xThis(static_cast< 
::cppu::OWeakObject* >(this), css::uno::UNO_QUERY);
     if (!xInterceptor.is())
@@ -121,6 +119,9 @@ void SAL_CALL 
InterceptionHelper::registerDispatchProviderInterceptor(const css:
         aInfo.lURLPattern[0] = "*";
     }
 
+    // SAFE {
+    SolarMutexClearableGuard aWriteLock;
+
     // a) no interceptor at all - set this instance as master for given 
interceptor
     //    and set our slave as its slave - and put this interceptor to the 
list.
     //    Its place there doesn't matter. Because this list is currently empty.
@@ -165,6 +166,9 @@ void SAL_CALL 
InterceptionHelper::registerDispatchProviderInterceptor(const css:
 
     css::uno::Reference< css::frame::XFrame > xOwner(m_xOwnerWeak.get(), 
css::uno::UNO_QUERY);
 
+    aWriteLock.clear();
+    // } SAFE
+
     // Don't forget to send a frame action event "context changed".
     // Any cached dispatch objects must be validated now!
     if (xOwner.is())
@@ -174,12 +178,14 @@ void SAL_CALL 
InterceptionHelper::registerDispatchProviderInterceptor(const css:
 void SAL_CALL InterceptionHelper::releaseDispatchProviderInterceptor(const 
css::uno::Reference< css::frame::XDispatchProviderInterceptor >& xInterceptor)
     throw(css::uno::RuntimeException, std::exception)
 {
-    osl::Guard<osl::Mutex> aGuard(m_Mutex);
     // reject wrong calling of this interface method
     css::uno::Reference< css::frame::XDispatchProvider > xThis(static_cast< 
::cppu::OWeakObject* >(this), css::uno::UNO_QUERY);
     if (!xInterceptor.is())
         throw css::uno::RuntimeException("NULL references not allowed as in 
parameter", xThis);
 
+    // SAFE {
+    SolarMutexClearableGuard aWriteLock;
+
     // search this interceptor ...
     // If it could be located inside cache -
     // use its slave/master relations to update the interception list;
@@ -207,6 +213,9 @@ void SAL_CALL 
InterceptionHelper::releaseDispatchProviderInterceptor(const css::
 
     css::uno::Reference< css::frame::XFrame > xOwner(m_xOwnerWeak.get(), 
css::uno::UNO_QUERY);
 
+    aWriteLock.clear();
+    // } SAFE
+
     // Don't forget to send a frame action event "context changed".
     // Any cached dispatch objects must be validated now!
     if (xOwner.is())
@@ -217,8 +226,9 @@ void SAL_CALL 
InterceptionHelper::releaseDispatchProviderInterceptor(const css::
 void SAL_CALL InterceptionHelper::disposing(const css::lang::EventObject& 
aEvent)
     throw(css::uno::RuntimeException, std::exception)
 {
-    osl::Guard<osl::Mutex> aGuard(m_Mutex);
     #ifdef FORCE_DESTRUCTION_OF_INTERCEPTION_CHAIN
+    // SAFE ->
+    SolarMutexResettableGuard aReadLock;
 
     // check call... we accept such disposing calls only from our owner frame.
     css::uno::Reference< css::frame::XFrame > xOwner(m_xOwnerWeak.get(), 
css::uno::UNO_QUERY);
@@ -234,6 +244,9 @@ void SAL_CALL InterceptionHelper::disposing(const 
css::lang::EventObject& aEvent
     // Because this vetor will be influenced by every deregistered interceptor.
     InterceptionHelper::InterceptorList aCopy = m_lInterceptionRegs;
 
+    aReadLock.clear();
+    // <- SAFE
+
     InterceptionHelper::InterceptorList::iterator pIt;
     for (  pIt  = aCopy.begin();
            pIt != aCopy.end();
@@ -252,8 +265,11 @@ void SAL_CALL InterceptionHelper::disposing(const 
css::lang::EventObject& aEvent
 
     #if OSL_DEBUG_LEVEL > 0
     // SAFE ->
+    aReadLock.reset();
     if (!m_lInterceptionRegs.empty() )
         OSL_FAIL("There are some pending interceptor objects, which seems to 
be registered during (!) the destruction of a frame.");
+    aReadLock.clear();
+    // <- SAFE
     #endif // ODL_DEBUG_LEVEL>0
 
     #endif // FORCE_DESTRUCTION_OF_INTERCEPTION_CHAIN
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to