亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mt.cpp

?? 壓縮軟件源碼
?? CPP
字號:
// MT.cpp

#include "StdAfx.h"

#include "../../../../Common/Alloc.h"

#include "MT.h"

class CMatchFinderCallback: 
  public IMatchFinderCallback,
  public CMyUnknownImp
{
  MY_UNKNOWN_IMP

  STDMETHOD(BeforeChangingBufferPos)();
  STDMETHOD(AfterChangingBufferPos)();
public:
  CMatchFinderMT *m_MatchFinderMT;
  const Byte *m_BufferPosBefore;
};

STDMETHODIMP CMatchFinderCallback::BeforeChangingBufferPos()
{
  m_MatchFinderMT->m_AskChangeBufferPos.Set();
  m_MatchFinderMT->m_CanChangeBufferPos.Lock();
  m_BufferPosBefore = m_MatchFinderMT->m_MatchFinder->GetPointerToCurrentPos();
  return S_OK;
}

STDMETHODIMP CMatchFinderCallback::AfterChangingBufferPos()
{
  m_MatchFinderMT->m_DataCurrentPos += 
      m_MatchFinderMT->m_MatchFinder->GetPointerToCurrentPos() - m_BufferPosBefore;
  m_MatchFinderMT->m_BufferPosWasChanged.Set();
  return S_OK;
}

HRESULT CMatchFinderMT::SetMatchFinder(IMatchFinder *matchFinder, 
    UInt32 multiThreadMult)
{
  _multiThreadMult = multiThreadMult;
  m_MatchFinder = matchFinder;
  CMyComPtr<IMatchFinderSetCallback> matchFinderSetCallback;
  if (m_MatchFinder.QueryInterface(IID_IMatchFinderSetCallback, 
      &matchFinderSetCallback) == S_OK)
  {
    CMatchFinderCallback *matchFinderCallbackSpec = 
        new CMatchFinderCallback;
    CMyComPtr<IMatchFinderCallback> matchFinderCallback = matchFinderCallbackSpec;
    matchFinderCallbackSpec->m_MatchFinderMT = this;
    matchFinderSetCallback->SetCallback(matchFinderCallback);
    return S_OK;
  }
  else
    return E_FAIL;
}


STDMETHODIMP CMatchFinderMT::Init(ISequentialInStream *s)
{ 
  m_AskChangeBufferPos.Reset();
  m_CanChangeBufferPos.Reset();
  m_BufferPosWasChanged.Reset();
  m_StopWriting.Reset();
  m_WritingWasStopped.Reset();
  m_NeedStart = true;
  m_CurrentPos = 0;
  m_CurrentLimitPos = 0;

  HRESULT result = m_MatchFinder->Init(s);
  if (result == S_OK)
    m_DataCurrentPos = m_MatchFinder->GetPointerToCurrentPos();
  return result; 
}

STDMETHODIMP_(void) CMatchFinderMT::ReleaseStream()
{ 
  m_StopWriting.Set();
  m_WritingWasStopped.Lock();
  m_MatchFinder->ReleaseStream(); 
}

STDMETHODIMP CMatchFinderMT::MovePos()
{ 
  if (m_Result != S_OK)
    return m_Result;
  m_NumAvailableBytesCurrent--;
  m_DataCurrentPos++;
  return S_OK; 
}

STDMETHODIMP_(Byte) CMatchFinderMT::GetIndexByte(Int32 index)
{ 
  return m_DataCurrentPos[index]; 
}

STDMETHODIMP_(UInt32) CMatchFinderMT::GetMatchLen(Int32 index, 
    UInt32 distance, UInt32 limit)
{ 
  if (int(index + limit) > m_NumAvailableBytesCurrent)
    limit = m_NumAvailableBytesCurrent - (index);
  distance++;
  const Byte *pby = m_DataCurrentPos + index;
  UInt32 i;
  for(i = 0; i < limit && pby[i] == pby[i - distance]; i++);
  return i;
}

STDMETHODIMP_(const Byte *) CMatchFinderMT::GetPointerToCurrentPos()
{
  return m_DataCurrentPos;
}


STDMETHODIMP_(UInt32) CMatchFinderMT::GetNumAvailableBytes()
{ 
  if (m_NeedStart)
    return m_MatchFinder->GetNumAvailableBytes(); 
  else
    return m_NumAvailableBytesCurrent;
}
  
void CMatchFinderMT::FreeMem()
{
  MyFree(m_Buffer);
  MyFree(m_DummyBuffer);
}

