Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
core
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
LibreOffice
core
Commits
436c0fc9
Kaydet (Commit)
436c0fc9
authored
Şub 07, 2014
tarafından
Stephan Bergmann
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
Simplify InternalStreamLock instance handling
Change-Id: Id5bd445ad4f2397cbff01099ba3779736bb47e61
üst
b29c078c
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
32 additions
and
57 deletions
+32
-57
strmunx.cxx
tools/source/stream/strmunx.cxx
+32
-57
No files found.
tools/source/stream/strmunx.cxx
Dosyayı görüntüle @
436c0fc9
...
@@ -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
::
L
ockFile
(
sal_Size
nStart
,
sal_Size
nEnd
,
SvFileStream
*
pStream
)
bool
l
ockFile
(
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
::
U
nlockFile
(
sal_Size
nStart
,
sal_Size
nEnd
,
SvFileStream
*
pStream
)
void
u
nlockFile
(
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
::
U
nlockFile
(
0
,
0
,
this
);
u
nlockFile
(
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
::
L
ockFile
(
nByteOffset
,
nByteOffset
+
nBytes
,
this
)
)
if
(
!
l
ockFile
(
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
::
U
nlockFile
(
nByteOffset
,
nByteOffset
+
nBytes
,
this
);
u
nlockFile
(
nByteOffset
,
nByteOffset
+
nBytes
,
this
);
return
true
;
return
true
;
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment