Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/kornelski/7z.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'CPP/7zip/Compress/BZip2/BZip2Decoder.cpp')
-rwxr-xr-xCPP/7zip/Compress/BZip2/BZip2Decoder.cpp30
1 files changed, 18 insertions, 12 deletions
diff --git a/CPP/7zip/Compress/BZip2/BZip2Decoder.cpp b/CPP/7zip/Compress/BZip2/BZip2Decoder.cpp
index 3f7dbc58..47ffa7c8 100755
--- a/CPP/7zip/Compress/BZip2/BZip2Decoder.cpp
+++ b/CPP/7zip/Compress/BZip2/BZip2Decoder.cpp
@@ -432,10 +432,12 @@ CDecoder::~CDecoder()
Free();
}
-HRes CDecoder::Create()
+#define RINOK_THREAD(x) { WRes __result_ = (x); if(__result_ != 0) return __result_; }
+
+HRESULT CDecoder::Create()
{
- RINOK(CanProcessEvent.CreateIfNotCreated());
- RINOK(CanStartWaitingEvent.CreateIfNotCreated());
+ RINOK_THREAD(CanProcessEvent.CreateIfNotCreated());
+ RINOK_THREAD(CanStartWaitingEvent.CreateIfNotCreated());
if (m_States != 0 && m_NumThreadsPrev == NumThreads)
return S_OK;
Free();
@@ -454,7 +456,7 @@ HRes CDecoder::Create()
ti.Decoder = this;
if (MtMode)
{
- HRes res = ti.Create();
+ HRESULT res = ti.Create();
if (res != S_OK)
{
NumThreads = t;
@@ -524,9 +526,12 @@ HRESULT CDecoder::DecodeFile(bool &isBZ, ICompressProgressInfo *progress)
CState &s = m_States[t];
if (!s.Alloc())
return E_OUTOFMEMORY;
- s.StreamWasFinishedEvent.Reset();
- s.WaitingWasStartedEvent.Reset();
- s.CanWriteEvent.Reset();
+ if (MtMode)
+ {
+ RINOK(s.StreamWasFinishedEvent.Reset());
+ RINOK(s.WaitingWasStartedEvent.Reset());
+ RINOK(s.CanWriteEvent.Reset());
+ }
}
#else
if (!m_States[0].Alloc())
@@ -647,12 +652,13 @@ STDMETHODIMP CDecoder::GetInStreamProcessedSize(UInt64 *value)
static THREAD_FUNC_DECL MFThread(void *p) { ((CState *)p)->ThreadFunc(); return 0; }
-HRes CState::Create()
+HRESULT CState::Create()
{
- RINOK(StreamWasFinishedEvent.CreateIfNotCreated());
- RINOK(WaitingWasStartedEvent.CreateIfNotCreated());
- RINOK(CanWriteEvent.CreateIfNotCreated());
- return Thread.Create(MFThread, this);
+ RINOK_THREAD(StreamWasFinishedEvent.CreateIfNotCreated());
+ RINOK_THREAD(WaitingWasStartedEvent.CreateIfNotCreated());
+ RINOK_THREAD(CanWriteEvent.CreateIfNotCreated());
+ RINOK_THREAD(Thread.Create(MFThread, this));
+ return S_OK;
}
void CState::FinishStream()