STDMETHODIMP CMatchFinderMT::Create(UInt32 sizeHistory, 
      UInt32 keepAddBufferBefore, UInt32 matchMaxLen, 
      UInt32 keepAddBufferAfter)
{ 
  FreeMem();
  m_MatchMaxLen = matchMaxLen;

  m_BlockSize = (matchMaxLen + 1) * _multiThreadMult;
  UInt32 bufferSize = m_BlockSize * kNumMTBlocks;
  m_DummyBuffer = (UInt32 *)MyAlloc((matchMaxLen + 1) * sizeof(UInt32));
  if (m_DummyBuffer == 0)
    return E_OUTOFMEMORY;
  m_Buffer = (UInt32 *)MyAlloc(bufferSize * sizeof(UInt32));
  if (m_Buffer == 0)
    return E_OUTOFMEMORY;
  for (int i = 0; i < kNumMTBlocks; i++)
    m_Buffers[i] = &m_Buffer[i * m_BlockSize];

  m_NeedStart = true;
  m_CurrentPos = 0;
  m_CurrentLimitPos = 0;

  keepAddBufferBefore += bufferSize;

  return m_MatchFinder->Create(sizeHistory, keepAddBufferBefore, matchMaxLen, 
      keepAddBufferAfter); 
}

static DWORD WINAPI MFThread(void *threadCoderInfo)
{
  CMatchFinderMT &mt = *(CMatchFinderMT *)threadCoderInfo;
  return mt.ThreadFunc();
}

DWORD CMatchFinderMT::ThreadFunc()
{
  bool errorMode = false;
  while (true)
  {
    HANDLE events[3] = { m_ExitEvent, m_StopWriting, m_CanWriteEvents[m_WriteBufferIndex] } ;
    DWORD waitResult = ::WaitForMultipleObjects((errorMode ? 2: 3), events, FALSE, INFINITE);
    if (waitResult == WAIT_OBJECT_0 + 0)
      return 0;
    if (waitResult == WAIT_OBJECT_0 + 1)
    {
      m_WriteBufferIndex = 0;
      for (int i = 0; i < kNumMTBlocks; i++)
        m_CanWriteEvents[i].Reset();
      m_WritingWasStopped.Set();
      errorMode = false;
      continue;
    }
    if (errorMode)
    {
      // this case means bug_in_program. So just exit;
      return 1;
    }

    m_Results[m_WriteBufferIndex] = S_OK;
    UInt32 *buffer = m_Buffers[m_WriteBufferIndex];
    UInt32 curPos = 0;
    UInt32 numBytes = 0;
    UInt32 limit = m_BlockSize - m_MatchMaxLen;
    IMatchFinder *mf = m_MatchFinder;
    do 
    {
      if (mf->GetNumAvailableBytes() == 0)
        break;
      UInt32 len = mf->GetLongestMatch(buffer + curPos);
      /*
      if (len == 1)
        len = 0;
      */
      buffer[curPos] = len;
      curPos += len + 1;
      numBytes++;
      HRESULT result = mf->MovePos();
      if (result != S_OK)
      {
        m_Results[m_WriteBufferIndex] = result;
        errorMode = true;
        break;
      }
    }
    while (curPos < limit);
    m_LimitPos[m_WriteBufferIndex] = curPos;
    if (errorMode)
      m_NumAvailableBytes[m_WriteBufferIndex] = numBytes;
    else
      m_NumAvailableBytes[m_WriteBufferIndex] = numBytes + 
          mf->GetNumAvailableBytes();
    m_CanReadEvents[m_WriteBufferIndex].Set();
    if (++m_WriteBufferIndex == kNumMTBlocks)
      m_WriteBufferIndex = 0;
  }
}

CMatchFinderMT::CMatchFinderMT():
  m_Buffer(0),
  m_DummyBuffer(0),
  _multiThreadMult(100)
{
  for (int i = 0; i < kNumMTBlocks; i++)
  {
    m_CanReadEvents[i].Reset();
    m_CanWriteEvents[i].Reset();
  }
  m_ReadBufferIndex = 0;
  m_WriteBufferIndex = 0;

  m_ExitEvent.Reset();
  if (!m_Thread.Create(MFThread, this))
    throw 271826;
}

CMatchFinderMT::~CMatchFinderMT() 
{
  m_ExitEvent.Set();
  m_Thread.Wait();
  FreeMem();
}

void CMatchFinderMT::Start()
{
  m_AskChangeBufferPos.Reset();
  m_CanChangeBufferPos.Reset();
  m_BufferPosWasChanged.Reset();

  m_WriteBufferIndex = 0;
  m_ReadBufferIndex = 0;
  m_NeedStart = false;
  m_CurrentPos = 0;
  m_CurrentLimitPos = 0;
  m_Result = S_OK;
  int i;
  for (i = 0; i < kNumMTBlocks; i++)
    m_CanReadEvents[i].Reset();
  for (i = kNumMTBlocks - 1; i >= 0; i--)
    m_CanWriteEvents[i].Set();
}

STDMETHODIMP_(UInt32) CMatchFinderMT::GetLongestMatch(UInt32 *distances)
{ 
  if (m_CurrentPos == m_CurrentLimitPos)
  {
    if (m_NeedStart)
      Start();
    while (true)
    {
      HANDLE events[2] = { m_AskChangeBufferPos, m_CanReadEvents[m_ReadBufferIndex] } ;
      DWORD waitResult = ::WaitForMultipleObjects(2, events, FALSE, INFINITE);
      if (waitResult == WAIT_OBJECT_0 + 1)
        break;
      m_BufferPosWasChanged.Reset();
      m_CanChangeBufferPos.Set();
      m_BufferPosWasChanged.Lock();
    }
    
    m_CurrentLimitPos = m_LimitPos[m_ReadBufferIndex];
    m_NumAvailableBytesCurrent = m_NumAvailableBytes[m_ReadBufferIndex];
    m_CurrentPos = 0;
    m_Result = m_Results[m_ReadBufferIndex];
  }
  /*
  if (m_CurrentPos >= m_CurrentLimitPos)
    throw 1123324;
  */
  const UInt32 *buffer = m_Buffers[m_ReadBufferIndex];
  UInt32 len = buffer[m_CurrentPos++];
  for (UInt32 i = 1; i <= len; i++)
    distances[i] = buffer[m_CurrentPos++];
  if (m_CurrentPos == m_CurrentLimitPos)
  {
    m_CanWriteEvents[m_ReadBufferIndex].Set();
    if (++m_ReadBufferIndex == kNumMTBlocks)
      m_ReadBufferIndex = 0;
  }
  return len;
}

STDMETHODIMP_(void) CMatchFinderMT::DummyLongestMatch()
{ 
  GetLongestMatch(m_DummyBuffer);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色哟哟精品一区| 色噜噜夜夜夜综合网| 日本中文一区二区三区| 亚洲国产一区二区a毛片| 亚洲欧美韩国综合色| 亚洲欧美在线aaa| 国产精品国产三级国产| 国产精品国产三级国产专播品爱网| 久久精品一区二区三区av| 久久精品综合网| 亚洲国产精品成人综合| 国产精品沙发午睡系列990531| 国产精品久久久一本精品| 亚洲欧洲日韩在线| 亚洲综合成人在线| 亚洲gay无套男同| 另类中文字幕网| 岛国精品在线观看| av网站免费线看精品| 91美女精品福利| 欧美日韩一区成人| 日韩精品一区二区在线| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 日韩视频在线永久播放| 一本大道久久a久久精二百| 欧美日韩亚洲综合一区二区三区| 国产黄人亚洲片| 国产自产视频一区二区三区| 国产一区二区导航在线播放| 国产美女视频一区| 国产女主播视频一区二区| 国产精品色在线| 亚洲夂夂婷婷色拍ww47| 日韩和欧美一区二区| 久久国产尿小便嘘嘘尿| 丁香网亚洲国际| 91极品视觉盛宴| 欧美一区二区三区四区高清 | 亚洲国产成人午夜在线一区| 一区二区三区四区视频精品免费 | 日本vs亚洲vs韩国一区三区| 国产剧情av麻豆香蕉精品| 99视频一区二区三区| 欧美人妖巨大在线| 久久久久久亚洲综合| 一区二区三区中文字幕精品精品| 视频一区视频二区在线观看| 国产精品综合一区二区三区| 91麻豆精品秘密| 欧美一区二区久久久| 亚洲国产成人午夜在线一区| 亚洲观看高清完整版在线观看 | 日韩欧美国产小视频| 国产精品视频看| 爽好多水快深点欧美视频| 国产精品一区二区无线| 欧美伊人精品成人久久综合97 | 亚洲另类在线一区| 美国毛片一区二区| 日本精品裸体写真集在线观看 | 久久蜜桃av一区精品变态类天堂| 亚洲精品一二三| 激情偷乱视频一区二区三区| 色菇凉天天综合网| 欧美国产欧美综合| 日韩av午夜在线观看| 99视频在线精品| 久久综合狠狠综合久久综合88 | 久久www免费人成看片高清| 国产激情91久久精品导航| 欧美日韩一区二区三区不卡| 欧美国产精品一区二区三区| 人人超碰91尤物精品国产| 91在线视频播放| 国产日韩三级在线| 免费观看一级特黄欧美大片| 91久久精品国产91性色tv| 日本一区二区三区免费乱视频 | 欧美在线综合视频| 久久精品网站免费观看| 奇米色一区二区三区四区| 色狠狠桃花综合| 成人免费在线播放视频| 国产69精品一区二区亚洲孕妇| 日韩欧美资源站| 亚洲成人av资源| 欧美性色黄大片手机版| 成人高清视频免费观看| 精品国产乱码久久久久久夜甘婷婷| 午夜激情综合网| 欧美性色欧美a在线播放| 亚洲精品高清在线| 91丨porny丨首页| 国产精品成人午夜| www.亚洲免费av| 中文字幕一区在线观看| 国产91在线看| 国产精品人人做人人爽人人添| 国产盗摄精品一区二区三区在线| 久久色中文字幕| 精品午夜久久福利影院 | 日韩av中文字幕一区二区| 欧美色窝79yyyycom| 一区二区三区中文字幕精品精品 | 4438x亚洲最大成人网| 欧美极品aⅴ影院| 不卡一区二区三区四区| 久久成人麻豆午夜电影| 国产亚洲精品精华液| 欧美午夜宅男影院| 国产精品996| 亚洲一区二区在线免费看| 精品福利一二区| 欧亚洲嫩模精品一区三区| 精品在线免费视频| 日韩理论片在线| 亚洲色图一区二区| 在线观看国产一区二区| www.日韩大片| 亚洲日本中文字幕区| 91久久精品一区二区| 天天综合网天天综合色| 欧美一级在线免费| 精品一区二区日韩| 国产农村妇女毛片精品久久麻豆| 99这里都是精品| 亚洲午夜精品17c| 日韩午夜av一区| 国产成人亚洲综合a∨婷婷图片| 国产精品女同互慰在线看| 94色蜜桃网一区二区三区| 亚洲成人av一区二区三区| 精品国产一区a| 成人app在线观看| 亚洲成人精品一区| 日韩精品一区二区三区swag| 风流少妇一区二区| 亚洲精品国产第一综合99久久| 88在线观看91蜜桃国自产| 精品一二三四区| 亚洲婷婷综合色高清在线| 欧美性生活大片视频| 激情欧美日韩一区二区| 亚洲色图一区二区| 日韩久久久精品| 国产精品一二三四| 欧美女孩性生活视频| 国产精品系列在线观看| 亚洲综合在线五月| 精品日韩一区二区三区免费视频| 国产a精品视频| 五月婷婷久久综合| 国产精品久久久久久户外露出| 欧美专区日韩专区| 国产精品影视天天线| 亚洲成人av在线电影| 日本一区二区成人| 在线电影欧美成精品| av爱爱亚洲一区| 麻豆国产91在线播放| 亚洲激情第一区| 国产欧美日韩久久| 日韩一区二区在线观看| 91一区一区三区| 国产一区二区三区香蕉| 亚洲大尺度视频在线观看| 中文在线资源观看网站视频免费不卡 | 中文字幕亚洲欧美在线不卡| 欧美一卡二卡在线| 国产精品私房写真福利视频| 中文字幕一区二区三区av| 国产91综合网| 樱桃视频在线观看一区| 日韩av午夜在线观看| 成人黄色网址在线观看| 欧美一级二级三级蜜桃| 国产精品不卡在线| 色综合久久中文字幕综合网| 欧美日韩国产综合视频在线观看| 久久美女艺术照精彩视频福利播放| 自拍av一区二区三区| 久久国产生活片100| 精品久久久久99| 91福利国产成人精品照片| 国产老女人精品毛片久久| 免费av网站大全久久| 亚洲成人av一区二区| 一区二区三区高清| 亚洲欧洲成人精品av97| 国产欧美日韩精品在线| 久久亚区不卡日本| 欧美大白屁股肥臀xxxxxx| 欧美日韩中文另类| 欧美日韩在线精品一区二区三区激情| bt7086福利一区国产| 成人av在线网站| 国产凹凸在线观看一区二区| 国产精品一区二区久久不卡| 激情综合五月天| 国产精品1区二区.|