Exemple #1
0
bt_index_t RequestQueue::FindCommonRequest(const Bitfield &proposerbf,
  const RequestQueue &proposerq) const
{
  const PIECE *piece;
  bt_index_t idx = BTCONTENT.GetNPieces();

  for( piece = rq_head; piece; piece = piece->next ){
    if( proposerbf.IsSet(piece->slices->index) &&
        !proposerq.HasPiece(piece->slices->index) ){
      idx = piece->slices->index;
      break;
    }
  }
  return idx;
}
Exemple #2
0
bt_index_t RequestQueue::Reassign(RequestQueue &dstq, const Bitfield &bf)
{
  PIECE *piece, *prev = (PIECE *)0;
  bt_index_t idx = BTCONTENT.GetNPieces();

  for( piece = rq_head; piece; piece = prev ? prev->next : rq_head ){
    if( bf.IsSet(piece->slices->index) &&
        !dstq.HasPiece(piece->slices->index) ){
      idx = piece->slices->index;
      if( rq_send && rq_send->index == idx )
        rq_send = piece->next ? piece->next->slices : (SLICE *)0;

      if( prev ) prev->next = piece->next;
      else rq_head = piece->next;
      piece->next = (PIECE *)0;

      if( !dstq.Append(piece) ) _empty_slice_list(&piece);
      else break;
    }else prev = piece;
  }
  return idx;
}