stoc/source/inspect/introspection.cxx |   46 +++++++++++-----------------------
 1 file changed, 16 insertions(+), 30 deletions(-)

New commits:
commit 695a46783e7dfd7cee0e083d9a8c2864dd7ac884
Author:     Caolán McNamara <caolan.mcnam...@collabora.com>
AuthorDate: Tue Sep 24 21:18:20 2024 +0100
Commit:     Caolán McNamara <caolan.mcnam...@collabora.com>
CommitDate: Wed Sep 25 15:37:23 2024 +0200

    cid#1606918 Data race condition
    
    and
    
    cid#1606991 Data race condition
    cid#1607010 Data race condition
    cid#1607323 Data race condition
    cid#1607335 Data race condition
    cid#1607635 Data race condition
    cid#1608162 Data race condition
    
    Change-Id: I65edcf08f92fb564d56d0e8954212533c1cbec91
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/173895
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>

diff --git a/stoc/source/inspect/introspection.cxx 
b/stoc/source/inspect/introspection.cxx
index 046063a0a2ae..716e35c95df1 100644
--- a/stoc/source/inspect/introspection.cxx
+++ b/stoc/source/inspect/introspection.cxx
@@ -685,8 +685,8 @@ class ImplIntrospectionAccess : public 
IntrospectionAccessHelper
     Reference<XEnumerationAccess>   getXEnumerationAccess();
     Reference<XIdlArray>            getXIdlArray();
 
-    void cacheXNameContainer();
-    void cacheXIndexContainer();
+    void cacheXNameContainer(const std::unique_lock<std::mutex>& rGuard);
+    void cacheXIndexContainer(const std::unique_lock<std::mutex>& rGuard);
 
 public:
     ImplIntrospectionAccess( Any obj, rtl::Reference< 
IntrospectionAccessStatic_Impl >  pStaticImpl_ );
@@ -797,7 +797,7 @@ Reference<XElementAccess> 
ImplIntrospectionAccess::getXElementAccess()
     return mxObjElementAccess;
 }
 
-void ImplIntrospectionAccess::cacheXNameContainer()
+void ImplIntrospectionAccess::cacheXNameContainer(const 
std::unique_lock<std::mutex>& /*rGuard*/)
 {
     Reference<XNameContainer> xNameContainer;
     Reference<XNameReplace> xNameReplace;
@@ -819,7 +819,6 @@ void ImplIntrospectionAccess::cacheXNameContainer()
     }
 
     {
-        std::unique_lock aGuard( m_aMutex );
         if( !mxObjNameContainer.is() )
             mxObjNameContainer = xNameContainer;
         if( !mxObjNameReplace.is() )
@@ -834,10 +833,8 @@ Reference<XNameContainer> 
ImplIntrospectionAccess::getXNameContainer()
     std::unique_lock aGuard( m_aMutex );
 
     if( !mxObjNameContainer.is() )
-    {
-        aGuard.unlock();
-        cacheXNameContainer();
-    }
+        cacheXNameContainer(aGuard);
+
     return mxObjNameContainer;
 }
 
@@ -846,10 +843,8 @@ Reference<XNameReplace> 
ImplIntrospectionAccess::getXNameReplace()
     std::unique_lock aGuard( m_aMutex );
 
     if( !mxObjNameReplace.is() )
-    {
-        aGuard.unlock();
-        cacheXNameContainer();
-    }
+        cacheXNameContainer(aGuard);
+
     return mxObjNameReplace;
 }
 
@@ -858,14 +853,12 @@ Reference<XNameAccess> 
ImplIntrospectionAccess::getXNameAccess()
     std::unique_lock aGuard( m_aMutex );
 
     if( !mxObjNameAccess.is() )
-    {
-        aGuard.unlock();
-        cacheXNameContainer();
-    }
+        cacheXNameContainer(aGuard);
+
     return mxObjNameAccess;
 }
 
-void ImplIntrospectionAccess::cacheXIndexContainer()
+void ImplIntrospectionAccess::cacheXIndexContainer(const 
std::unique_lock<std::mutex>& /*rGuard*/)
 {
     Reference<XIndexContainer> xIndexContainer;
     Reference<XIndexReplace> xIndexReplace;
@@ -887,7 +880,6 @@ void ImplIntrospectionAccess::cacheXIndexContainer()
     }
 
     {
-        std::unique_lock aGuard( m_aMutex );
         if( !mxObjIndexContainer.is() )
             mxObjIndexContainer = xIndexContainer;
         if( !mxObjIndexReplace.is() )
@@ -902,10 +894,8 @@ Reference<XIndexContainer> 
ImplIntrospectionAccess::getXIndexContainer()
     std::unique_lock aGuard( m_aMutex );
 
     if( !mxObjIndexContainer.is() )
-    {
-        aGuard.unlock();
-        cacheXIndexContainer();
-    }
+        cacheXIndexContainer(aGuard);
+
     return mxObjIndexContainer;
 }
 
@@ -914,10 +904,8 @@ Reference<XIndexReplace> 
ImplIntrospectionAccess::getXIndexReplace()
     std::unique_lock aGuard( m_aMutex );
 
     if( !mxObjIndexReplace.is() )
-    {
-        aGuard.unlock();
-        cacheXIndexContainer();
-    }
+        cacheXIndexContainer(aGuard);
+
     return mxObjIndexReplace;
 }
 
@@ -926,10 +914,8 @@ Reference<XIndexAccess> 
ImplIntrospectionAccess::getXIndexAccess()
     std::unique_lock aGuard( m_aMutex );
 
     if( !mxObjIndexAccess.is() )
-    {
-        aGuard.unlock();
-        cacheXIndexContainer();
-    }
+        cacheXIndexContainer(aGuard);
+
     return mxObjIndexAccess;
 }
 

Reply via email to