Kaydet (Commit) 436c0fc9 authored tarafından Stephan Bergmann's avatar Stephan Bergmann

Simplify InternalStreamLock instance handling

Change-Id: Id5bd445ad4f2397cbff01099ba3779736bb47e61
üst b29c078c
...@@ -42,9 +42,11 @@ using namespace osl; ...@@ -42,9 +42,11 @@ using namespace osl;
// InternalLock ---------------------------------------------------------------- // InternalLock ----------------------------------------------------------------
namespace { struct LockMutex : public rtl::Static< osl::Mutex, LockMutex > {}; } namespace {
class InternalStreamLock struct LockMutex : public rtl::Static< osl::Mutex, LockMutex > {};
struct InternalStreamLock
{ {
sal_Size m_nStartPos; sal_Size m_nStartPos;
sal_Size m_nEndPos; sal_Size m_nEndPos;
...@@ -53,14 +55,9 @@ class InternalStreamLock ...@@ -53,14 +55,9 @@ class InternalStreamLock
InternalStreamLock( sal_Size, sal_Size, SvFileStream* ); InternalStreamLock( sal_Size, sal_Size, SvFileStream* );
~InternalStreamLock(); ~InternalStreamLock();
public:
static bool LockFile( sal_Size nStart, sal_Size nEnd, SvFileStream* );
static void UnlockFile( sal_Size nStart, sal_Size nEnd, SvFileStream* );
}; };
typedef ::std::vector< InternalStreamLock* > InternalStreamLockList; struct LockList : public rtl::Static< std::vector<InternalStreamLock>, LockList > {};
namespace { struct LockList : public rtl::Static< InternalStreamLockList, LockList > {}; }
InternalStreamLock::InternalStreamLock( InternalStreamLock::InternalStreamLock(
sal_Size nStart, sal_Size nStart,
...@@ -71,7 +68,6 @@ InternalStreamLock::InternalStreamLock( ...@@ -71,7 +68,6 @@ InternalStreamLock::InternalStreamLock(
m_pStream( pStream ) m_pStream( pStream )
{ {
osl::DirectoryItem::get( m_pStream->GetFileName(), m_aItem ); osl::DirectoryItem::get( m_pStream->GetFileName(), m_aItem );
LockList::get().push_back( this );
#if OSL_DEBUG_LEVEL > 1 #if OSL_DEBUG_LEVEL > 1
OString aFileName(OUStringToOString(m_pStream->GetFileName(), OString aFileName(OUStringToOString(m_pStream->GetFileName(),
osl_getThreadTextEncoding())); osl_getThreadTextEncoding()));
...@@ -84,15 +80,6 @@ InternalStreamLock::InternalStreamLock( ...@@ -84,15 +80,6 @@ InternalStreamLock::InternalStreamLock(
InternalStreamLock::~InternalStreamLock() InternalStreamLock::~InternalStreamLock()
{ {
for ( InternalStreamLockList::iterator it = LockList::get().begin();
it != LockList::get().end();
++it
) {
if ( this == *it ) {
LockList::get().erase( it );
break;
}
}
#if OSL_DEBUG_LEVEL > 1 #if OSL_DEBUG_LEVEL > 1
OString aFileName(OUStringToOString(m_pStream->GetFileName(), OString aFileName(OUStringToOString(m_pStream->GetFileName(),
osl_getThreadTextEncoding())); osl_getThreadTextEncoding()));
...@@ -103,9 +90,8 @@ InternalStreamLock::~InternalStreamLock() ...@@ -103,9 +90,8 @@ InternalStreamLock::~InternalStreamLock()
#endif #endif
} }
bool InternalStreamLock::LockFile( sal_Size nStart, sal_Size nEnd, SvFileStream* pStream ) bool lockFile( sal_Size nStart, sal_Size nEnd, SvFileStream* pStream )
{ {
osl::MutexGuard aGuard( LockMutex::get() );
osl::DirectoryItem aItem; osl::DirectoryItem aItem;
if (osl::DirectoryItem::get( pStream->GetFileName(), aItem) != osl::FileBase::E_None ) if (osl::DirectoryItem::get( pStream->GetFileName(), aItem) != osl::FileBase::E_None )
{ {
...@@ -122,15 +108,15 @@ bool InternalStreamLock::LockFile( sal_Size nStart, sal_Size nEnd, SvFileStream* ...@@ -122,15 +108,15 @@ bool InternalStreamLock::LockFile( sal_Size nStart, sal_Size nEnd, SvFileStream*
if( aStatus.getFileType() == osl::FileStatus::Directory ) if( aStatus.getFileType() == osl::FileStatus::Directory )
return true; return true;
InternalStreamLock* pLock = NULL; osl::MutexGuard aGuard( LockMutex::get() );
InternalStreamLockList &rLockList = LockList::get(); std::vector<InternalStreamLock> &rLockList = LockList::get();
for( size_t i = 0; i < rLockList.size(); ++i ) for( std::vector<InternalStreamLock>::const_iterator i = rLockList.begin();
i != rLockList.end(); )
{ {
pLock = rLockList[ i ]; if( aItem.isIdenticalTo( i->m_aItem ) )
if( aItem.isIdenticalTo( pLock->m_aItem ) )
{ {
bool bDenyByOptions = false; bool bDenyByOptions = false;
StreamMode nLockMode = pLock->m_pStream->GetStreamMode(); StreamMode nLockMode = i->m_pStream->GetStreamMode();
StreamMode nNewMode = pStream->GetStreamMode(); StreamMode nNewMode = pStream->GetStreamMode();
if( nLockMode & STREAM_SHARE_DENYALL ) if( nLockMode & STREAM_SHARE_DENYALL )
...@@ -144,54 +130,43 @@ bool InternalStreamLock::LockFile( sal_Size nStart, sal_Size nEnd, SvFileStream* ...@@ -144,54 +130,43 @@ bool InternalStreamLock::LockFile( sal_Size nStart, sal_Size nEnd, SvFileStream*
if( bDenyByOptions ) if( bDenyByOptions )
{ {
if( pLock->m_nStartPos == 0 && pLock->m_nEndPos == 0 ) // whole file is already locked if( i->m_nStartPos == 0 && i->m_nEndPos == 0 ) // whole file is already locked
return false; return false;
if( nStart == 0 && nEnd == 0) // cannot lock whole file if( nStart == 0 && nEnd == 0) // cannot lock whole file
return false; return false;
if( ( nStart < pLock->m_nStartPos && nEnd > pLock->m_nStartPos ) || if( ( nStart < i->m_nStartPos && nEnd > i->m_nStartPos ) ||
( nStart < pLock->m_nEndPos && nEnd > pLock->m_nEndPos ) ) ( nStart < i->m_nEndPos && nEnd > i->m_nEndPos ) )
return false; return false;
} }
} }
} }
// hint: new InternalStreamLock() adds the entry to the global list rLockList.push_back( InternalStreamLock( nStart, nEnd, pStream ) );
new InternalStreamLock( nStart, nEnd, pStream );
return true; return true;
} }
void InternalStreamLock::UnlockFile( sal_Size nStart, sal_Size nEnd, SvFileStream* pStream ) void unlockFile( sal_Size nStart, sal_Size nEnd, SvFileStream* pStream )
{ {
osl::MutexGuard aGuard( LockMutex::get() ); osl::MutexGuard aGuard( LockMutex::get() );
InternalStreamLock* pLock = NULL; std::vector<InternalStreamLock> &rLockList = LockList::get();
InternalStreamLockList &rLockList = LockList::get(); for( std::vector<InternalStreamLock>::iterator i = rLockList.begin();
if( nStart == 0 && nEnd == 0 ) i != rLockList.end(); )
{ {
// nStart & nEnd = 0, so delete all locks if ( i->m_pStream == pStream
for( size_t i = 0; i < rLockList.size(); ++i ) && ( ( nStart == 0 && nEnd == 0 )
|| ( i->m_nStartPos == nStart && i->m_nEndPos == nEnd ) ) )
{ {
if( ( pLock = rLockList[ i ] )->m_pStream == pStream ) i = rLockList.erase(i);
{
// hint: delete will remove pLock from the global list
delete pLock;
i--;
}
} }
return; else
} {
for( size_t i = 0; i < rLockList.size(); ++i ) ++i;
{
if ( ( pLock = rLockList[ i ] )->m_pStream == pStream
&& nStart == pLock->m_nStartPos
&& nEnd == pLock->m_nEndPos
) {
// hint: delete will remove pLock from the global list
delete pLock;
return;
} }
} }
} }
}
// StreamData ------------------------------------------------------------------ // StreamData ------------------------------------------------------------------
class StreamData class StreamData
...@@ -325,7 +300,7 @@ SvFileStream::~SvFileStream() ...@@ -325,7 +300,7 @@ SvFileStream::~SvFileStream()
{ {
Close(); Close();
InternalStreamLock::UnlockFile( 0, 0, this ); unlockFile( 0, 0, this );
if (pInstanceData) if (pInstanceData)
delete pInstanceData; delete pInstanceData;
...@@ -451,7 +426,7 @@ bool SvFileStream::LockRange( sal_Size nByteOffset, sal_Size nBytes ) ...@@ -451,7 +426,7 @@ bool SvFileStream::LockRange( sal_Size nByteOffset, sal_Size nBytes )
if (!nLockMode) if (!nLockMode)
return true; return true;
if( ! InternalStreamLock::LockFile( nByteOffset, nByteOffset+nBytes, this ) ) if( !lockFile( nByteOffset, nByteOffset+nBytes, this ) )
{ {
#if OSL_DEBUG_LEVEL > 1 #if OSL_DEBUG_LEVEL > 1
fprintf( stderr, "InternalLock on %s [ %ld ... %ld ] failed\n", fprintf( stderr, "InternalLock on %s [ %ld ... %ld ] failed\n",
...@@ -468,7 +443,7 @@ bool SvFileStream::UnlockRange( sal_Size nByteOffset, sal_Size nBytes ) ...@@ -468,7 +443,7 @@ bool SvFileStream::UnlockRange( sal_Size nByteOffset, sal_Size nBytes )
if ( ! IsOpen() ) if ( ! IsOpen() )
return false; return false;
InternalStreamLock::UnlockFile( nByteOffset, nByteOffset+nBytes, this ); unlockFile( nByteOffset, nByteOffset+nBytes, this );
return true; return true;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment