Update to 7-Zip Version 21.02

This commit is contained in:
Tino Reichardt
2021-05-13 16:39:14 +02:00
parent 3724ecfedc
commit 48fa49f76c
620 changed files with 35032 additions and 10925 deletions

View File

@@ -20,17 +20,17 @@ static const unsigned kNumHuffPasses = 4;
bool CThreadInfo::Alloc()
{
if (m_BlockSorterIndex == 0)
if (!m_BlockSorterIndex)
{
m_BlockSorterIndex = (UInt32 *)::BigAlloc(BLOCK_SORT_BUF_SIZE(kBlockSizeMax) * sizeof(UInt32));
if (m_BlockSorterIndex == 0)
if (!m_BlockSorterIndex)
return false;
}
if (m_Block == 0)
if (!m_Block)
{
m_Block = (Byte *)::MidAlloc(kBlockSizeMax * 5 + kBlockSizeMax / 10 + (20 << 10));
if (m_Block == 0)
if (!m_Block)
return false;
m_MtfArray = m_Block + kBlockSizeMax;
m_TempArray = m_MtfArray + kBlockSizeMax * 2 + 2;
@@ -41,9 +41,9 @@ bool CThreadInfo::Alloc()
void CThreadInfo::Free()
{
::BigFree(m_BlockSorterIndex);
m_BlockSorterIndex = 0;
m_BlockSorterIndex = NULL;
::MidFree(m_Block);
m_Block = 0;
m_Block = NULL;
}
#ifndef _7ZIP_ST
@@ -53,15 +53,19 @@ static THREAD_FUNC_DECL MFThread(void *threadCoderInfo)
return ((CThreadInfo *)threadCoderInfo)->ThreadFunc();
}
#define RINOK_THREAD(x) { WRes __result_ = (x); if (__result_ != 0) return __result_; }
HRESULT CThreadInfo::Create()
{
RINOK_THREAD(StreamWasFinishedEvent.Create());
RINOK_THREAD(WaitingWasStartedEvent.Create());
RINOK_THREAD(CanWriteEvent.Create());
RINOK_THREAD(Thread.Create(MFThread, this));
return S_OK;
WRes wres = StreamWasFinishedEvent.Create();
if (wres == 0) { wres = WaitingWasStartedEvent.Create();
if (wres == 0) { wres = CanWriteEvent.Create();
if (wres == 0)
{
if (Encoder->_props.Affinity != 0)
wres = Thread.Create_With_Affinity(MFThread, this, (CAffinityMask)Encoder->_props.Affinity);
else
wres = Thread.Create(MFThread, this);
}}}
return HRESULT_FROM_WIN32(wres);
}
void CThreadInfo::FinishStream(bool needLeave)
@@ -74,7 +78,7 @@ void CThreadInfo::FinishStream(bool needLeave)
WaitingWasStartedEvent.Set();
}
DWORD CThreadInfo::ThreadFunc()
THREAD_FUNC_RET_TYPE CThreadInfo::ThreadFunc()
{
for (;;)
{
@@ -133,7 +137,7 @@ void CEncProps::Normalize(int level)
if (NumPasses > kNumPassesMax) NumPasses = kNumPassesMax;
if (BlockSizeMult == (UInt32)(Int32)-1)
BlockSizeMult = (level >= 5 ? 9 : (level >= 1 ? level * 2 - 1: 1));
BlockSizeMult = (level >= 5 ? 9 : (level >= 1 ? (unsigned)level * 2 - 1: 1));
if (BlockSizeMult < kBlockSizeMultMin) BlockSizeMult = kBlockSizeMultMin;
if (BlockSizeMult > kBlockSizeMultMax) BlockSizeMult = kBlockSizeMultMax;
}
@@ -143,7 +147,7 @@ CEncoder::CEncoder()
_props.Normalize(-1);
#ifndef _7ZIP_ST
ThreadsInfo = 0;
ThreadsInfo = NULL;
m_NumThreadsPrev = 0;
NumThreads = 1;
#endif
@@ -157,9 +161,14 @@ CEncoder::~CEncoder()
HRESULT CEncoder::Create()
{
RINOK_THREAD(CanProcessEvent.CreateIfNotCreated());
RINOK_THREAD(CanStartWaitingEvent.CreateIfNotCreated());
if (ThreadsInfo != 0 && m_NumThreadsPrev == NumThreads)
{
WRes wres = CanProcessEvent.CreateIfNotCreated_Reset();
if (wres == 0) { wres = CanStartWaitingEvent.CreateIfNotCreated_Reset(); }
if (wres != 0)
return HRESULT_FROM_WIN32(wres);
}
if (ThreadsInfo && m_NumThreadsPrev == NumThreads)
return S_OK;
try
{
@@ -167,7 +176,7 @@ HRESULT CEncoder::Create()
MtMode = (NumThreads > 1);
m_NumThreadsPrev = NumThreads;
ThreadsInfo = new CThreadInfo[NumThreads];
if (ThreadsInfo == 0)
if (!ThreadsInfo)
return E_OUTOFMEMORY;
}
catch(...) { return E_OUTOFMEMORY; }
@@ -199,11 +208,11 @@ void CEncoder::Free()
{
CThreadInfo &ti = ThreadsInfo[t];
if (MtMode)
ti.Thread.Wait();
ti.Thread.Wait_Close();
ti.Free();
}
delete []ThreadsInfo;
ThreadsInfo = 0;
ThreadsInfo = NULL;
}
#endif
@@ -745,9 +754,11 @@ HRESULT CEncoder::CodeReal(ISequentialInStream *inStream, ISequentialOutStream *
CThreadInfo &ti = ThreadsInfo[t];
if (MtMode)
{
RINOK(ti.StreamWasFinishedEvent.Reset());
RINOK(ti.WaitingWasStartedEvent.Reset());
RINOK(ti.CanWriteEvent.Reset());
WRes wres = ti.StreamWasFinishedEvent.Reset();
if (wres == 0) { wres = ti.WaitingWasStartedEvent.Reset();
if (wres == 0) { wres = ti.CanWriteEvent.Reset(); }}
if (wres != 0)
return HRESULT_FROM_WIN32(wres);
}
#else
CThreadInfo &ti = ThreadsInfo;
@@ -854,6 +865,16 @@ HRESULT CEncoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *c
{
const PROPVARIANT &prop = coderProps[i];
PROPID propID = propIDs[i];
if (propID == NCoderPropID::kAffinity)
{
if (prop.vt == VT_UI8)
props.Affinity = prop.uhVal.QuadPart;
else
return E_INVALIDARG;
continue;
}
if (propID >= NCoderPropID::kReduceSize)
continue;
if (prop.vt != VT_UI4)
@@ -863,7 +884,7 @@ HRESULT CEncoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *c
{
case NCoderPropID::kNumPasses: props.NumPasses = v; break;
case NCoderPropID::kDictionarySize: props.BlockSizeMult = v / kBlockSizeStep; break;
case NCoderPropID::kLevel: level = v; break;
case NCoderPropID::kLevel: level = (int)v; break;
case NCoderPropID::kNumThreads:
{
#ifndef _7ZIP_ST