ucb/source/cacher/cachedcontentresultset.cxx | 83 +++++++++++++++----------- ucb/source/cacher/contentresultsetwrapper.cxx | 34 ++++++++-- ucb/source/cacher/contentresultsetwrapper.hxx | 39 ------------ ucb/source/ucp/cmis/cmis_datasupplier.cxx | 10 +-- 4 files changed, 82 insertions(+), 84 deletions(-)
New commits: commit b6b0194661303d12e9c73ffadbe82afe77c862e2 Author: Michael Stahl <mst...@redhat.com> Date: Mon Jan 9 18:42:22 2017 +0100 ucb: cmis::DataSupplier::queryContent() looks rather questionable It's not immediately obvious if the caller is responsible for checking the index validity here, but all the other sub-classes of ResultSetDataSupplier that i looked at do check the index so do the same here. Change-Id: Ib0c5c38cb28282f08752cdb03202e4d6f3566693 (cherry picked from commit 84de69638362c7b575560e0da3efbc709b7ac476) Reviewed-on: https://gerrit.libreoffice.org/32906 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: David Ostrovsky <da...@ostrovsky.org> Reviewed-by: Michael Stahl <mst...@redhat.com> diff --git a/ucb/source/ucp/cmis/cmis_datasupplier.cxx b/ucb/source/ucp/cmis/cmis_datasupplier.cxx index 19754f8..14b3385 100644 --- a/ucb/source/ucp/cmis/cmis_datasupplier.cxx +++ b/ucb/source/ucp/cmis/cmis_datasupplier.cxx @@ -68,18 +68,20 @@ namespace cmis OUString DataSupplier::queryContentIdentifierString( sal_uInt32 nIndex ) { - return queryContentIdentifier( nIndex )->getContentIdentifier( ); + auto const xTemp(queryContentIdentifier(nIndex)); + return (xTemp.is()) ? xTemp->getContentIdentifier() : OUString(); } uno::Reference< ucb::XContentIdentifier > DataSupplier::queryContentIdentifier( sal_uInt32 nIndex ) { - return queryContent( nIndex )->getIdentifier( ); + auto const xTemp(queryContent(nIndex)); + return (xTemp.is()) ? xTemp->getIdentifier() : uno::Reference<ucb::XContentIdentifier>(); } uno::Reference< ucb::XContent > DataSupplier::queryContent( sal_uInt32 nIndex ) { - if ( nIndex > maResults.size() ) - getData( ); + if (!getResult(nIndex)) + return uno::Reference<ucb::XContent>(); return maResults[ nIndex ]->xContent; } commit 5bbae1a8bc5a321f5855a50c2a98ae9128061786 Author: Michael Stahl <mst...@redhat.com> Date: Mon Jan 9 17:35:32 2017 +0100 ucb: ReacquireableGuard::reacquire() is a no-op So remove this junk and use osl::ResettableGuard instead which actually works. Change-Id: Ieb49fab16c94f0a2847ee5a1b95b52f2c141c674 (cherry picked from commit a5a94537d804f20a0d6472ef2e5995cee2d5b2fe) Reviewed-on: https://gerrit.libreoffice.org/32907 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: David Ostrovsky <da...@ostrovsky.org> Reviewed-by: Michael Stahl <mst...@redhat.com> diff --git a/ucb/source/cacher/cachedcontentresultset.cxx b/ucb/source/cacher/cachedcontentresultset.cxx index 06e9b5b..584d975 100644 --- a/ucb/source/cacher/cachedcontentresultset.cxx +++ b/ucb/source/cacher/cachedcontentresultset.cxx @@ -53,12 +53,13 @@ template<typename T> T CachedContentResultSet::rowOriginGet( T (SAL_CALL css::sdbc::XRow::* f)(sal_Int32), sal_Int32 columnIndex) { impl_EnsureNotDisposed(); - ReacquireableGuard aGuard( m_aMutex ); + osl::ResettableMutexGuard aGuard(m_aMutex); sal_Int32 nRow = m_nRow; sal_Int32 nFetchSize = m_nFetchSize; sal_Int32 nFetchDirection = m_nFetchDirection; if( !m_aCache.hasRow( nRow ) ) { + bool isCleared = false; if( !m_aCache.hasCausedException( nRow ) ) { if( !m_xFetchProvider.is() ) @@ -67,12 +68,16 @@ template<typename T> T CachedContentResultSet::rowOriginGet( throw SQLException(); } aGuard.clear(); + isCleared = true; if( impl_isForwardOnly() ) applyPositionToOrigin( nRow ); impl_fetchData( nRow, nFetchSize, nFetchDirection ); } - aGuard.reacquire(); + if (isCleared) + { + aGuard.reset(); + } if( !m_aCache.hasRow( nRow ) ) { m_bLastReadWasFromCache = false; @@ -718,7 +723,7 @@ bool SAL_CALL CachedContentResultSet the result set. */ - ReacquireableGuard aGuard( m_aMutex ); + osl::ResettableMutexGuard aGuard(m_aMutex); OSL_ENSURE( nRow >= 0, "only positive values supported" ); if( !m_xResultSetOrigin.is() ) { @@ -749,7 +754,7 @@ bool SAL_CALL CachedContentResultSet break; } - aGuard.reacquire(); + aGuard.reset(); m_nLastAppliedPos += nM; m_bAfterLastApplied = nRow != m_nLastAppliedPos; return nRow == m_nLastAppliedPos; @@ -759,7 +764,7 @@ bool SAL_CALL CachedContentResultSet { m_xResultSetOrigin->beforeFirst(); - aGuard.reacquire(); + aGuard.reset(); m_nLastAppliedPos = 0; m_bAfterLastApplied = false; return false; @@ -772,7 +777,7 @@ bool SAL_CALL CachedContentResultSet { bool bValid = m_xResultSetOrigin->absolute( nRow ); - aGuard.reacquire(); + aGuard.reset(); m_nLastAppliedPos = nRow; m_bAfterLastApplied = !bValid; return bValid; @@ -781,7 +786,7 @@ bool SAL_CALL CachedContentResultSet { bool bValid = m_xResultSetOrigin->relative( nRow - nLastAppliedPos ); - aGuard.reacquire(); + aGuard.reset(); m_nLastAppliedPos += ( nRow - nLastAppliedPos ); m_bAfterLastApplied = !bValid; return bValid; @@ -799,7 +804,7 @@ bool SAL_CALL CachedContentResultSet break; } - aGuard.reacquire(); + aGuard.reset(); m_nLastAppliedPos += nM; m_bAfterLastApplied = nRow != m_nLastAppliedPos; } @@ -1264,7 +1269,7 @@ void SAL_CALL CachedContentResultSet #define XCONTENTACCESS_queryXXX( queryXXX, XXX, TYPE ) \ impl_EnsureNotDisposed(); \ -ReacquireableGuard aGuard( m_aMutex ); \ +osl::ResettableMutexGuard aGuard(m_aMutex); \ sal_Int32 nRow = m_nRow; \ sal_Int32 nFetchSize = m_nFetchSize; \ sal_Int32 nFetchDirection = m_nFetchDirection; \ @@ -1272,6 +1277,7 @@ if( !m_aCache##XXX.hasRow( nRow ) ) \ { \ try \ { \ + bool isCleared = false; \ if( !m_aCache##XXX.hasCausedException( nRow ) ) \ { \ if( !m_xFetchProviderForContentAccess.is() ) \ @@ -1280,12 +1286,16 @@ if( !m_aCache##XXX.hasRow( nRow ) ) \ throw RuntimeException(); \ } \ aGuard.clear(); \ + isCleared = true; \ if( impl_isForwardOnly() ) \ applyPositionToOrigin( nRow ); \ \ FETCH_XXX( m_aCache##XXX, m_xFetchProviderForContentAccess, fetch##XXX##s ); \ } \ - aGuard.reacquire(); \ + if (isCleared) \ + { \ + aGuard.reset(); \ + } \ if( !m_aCache##XXX.hasRow( nRow ) ) \ { \ aGuard.clear(); \ @@ -1348,7 +1358,7 @@ sal_Bool SAL_CALL CachedContentResultSet { impl_EnsureNotDisposed(); - ReacquireableGuard aGuard( m_aMutex ); + osl::ResettableMutexGuard aGuard(m_aMutex); //after last if( m_bAfterLast ) return false; @@ -1356,12 +1366,12 @@ sal_Bool SAL_CALL CachedContentResultSet aGuard.clear(); if( isLast() ) { - aGuard.reacquire(); + aGuard.reset(); m_nRow++; m_bAfterLast = true; return false; } - aGuard.reacquire(); + aGuard.reset(); //known valid position if( impl_isKnownValidPosition( m_nRow + 1 ) ) { @@ -1375,7 +1385,7 @@ sal_Bool SAL_CALL CachedContentResultSet bool bValid = applyPositionToOrigin( nRow + 1 ); - aGuard.reacquire(); + aGuard.reset(); m_nRow = nRow + 1; m_bAfterLast = !bValid; return bValid; @@ -1392,7 +1402,7 @@ sal_Bool SAL_CALL CachedContentResultSet if( impl_isForwardOnly() ) throw SQLException(); - ReacquireableGuard aGuard( m_aMutex ); + osl::ResettableMutexGuard aGuard(m_aMutex); //before first ?: if( !m_bAfterLast && !m_nRow ) return false; @@ -1416,7 +1426,7 @@ sal_Bool SAL_CALL CachedContentResultSet bool bValid = applyPositionToOrigin( nRow - 1 ); - aGuard.reacquire(); + aGuard.reset(); m_nRow = nRow - 1; m_bAfterLast = false; return bValid; @@ -1436,7 +1446,7 @@ sal_Bool SAL_CALL CachedContentResultSet if( impl_isForwardOnly() ) throw SQLException(); - ReacquireableGuard aGuard( m_aMutex ); + osl::ResettableMutexGuard aGuard(m_aMutex); if( !m_xResultSetOrigin.is() ) { @@ -1474,7 +1484,7 @@ sal_Bool SAL_CALL CachedContentResultSet throw; } - aGuard.reacquire(); + aGuard.reset(); if( m_bFinalCount ) { sal_Int32 nNewRow = m_nKnownCount + 1 + row; @@ -1489,7 +1499,7 @@ sal_Bool SAL_CALL CachedContentResultSet sal_Int32 nCurRow = m_xResultSetOrigin->getRow(); - aGuard.reacquire(); + aGuard.reset(); m_nLastAppliedPos = nCurRow; m_nRow = nCurRow; m_bAfterLast = false; @@ -1513,7 +1523,7 @@ sal_Bool SAL_CALL CachedContentResultSet bool bValid = m_xResultSetOrigin->absolute( row ); - aGuard.reacquire(); + aGuard.reset(); if( m_bFinalCount ) { sal_Int32 nNewRow = row; @@ -1534,7 +1544,7 @@ sal_Bool SAL_CALL CachedContentResultSet sal_Int32 nCurRow = m_xResultSetOrigin->getRow(); bool bIsAfterLast = m_xResultSetOrigin->isAfterLast(); - aGuard.reacquire(); + aGuard.reset(); m_nLastAppliedPos = nCurRow; m_nRow = nCurRow; m_bAfterLastApplied = m_bAfterLast = bIsAfterLast; @@ -1552,7 +1562,7 @@ sal_Bool SAL_CALL CachedContentResultSet if( impl_isForwardOnly() ) throw SQLException(); - ReacquireableGuard aGuard( m_aMutex ); + osl::ResettableMutexGuard aGuard(m_aMutex); if( m_bAfterLast || impl_isKnownInvalidPosition( m_nRow ) ) throw SQLException(); @@ -1588,7 +1598,7 @@ sal_Bool SAL_CALL CachedContentResultSet aGuard.clear(); bool bValid = applyPositionToOrigin( nNewRow ); - aGuard.reacquire(); + aGuard.reset(); m_nRow = nNewRow; m_bAfterLast = !bValid && nNewRow > 0; return bValid; @@ -1607,7 +1617,7 @@ sal_Bool SAL_CALL CachedContentResultSet if( impl_isForwardOnly() ) throw SQLException(); - ReacquireableGuard aGuard( m_aMutex ); + osl::ResettableMutexGuard aGuard(m_aMutex); if( impl_isKnownValidPosition( 1 ) ) { m_nRow = 1; @@ -1625,7 +1635,7 @@ sal_Bool SAL_CALL CachedContentResultSet bool bValid = applyPositionToOrigin( 1 ); - aGuard.reacquire(); + aGuard.reset(); m_nRow = 1; m_bAfterLast = false; return bValid; @@ -1642,7 +1652,7 @@ sal_Bool SAL_CALL CachedContentResultSet if( impl_isForwardOnly() ) throw SQLException(); - ReacquireableGuard aGuard( m_aMutex ); + osl::ResettableMutexGuard aGuard(m_aMutex); if( m_bFinalCount ) { m_nRow = m_nKnownCount; @@ -1659,7 +1669,7 @@ sal_Bool SAL_CALL CachedContentResultSet bool bValid = m_xResultSetOrigin->last(); - aGuard.reacquire(); + aGuard.reset(); m_bAfterLastApplied = m_bAfterLast = false; if( m_bFinalCount ) { @@ -1671,7 +1681,7 @@ sal_Bool SAL_CALL CachedContentResultSet sal_Int32 nCurRow = m_xResultSetOrigin->getRow(); - aGuard.reacquire(); + aGuard.reset(); m_nLastAppliedPos = nCurRow; m_nRow = nCurRow; OSL_ENSURE( nCurRow >= m_nKnownCount, "position of last row < known Count, that could not be" ); @@ -1720,7 +1730,7 @@ sal_Bool SAL_CALL CachedContentResultSet { impl_EnsureNotDisposed(); - ReacquireableGuard aGuard( m_aMutex ); + osl::ResettableMutexGuard aGuard(m_aMutex); if( !m_bAfterLast ) return false; if( m_nKnownCount ) @@ -1738,7 +1748,7 @@ sal_Bool SAL_CALL CachedContentResultSet //find out whethter the original resultset contains rows or not m_xResultSetOrigin->afterLast(); - aGuard.reacquire(); + aGuard.reset(); m_bAfterLastApplied = true; aGuard.clear(); @@ -1753,7 +1763,7 @@ sal_Bool SAL_CALL CachedContentResultSet { impl_EnsureNotDisposed(); - ReacquireableGuard aGuard( m_aMutex ); + osl::ResettableMutexGuard aGuard(m_aMutex); if( m_bAfterLast ) return false; if( m_nRow ) @@ -1773,7 +1783,7 @@ sal_Bool SAL_CALL CachedContentResultSet //find out whethter the original resultset contains rows or not m_xResultSetOrigin->beforeFirst(); - aGuard.reacquire(); + aGuard.reset(); m_bAfterLastApplied = false; m_nLastAppliedPos = 0; aGuard.clear(); @@ -2091,12 +2101,13 @@ Any SAL_CALL CachedContentResultSet //if you change this function please pay attention to //function template rowOriginGet, where this is similar implemented - ReacquireableGuard aGuard( m_aMutex ); + osl::ResettableMutexGuard aGuard(m_aMutex); sal_Int32 nRow = m_nRow; sal_Int32 nFetchSize = m_nFetchSize; sal_Int32 nFetchDirection = m_nFetchDirection; if( !m_aCache.hasRow( nRow ) ) { + bool isCleared = false; if( !m_aCache.hasCausedException( nRow ) ) { if( !m_xFetchProvider.is() ) @@ -2104,11 +2115,15 @@ Any SAL_CALL CachedContentResultSet OSL_FAIL( "broadcaster was disposed already" ); return Any(); } + isCleared = true; aGuard.clear(); impl_fetchData( nRow, nFetchSize, nFetchDirection ); } - aGuard.reacquire(); + if (isCleared) + { + aGuard.reset(); + } if( !m_aCache.hasRow( nRow ) ) { m_bLastReadWasFromCache = false; diff --git a/ucb/source/cacher/contentresultsetwrapper.cxx b/ucb/source/cacher/contentresultsetwrapper.cxx index 9604e8e..c1dd34a 100644 --- a/ucb/source/cacher/contentresultsetwrapper.cxx +++ b/ucb/source/cacher/contentresultsetwrapper.cxx @@ -348,7 +348,8 @@ void SAL_CALL ContentResultSetWrapper::dispose() { impl_EnsureNotDisposed(); - ReacquireableGuard aGuard( m_aMutex ); + bool isCleared = false; + osl::ResettableMutexGuard aGuard(m_aMutex); if( m_bInDispose || m_bDisposed ) return; m_bInDispose = true; @@ -356,6 +357,7 @@ void SAL_CALL ContentResultSetWrapper::dispose() if( m_xPropertySetOrigin.is() ) { aGuard.clear(); + isCleared = true; try { m_xPropertySetOrigin->removePropertyChangeListener( @@ -380,37 +382,55 @@ void SAL_CALL ContentResultSetWrapper::dispose() xComponentOrigin->removeEventListener( static_cast< XPropertyChangeListener * >( m_pMyListenerImpl ) ); } - aGuard.reacquire(); + if (isCleared) + { + aGuard.reset(); + isCleared = false; + } if( m_pDisposeEventListeners && m_pDisposeEventListeners->getLength() ) { EventObject aEvt; aEvt.Source = static_cast< XComponent * >( this ); aGuard.clear(); + isCleared = true; m_pDisposeEventListeners->disposeAndClear( aEvt ); } - aGuard.reacquire(); + if (isCleared) + { + aGuard.reset(); + isCleared = false; + } if( m_pPropertyChangeListeners ) { EventObject aEvt; aEvt.Source = static_cast< XPropertySet * >( this ); aGuard.clear(); + isCleared = true; m_pPropertyChangeListeners->disposeAndClear( aEvt ); } - aGuard.reacquire(); + if (isCleared) + { + aGuard.reset(); + isCleared = false; + } if( m_pVetoableChangeListeners ) { EventObject aEvt; aEvt.Source = static_cast< XPropertySet * >( this ); aGuard.clear(); + isCleared = true; m_pVetoableChangeListeners->disposeAndClear( aEvt ); } - aGuard.reacquire(); + if (isCleared) + { + aGuard.reset(); + } m_bDisposed = true; m_bInDispose = false; } @@ -464,7 +484,7 @@ Reference< XResultSetMetaData > SAL_CALL ContentResultSetWrapper::getMetaData() { impl_EnsureNotDisposed(); - ReacquireableGuard aGuard( m_aMutex ); + osl::ResettableMutexGuard aGuard(m_aMutex); if( !m_xMetaDataFromOrigin.is() && m_xResultSetOrigin.is() ) { Reference< XResultSetMetaDataSupplier > xMetaDataSupplier( @@ -477,7 +497,7 @@ Reference< XResultSetMetaData > SAL_CALL ContentResultSetWrapper::getMetaData() Reference< XResultSetMetaData > xMetaData = xMetaDataSupplier->getMetaData(); - aGuard.reacquire(); + aGuard.reset(); m_xMetaDataFromOrigin = xMetaData; } } diff --git a/ucb/source/cacher/contentresultsetwrapper.hxx b/ucb/source/cacher/contentresultsetwrapper.hxx index 3d48587..eb063c7 100644 --- a/ucb/source/cacher/contentresultsetwrapper.hxx +++ b/ucb/source/cacher/contentresultsetwrapper.hxx @@ -51,45 +51,6 @@ protected: typedef cppu::OMultiTypeInterfaceContainerHelperVar<OUString> PropertyChangeListenerContainer_Impl; - class ReacquireableGuard - { - protected: - osl::Mutex* pT; - public: - - ReacquireableGuard(osl::Mutex& t) : pT(&t) - { - pT->acquire(); - } - - /** Releases mutex. */ - ~ReacquireableGuard() - { - if (pT) - pT->release(); - } - - /** Releases mutex. */ - void clear() - { - if(pT) - { - pT->release(); - pT = nullptr; - } - } - - /** Reacquire mutex. */ - void reacquire() - { - if(pT) - { - pT->acquire(); - } - } - }; - - //members //my Mutex _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits