- Fixed a race condition that happened when LZMA compression finished and occasionally deadlocked the next call (solid installers weren't affected, just the compiler)

- Added try and catch for LZMA just in case one of the rare exceptions will be thrown (just compiler)


git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@3233 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
kichik 2003-11-30 16:02:48 +00:00
parent 164f6462b3
commit 58ea8200ba
2 changed files with 35 additions and 40 deletions

View file

@ -139,16 +139,15 @@ int __stdcall lzmaDecompress(CLZMAStateP lzmaState)
EnterCriticalSection(&lzmaState->cs); EnterCriticalSection(&lzmaState->cs);
lzmaState->it_locked = TRUE; lzmaState->it_locked = TRUE;
if (lzmaState->finished)
{
LeaveCriticalSection(&lzmaState->cs);
return lzmaState->res;
}
while (lzmaState->dt_locked) while (lzmaState->dt_locked)
{
if (lzmaState->finished)
{
LeaveCriticalSection(&lzmaState->cs);
return lzmaState->res;
}
Sleep(0); Sleep(0);
}
return 0; return 0;
} }

View file

@ -31,7 +31,6 @@ private:
BOOL finish; BOOL finish;
CRITICAL_SECTION cs; CRITICAL_SECTION cs;
BOOL cs_initialized;
BOOL nt_locked; /* nsis thread locked */ BOOL nt_locked; /* nsis thread locked */
BOOL ct_locked; /* compression thread locked */ BOOL ct_locked; /* compression thread locked */
BOOL compressor_finished; BOOL compressor_finished;
@ -43,20 +42,17 @@ public:
{ {
_encoder = new NCompress::NLZMA::CEncoder(); _encoder = new NCompress::NLZMA::CEncoder();
_encoder->SetWriteEndMarkerMode(true); _encoder->SetWriteEndMarkerMode(true);
cs_initialized = FALSE;
hCompressionThread = NULL; hCompressionThread = NULL;
compressor_finished = FALSE; compressor_finished = FALSE;
finish = FALSE; finish = FALSE;
End(); End();
InitializeCriticalSection(&cs);
} }
~CLZMA() ~CLZMA()
{ {
End(); End();
if (cs_initialized) DeleteCriticalSection(&cs);
{
DeleteCriticalSection(&cs);
}
if (_encoder) if (_encoder)
{ {
delete _encoder; delete _encoder;
@ -68,12 +64,6 @@ public:
{ {
End(); End();
if (!cs_initialized)
{
InitializeCriticalSection(&cs);
cs_initialized = TRUE;
}
nt_locked = TRUE; nt_locked = TRUE;
ct_locked = FALSE; ct_locked = FALSE;
@ -130,27 +120,34 @@ public:
while (nt_locked) while (nt_locked)
Sleep(0); Sleep(0);
if (_encoder->WriteCoderProperties(this) == S_OK) try
{ {
while (true) if (_encoder->WriteCoderProperties(this) == S_OK)
{ {
UINT64 inSize, outSize; while (true)
INT32 finished;
if (_encoder->CodeOneBlock(&inSize, &outSize, &finished))
{ {
res = -2; UINT64 inSize, outSize;
break; INT32 finished;
} if (_encoder->CodeOneBlock(&inSize, &outSize, &finished))
if (finished) {
{ res = -2;
res = C_OK; break;
break; }
if (finished)
{
res = C_OK;
break;
}
} }
} }
else
{
res = -2;
}
} }
else catch (...)
{ {
res = -2; res = -3;
} }
compressor_finished = TRUE; compressor_finished = TRUE;
@ -185,16 +182,15 @@ public:
EnterCriticalSection(&cs); EnterCriticalSection(&cs);
nt_locked = TRUE; nt_locked = TRUE;
while (ct_locked) if (compressor_finished)
{ {
if (compressor_finished) LeaveCriticalSection(&cs);
{ return res;
LeaveCriticalSection(&cs);
return res;
}
Sleep(0);
} }
while (ct_locked)
Sleep(0);
return C_OK; return C_OK;
} }