Пример #1
0
void PieceManager::DecreaseHave(const BitField &remote_bitf)
{

    for(size_t i = 0; i < remote_bitf.NBits(); ++i)
    {
        if(remote_bitf.IsSet(i))
        {
            DecreaseHave(i);
        }
    }

}
Пример #2
0
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);
        }
    }
}
Пример #3
0
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;
}
Пример #4
0
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;
    }
}