void PieceManager::DecreaseHave(const BitField &remote_bitf) { for(size_t i = 0; i < remote_bitf.NBits(); ++i) { if(remote_bitf.IsSet(i)) { DecreaseHave(i); } } }
void PieceManager::IncreaseHave(const BitField &remote_bitf) { if(remote_bitf.NBits() != m_bitfield.NBits()) { assert(0); return; } for(size_t i = 0; i < remote_bitf.NBits(); ++i) { if(remote_bitf.IsSet(i)) { IncreaseHave(i); } } }
bool PieceManager::get_req_piece_rarely(t_uint32 &piece_idx, const BitField &remote_own_pieces) { for(size_t i = 1; i < m_interests.size(); ++i) { for(size_t j = 0; j < m_interests[i].size(); ++j) { t_uint32 pidx = m_interests[i][j]; if(remote_own_pieces.IsSet(pidx) && m_pieces_info[pidx].state == P_FREE) { piece_idx = pidx; return true; } } } return false; }
bool PieceManager::get_req_in_downloading(SliceInfo &slice_info, const BitField &remote_own_pieces) { t_uint32 best_pidx = NONE_PIECE_INDEX; t_uint32 best_num = 0; DownloadingPiece *pdown = 0; for(StartedPiecesMap::iterator it = m_started_pieces.begin(); it != m_started_pieces.end(); ++it) { t_uint32 pidx = it->second->GetPieceIdx(); assert(pidx < m_bitfield.NBits()); assert(m_pieces_info[pidx].state == P_DOWNLOADING); if(remote_own_pieces.IsSet(pidx) && it->second->HasFreeSlice()) { if(m_pieces_info[pidx].have > best_num) { best_pidx = pidx; best_num = m_pieces_info[pidx].have; pdown = it->second; } } } if(pdown != 0) { assert(best_num > 0); bool res = pdown->GetRequest(slice_info); assert(res); return true; } else { return false; } }