Ejemplo n.º 1
0
            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;
                }
            }
Ejemplo n.º 2
0
            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);
                    }
                }
            }
Ejemplo n.º 3
0
            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);
                    }
                }
            }