internal void BtFillBlock(uint globalBlockIndex) { CMtSync sync = mHashSync; if (!sync.mNeedStart) { CriticalSection_Enter(sync.mCS); sync.mCsWasEntered = true; } BtGetMatches(mBtBuf + (globalBlockIndex & kMtBtNumBlocksMask) * kMtBtBlockSize); if (mLocalPos > kMtMaxValForNormalize - kMtBtBlockSize) { uint subValue = mLocalPos - mLocalCyclicBufferSize; CMatchFinder.MatchFinder_Normalize3(subValue, mLocalSon, mLocalCyclicBufferSize * 2); mLocalPos -= subValue; } if (!sync.mNeedStart) { CriticalSection_Leave(sync.mCS); sync.mCsWasEntered = false; } }
internal void BtThreadFunc() { CMtSync p = mBtSync; for (;;) { Event_Wait(p.mCanStart); Event_Set(p.mWasStarted); uint blockIndex = 0; for (;;) { if (p.mExit) { return; } Trace.MatchObjectWait(p, "BtThreadFunc:stop"); if (p.mStopWriting) { Trace.MatchObjectWait(p, "BtThreadFunc:stop"); p.mNumProcessedBlocks = blockIndex; mHashSync.MtSync_StopWriting(); Event_Set(p.mWasStopped); break; } Trace.MatchObjectWait(p, "BtThreadFunc:stop"); Semaphore_Wait(p.mFreeSemaphore); BtFillBlock(blockIndex++); Semaphore_Release1(p.mFilledSemaphore); } } }
internal void HashThreadFunc() { CMtSync p = mHashSync; for (;;) { uint numProcessedBlocks = 0; Event_Wait(p.mCanStart); Event_Set(p.mWasStarted); for (;;) { if (p.mExit) { return; } Trace.MatchObjectWait(p, "HashThreadFunc:stop"); if (p.mStopWriting) { Trace.MatchObjectWait(p, "HashThreadFunc:stop"); p.mNumProcessedBlocks = numProcessedBlocks; Event_Set(p.mWasStopped); break; } Trace.MatchObjectWait(p, "HashThreadFunc:stop"); if (base.MatchFinder_NeedMove()) { CriticalSection_Enter(mBtSync.mCS); CriticalSection_Enter(mHashSync.mCS); { P <byte> beforePtr = base.MatchFinder_GetPointerToCurrentPos(); base.MatchFinder_MoveBlock(); P <byte> afterPtr = base.MatchFinder_GetPointerToCurrentPos(); mPointerToCurPos -= beforePtr - afterPtr; mLocalBuffer -= beforePtr - afterPtr; } CriticalSection_Leave(mBtSync.mCS); CriticalSection_Leave(mHashSync.mCS); continue; } Semaphore_Wait(p.mFreeSemaphore); base.MatchFinder_ReadIfRequired(); if (base.mPos > (kMtMaxValForNormalize - kMtHashBlockSize)) { uint subValue = (base.mPos - base.mHistorySize - 1); base.MatchFinder_ReduceOffsets(subValue); CMatchFinder.MatchFinder_Normalize3(subValue, P.From(base.mHash, base.mFixedHashSize), base.mHashMask + 1); } P <uint> heads = P.From(mHashBuf, ((numProcessedBlocks++) & kMtHashNumBlocksMask) * kMtHashBlockSize); uint num = base.mStreamPos - base.mPos; heads[0] = 2; heads[1] = num; if (num >= base.mNumHashBytes) { num = num - base.mNumHashBytes + 1; if (num > kMtHashBlockSize - 2) { num = kMtHashBlockSize - 2; } mInterface.GetHeadsFunc(base.mBuffer, base.mPos, P.From(base.mHash, base.mFixedHashSize), base.mHashMask, heads + 2, num); heads[0] += num; } base.mPos += num; base.mBuffer += num; Semaphore_Release1(p.mFilledSemaphore); } } }