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

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

?? btcontent.cpp

?? 最經典的bittorrent協議的實現的源碼
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
  return retval;}void btContent::CacheClean(size_t need){  BTCACHE *p, *pnext;  int f_flush = 0;  if( m_flush_failed ) FlushCache();  // try again  again:  for( p=m_cache_oldest; p && m_cache_size < m_cache_used + need; p=pnext ){    pnext = p->age_next;    if( f_flush ) FlushEntry(p);    if( !p->bc_f_flush ){      if( p->age_prev ) p->age_prev->age_next = p->age_next;      else m_cache_oldest = p->age_next;      if( p->age_next ) p->age_next->age_prev = p->age_prev;      else m_cache_newest = p->age_prev;      if( p->bc_prev ) p->bc_prev->bc_next = p->bc_next;      if( p->bc_next ) p->bc_next->bc_prev = p->bc_prev;      size_t idx = p->bc_off / m_piece_length;      if( p->bc_next && p->bc_next->bc_off / m_piece_length == idx )        m_cache[idx] = p->bc_next;      else m_cache[idx] = (BTCACHE *)0;      m_cache_used -= p->bc_len;      delete []p->bc_buf;      delete p;    }  }  if( m_cache_size < m_cache_used + need ){  // still not enough    if( m_cache_size < cfg_cache_size*1024*1024 ){  // can alloc more      m_cache_size = (m_cache_used + need > cfg_cache_size*1024*1024) ?        cfg_cache_size*1024*1024 : (m_cache_used + need);    }    if( m_cache_size < m_cache_used + need && m_cache_used && !f_flush ){      if(arg_verbose) CONSOLE.Debug("CacheClean flushing to obtain space");      f_flush = 1;      goto again;    }  // else we tried...  }}// Don't call this function if cfg_cache_size==0 !void btContent::CacheEval(){  BTCACHE *p = m_cache_oldest;  size_t interval;  size_t unflushed = 0, dlnext, upadd = 0, upmax = 0, upmin = 0, total;  size_t rateup = Self.RateUL();  size_t ratedn = Self.RateDL();  size_t unchoked = WORLD.GetUnchoked();  // Time until next cache size eval: unchoke interval or time to dl a piece.  if( ratedn ){    interval = m_piece_length / ratedn;    if( interval > WORLD.GetUnchokeInterval() )      interval = WORLD.GetUnchokeInterval();    else if( 0==interval ) interval = 1;  }else interval = WORLD.GetUnchokeInterval();  // Download: total unflushed data + data to dl before next eval  // Hold the first piece a bit to let uploading begin.  if( pBF->IsFull() ) dlnext = 0;  else{    if( pBF->Count() < 2 ) unflushed = m_cache_used;    else for( ; p; p = p->age_next )      if( p->bc_f_flush ) unflushed += p->bc_len;    // Make sure we can read back and check a completed piece.    dlnext = ratedn * interval + m_piece_length;    // Set a shorter interval if DL cache need is very high.    if( ratedn ){      size_t max =        (cfg_cache_size*1024*1024 - unflushed - m_piece_length) / ratedn;      if( interval > max ) interval = max;    }  }  // Upload: need enough to hold read/dl'd data until it can be sent  upmin = DEFAULT_SLICE_SIZE * unchoked;  upmax = cfg_cache_size*1024*1024;  if( pBF->IsFull() ){    // Seed mode.  All cache data is prefetched, and we don't normally need to    // keep prefetched data longer than 2.5 unchoke intervals.    if( rateup && unchoked ){      // A very slow peer can't possibly benefit from cache--don't grow for it.      size_t slowest = (size_t)( 1 + DEFAULT_SLICE_SIZE /                                 ((double)cfg_cache_size*1024*1024 / rateup) );      // Lead cache: data we need to cache to keep the slowest up's data cached      // Add a slice per up for timing uncertainty      if( slowest = WORLD.GetSlowestUp(slowest) )        upadd = DEFAULT_SLICE_SIZE * ( rateup / slowest + unchoked-1 );      else upadd = DEFAULT_SLICE_SIZE * unchoked;      upmin = DEFAULT_SLICE_SIZE * unchoked;      upmax = (size_t)( DEFAULT_SLICE_SIZE * (unchoked-1) +        rateup * 2.5 * WORLD.GetUnchokeInterval() );    }  }else{    if( rateup > ratedn ){      size_t slowest = (size_t)( 1 +        cfg_req_slice_size * ((double)ratedn / cfg_cache_size*1024*1024) +        DEFAULT_SLICE_SIZE * ((double)rateup / cfg_cache_size*1024*1024) );      if( slowest = WORLD.GetSlowestUp(slowest) )        // lead cache is how much we'll use while uploading a slice to slowest        // (default_slice_size / slowest) * (ratedn + rateup)        upadd = (size_t)( ((double)DEFAULT_SLICE_SIZE / slowest) *                          (ratedn + rateup + 1) );      else upadd = m_piece_length * unchoked;    }    else if( rateup ){      // same as m_piece_length / (cfg_cache_size*1024*1024 / (double)ratedn)      size_t slowest = (size_t)( 1 +        ratedn * ((double)m_piece_length / (cfg_cache_size*1024*1024)) );      if( slowest = WORLD.GetSlowestUp(slowest) ){        // m_piece_length / (double)slowest * ratedn        // optimize, then round up a piece and add a piece        upadd = m_piece_length * (ratedn / slowest + 2);      }else{  // gimme 10 seconds worth (unchoke interval)        // Can't keep pieces in cache long enough to upload them.        // Rely on prefetching slices from disk instead.        upadd = ratedn * WORLD.GetUnchokeInterval() +                DEFAULT_SLICE_SIZE * unchoked;      }    }  }  if( upadd < upmin ) upadd = upmin;  // Add a slice to round up  total = unflushed + dlnext + upadd + cfg_req_slice_size;  // Limit to max configured size  if( total > cfg_cache_size*1024*1024 ) total = cfg_cache_size*1024*1024;  // Don't decrease cache size if flush failed.  if( !m_flush_failed || total > m_cache_size ) m_cache_size = total;  if(arg_verbose)    CONSOLE.Debug("DL need: %dK  UL need: %dK  Cache: %dK  Used: %dK",    (int)((unflushed+dlnext)/1024), (int)(upadd/1024),    (int)(m_cache_size/1024), (int)(m_cache_used/1024));  m_cache_eval_time = now + interval;}void btContent::CacheConfigure(){  if( cfg_cache_size ){    if( cfg_cache_size > GetTotalFilesLength()/1024/1024 )      cfg_cache_size = (GetTotalFilesLength()+1024*1024-1)/1024/1024;    CacheEval();  }else m_cache_size = 0;  if( m_cache_size < m_cache_used && !m_flush_failed ) CacheClean(0);}int btContent::NeedFlush() const{  if( m_flush_failed ){    if( now > m_flush_tried ) return 1;  }else return m_flushq ? 1 : 0;}void btContent::FlushCache(size_t idx){  BTCACHE *p, *pnext;  if( idx >= m_npieces ){    if(arg_verbose) CONSOLE.Debug("Flushing all cache");    if( m_flushq) do{      FlushQueue();    }while( m_flushq && !m_flush_failed );    p = m_cache_oldest;  } else p = m_cache[idx];  for( ; p; p = pnext ){    pnext = (idx < m_npieces) ? p->bc_next : p->age_next;    if( idx == p->bc_off / m_piece_length ||        (p->bc_f_flush && idx == m_npieces) ||        idx == (p->bc_off+p->bc_len-1) / m_piece_length ){      // update the age--flushing the entry or its piece      if( m_cache_newest != p ){        if( p->age_prev ) p->age_prev->age_next = p->age_next;        else if( p->age_next ) m_cache_oldest = p->age_next;        if( p->age_next ) p->age_next->age_prev = p->age_prev;        m_cache_newest->age_next = p;        p->age_next = (BTCACHE *)0;        p->age_prev = m_cache_newest;        m_cache_newest = p;      }      if( p->bc_f_flush ) FlushEntry(p);    }  }}void btContent::FlushEntry(BTCACHE *p){  if( p->bc_f_flush ){    if( m_btfiles.IO(p->bc_buf, p->bc_off, p->bc_len, 1) < 0 ){      m_flush_tried = now;      if( now >= m_flush_failed + 300 ){        if( !m_flush_failed )          m_cache_size += cfg_req_slice_size * WORLD.GetDownloads() * 2;        CONSOLE.Warning(1, "warn, write file failed while flushing cache.");        CONSOLE.Warning(1,          "You need to have at least %llu bytes free on this filesystem!",          (unsigned long long)(m_left_bytes + m_cache_used));        CONSOLE.Warning(1,          "This could also be caused by a conflict or disk error.");        if( !IsFull() ||            (!m_flush_failed && m_cache_size > cfg_cache_size*1024*1024) ){          CONSOLE.Warning(1, "Temporarily %s%s...",            IsFull() ? "" : "suspending download",            (!m_flush_failed && m_cache_size > cfg_cache_size*1024*1024) ?              (IsFull() ? " and increasing cache" : "increasing cache") : "");        }        m_flush_failed = now;        WORLD.StopDownload();      }    }else{      p->bc_f_flush = 0;      if( Seeding() ){        for( size_t n=1; n <= m_btfiles.GetNFiles(); n++ )          m_btfiles.CloseFile(n);  // files will reopen read-only      }      if(m_flush_failed){        m_flush_failed = 0;        CONSOLE.Warning(3, "Flushing cache succeeded%s.",          Seeding() ? "" : "; resuming download");        CacheConfigure();        WORLD.CheckInterest();      }    }  }}void btContent::Uncache(size_t idx){  BTCACHE *p, *pnext;  p = m_cache[idx];  for( ; p; p = pnext ){    pnext = p->bc_next;    if( idx == p->bc_off / m_piece_length ){      if( p->age_prev ) p->age_prev->age_next = p->age_next;      else m_cache_oldest = p->age_next;      if( p->age_next ) p->age_next->age_prev = p->age_prev;      else m_cache_newest = p->age_prev;      if( p->bc_prev ) p->bc_prev->bc_next = p->bc_next;      if( p->bc_next ) p->bc_next->bc_prev = p->bc_prev;      m_cache_used -= p->bc_len;      delete []p->bc_buf;      delete p;    }else break;  }  m_cache[idx] = (BTCACHE *)0;}void btContent::FlushQueue(){  if( !m_flushq ) return;  if(arg_verbose)    CONSOLE.Debug("Writing piece #%d to disk", (int)(m_flushq->idx));  FlushCache(m_flushq->idx);  if( !m_flush_failed ){    BTFLUSH *goner = m_flushq;    m_flushq = m_flushq->next;    delete goner;  }}ssize_t btContent::WriteSlice(char *buf,size_t idx,size_t off,size_t len){  uint64_t offset = (uint64_t)idx * (uint64_t)m_piece_length + off;  //CONSOLE.Debug("Offset-write: %llu - Piece:%lu",  //  (unsigned long long)offset, (unsigned long)idx);  if( !m_cache_size ) return m_btfiles.IO(buf, offset, len, 1);  else{    size_t len2;    int flg_rescan;    BTCACHE *p;    p = m_cache[idx];    for( ; p && (offset + len) > p->bc_off && !CACHE_FIT(p,offset,len);        p = p->bc_next );    for( ; len && p && CACHE_FIT(p, offset, len); ){      flg_rescan = 0;      if( offset < p->bc_off ){        len2 = p->bc_off - offset;        if( CacheIO(buf, offset, len2, 1) < 0 ) return -1;        flg_rescan = 1;      }else{        if( offset > p->bc_off ){          len2 = p->bc_off + p->bc_len - offset;          if( len2 > len ) len2 = len;          memcpy(p->bc_buf + offset - p->bc_off, buf, len2);          p->bc_f_flush = 1;        }else{          len2 = (len > p->bc_len) ? p->bc_len : len;          memcpy(p->bc_buf, buf, len2);          p->bc_f_flush = 1;        }        // re-received this data, make it new again        if( m_cache_newest != p ){          if( p->age_prev ) p->age_prev->age_next = p->age_next;          else if( p->age_next ) m_cache_oldest = p->age_next;          if( p->age_next ) p->age_next->age_prev = p->age_prev;          m_cache_newest->age_next = p;          p->age_next = (BTCACHE *)0;          p->age_prev = m_cache_newest;          m_cache_newest = p;        }      }      buf += len2;      offset += len2;      len -= len2;      if( len ){        if( flg_rescan ){          for( p = m_cache[idx];               p && (offset + len) > p->bc_off && !CACHE_FIT(p,offset,len);               p = p->bc_next );        }else{          p = p->bc_next;        }      }    }// end for;      if( len ) return CacheIO(buf, offset, len, 1);  }  return 0;}ssize_t btContent::CacheIO(char *buf, uint64_t off, size_t len, int method){  BTCACHE *p;  BTCACHE *pp = (BTCACHE*) 0;  BTCACHE *pnew = (BTCACHE*) 0;  if(arg_verbose && 0==method)    CONSOLE.Debug("Read to %s %d/%d/%d", buf?"buffer":"cache",      (int)(off / m_piece_length), (int)(off % m_piece_length), (int)len);  if( m_cache_size < m_cache_used + len ) CacheClean(len);  // Note, there is no failure code from CacheClean().  If nothing can be done  // to increase the cache size, we allocate what we need anyway.    if( 0==method && buf && m_btfiles.IO(buf, off, len, method) < 0 ) return -1;    pnew = new BTCACHE;#ifndef WINDOWS  if( !pnew )    return (method && buf) ? m_btfiles.IO(buf, off, len, method) : 0;#endif  pnew->bc_buf = new char[len];#ifndef WINDOWS  if( !(pnew->bc_buf) ){     delete pnew;     return (method && buf) ? m_btfiles.IO(buf, off, len, method) : 0;  }#endif  if( buf ) memcpy(pnew->bc_buf, buf, len);  else if( 0==method && m_btfiles.IO(pnew->bc_buf, off, len, method) < 0 )    return -1;  pnew->bc_off = off;  pnew->bc_len = len;  pnew->bc_f_flush = method;  m_cache_used += len;  pnew->age_next = (BTCACHE *)0;  if( m_cache_newest ){    pnew->age_prev = m_cache_newest;    m_cache_newest->age_next = pnew;  }else{    pnew->age_prev = (BTCACHE *)0;    m_cache_oldest = pnew;  }  m_cache_newest = pnew;  // find insert point: after pp, before p.  size_t idx = off / m_piece_length;  p = m_cache[idx];  if( p ) pp = p->bc_prev;  for( ; p && off > p->bc_off; pp = p, p = pp->bc_next );  pnew->bc_next = p;  pnew->bc_prev = pp;  if( pp ) pp->bc_next = pnew;  if( p ) p->bc_prev = pnew;  if( !m_cache[idx] || off < m_cache[idx]->bc_off )    m_cache[idx] = pnew;  return 0;}ssize_t btContent::ReadPiece(char *buf,size_t idx){  return ReadSlice(buf, idx, 0, GetPieceLength(idx));}size_t btContent::GetPieceLength(size_t idx){  return (idx == m_btfiles.GetTotalLength() / m_piece_length) ?    (size_t)(m_btfiles.GetTotalLength() % m_piece_length)     :m_piece_length;}int btContent::CheckExist(){  size_t idx = 0;  size_t percent = GetNPieces() / 100;  unsigned char md[20];  if( !percent ) percent = 1;  CONSOLE.Interact_n("");  for( ; idx < m_npieces; idx++ ){    if( GetHashValue(idx, md) < 0 ){      CONSOLE.Warning(1, "Error while checking piece %d of %d",        (int)idx+1, (int)m_npieces);      return -1;    }    if( memcmp(md, m_hash_table + idx * 20, 20) == 0 ){       m_left_bytes -= GetPieceLength(idx);       pBF->Set(idx);    }    if( idx % percent == 0 || idx == m_npieces-1 )      CONSOLE.InteractU("Check exist: %d/%d", idx+1, m_npieces);  }  m_check_piece = m_npieces;  pBChecked->SetAll();  delete pBRefer;  return 0;}int btContent::CheckNextPiece(){  size_t idx = m_check_piece;  unsigned char md[20];  int f_checkint = 0;  if( idx >= m_npieces ) return 0;  if( !pBRefer->IsSet(idx) ){    while( idx < m_npieces && !pBRefer->IsSet(idx) ){      pBChecked->Set(idx);      ++idx;    }    f_checkint = 1;    m_check_piece = idx;  }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品一区二区免费不卡| 色系网站成人免费| 91激情在线视频| 精品久久久久久亚洲综合网 | 欧美国产日韩精品免费观看| 亚洲国产精品久久人人爱蜜臀 | 久久久久久久久99精品| 一二三四社区欧美黄| 国产精品性做久久久久久| 欧美日韩中文字幕一区| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 精品一区二区三区免费视频| 91福利国产精品| 国产精品―色哟哟| 国产精品影音先锋| 日韩一区二区不卡| 亚洲成人自拍一区| 一道本成人在线| 亚洲图片你懂的| 成人av网站在线观看| 精品福利一二区| 久久精品国产精品青草| 在线成人av网站| 三级亚洲高清视频| 欧美日韩国产综合视频在线观看| 中文字幕综合网| 99国产精品国产精品毛片| 国产夜色精品一区二区av| 精品中文字幕一区二区小辣椒| 欧美日韩高清在线| 香蕉加勒比综合久久| 欧美三级视频在线观看 | 欧美国产精品一区二区| 久久99国产精品免费网站| 欧美一级免费观看| 蜜乳av一区二区| 欧美mv日韩mv国产| 国产精品2024| 国产精品久久久久国产精品日日| 国产精品99久久久久久似苏梦涵| 久久免费的精品国产v∧| 国产福利91精品一区二区三区| 欧美经典一区二区| 99免费精品在线| 一区二区理论电影在线观看| 欧美性xxxxx极品少妇| 五月天亚洲精品| 欧美一级片免费看| 国产东北露脸精品视频| 日韩美女视频一区二区| 欧美专区亚洲专区| 美女视频网站久久| 国产日韩欧美电影| 一本到一区二区三区| 天天综合网 天天综合色| 久久9热精品视频| 天使萌一区二区三区免费观看| 不卡av在线网| 日韩理论电影院| 亚洲日本乱码在线观看| 色哦色哦哦色天天综合| 亚洲综合视频在线观看| 这里只有精品视频在线观看| 国产伦精一区二区三区| 亚洲欧美乱综合| 日韩一二三区不卡| 成人午夜电影网站| 午夜精品一区二区三区电影天堂| 日韩免费观看高清完整版在线观看 | 亚洲v日本v欧美v久久精品| 日韩免费成人网| 91浏览器入口在线观看| 蜜桃精品视频在线观看| 一区在线播放视频| 欧美一区二区三区免费| 91在线免费播放| 麻豆精品一区二区av白丝在线 | 久久久久9999亚洲精品| 欧美在线观看一二区| 国产乱对白刺激视频不卡| 依依成人综合视频| 国产网站一区二区三区| 欧美妇女性影城| 91在线看国产| 国产在线观看一区二区| 亚洲图片一区二区| 亚洲欧美一区二区视频| 26uuu另类欧美亚洲曰本| 欧洲亚洲国产日韩| www.亚洲国产| 国产裸体歌舞团一区二区| 亚洲午夜在线视频| 中文字幕五月欧美| 欧美激情一二三区| 精品国产一区二区三区久久久蜜月 | 欧美电影免费观看高清完整版在 | 国产视频一区二区在线观看| 欧美精品精品一区| 欧美综合一区二区| 一本一本大道香蕉久在线精品| 国产米奇在线777精品观看| 免费成人在线视频观看| 五月开心婷婷久久| 亚洲一区二区三区小说| 亚洲色图视频免费播放| 中文成人综合网| 日本一区二区综合亚洲| 久久精品亚洲乱码伦伦中文| 91精品国产91久久久久久一区二区 | 99精品国产视频| 成人午夜短视频| 成人激情小说乱人伦| 成人动漫av在线| 成人国产精品免费观看视频| 国产福利不卡视频| 不卡一区二区三区四区| 99在线精品观看| 色综合色综合色综合| 欧美在线视频日韩| 欧美熟乱第一页| 欧美精品一卡两卡| 日韩精品一区二区在线观看| 日韩一级大片在线观看| 久久视频一区二区| 国产欧美精品一区二区色综合| 久久久久久亚洲综合影院红桃| 久久久久久97三级| 国产精品久久久久久久久晋中| 国产精品对白交换视频| 怡红院av一区二区三区| 天堂影院一区二区| 精品一区二区三区av| 高清不卡在线观看| 色婷婷久久久综合中文字幕| 在线观看成人免费视频| 欧美一区二区三区在线| 欧美精品一区二区三区一线天视频| 亚洲精品一区二区三区影院 | 国产精品亲子伦对白| 亚洲美女精品一区| 日韩国产精品久久久久久亚洲| 日韩电影在线一区二区| 国产又黄又大久久| 色屁屁一区二区| 日韩欧美激情一区| 欧美国产精品久久| 日一区二区三区| 粉嫩aⅴ一区二区三区四区五区| 91免费看`日韩一区二区| 欧美日本一道本在线视频| 久久精品一区二区三区四区| 亚洲欧洲成人精品av97| 天堂蜜桃91精品| 福利91精品一区二区三区| 在线观看成人免费视频| 久久久久国产成人精品亚洲午夜| 国产精品国产三级国产普通话蜜臀| 亚洲成人手机在线| 国产.精品.日韩.另类.中文.在线.播放| 色偷偷成人一区二区三区91| 日韩精品一区二区三区在线播放| 国产精品灌醉下药二区| 另类小说图片综合网| 在线观看视频一区二区| 国产午夜精品美女毛片视频| 丝袜美腿亚洲色图| 99久久免费国产| 久久嫩草精品久久久精品一| 亚洲高清免费视频| 91日韩一区二区三区| 久久色成人在线| 日本午夜一区二区| 在线免费观看日本一区| 中文字幕欧美国产| 久草在线在线精品观看| 欧美人与z0zoxxxx视频| 樱桃视频在线观看一区| 成人免费视频caoporn| 精品国产乱码久久久久久蜜臀| 艳妇臀荡乳欲伦亚洲一区| 成人国产在线观看| 欧美激情一区二区| 国产精品99久久久久久有的能看| 日韩一区二区三区四区 | 国产成人精品aa毛片| 日韩欧美视频一区| 日韩vs国产vs欧美| 欧美日韩精品一区二区| 一区二区三区蜜桃网| aa级大片欧美| 欧美国产激情二区三区| 国产原创一区二区| 久久人人97超碰com| 久久er99精品| 久久综合久久综合亚洲| 国产一区二区剧情av在线| 欧美成人bangbros| 国产美女精品一区二区三区| 久久久久久久免费视频了| 国产伦理精品不卡|