Exemple #1
0
// Returns true if the piece was moved successfully.
bool RequestQueue::Transfer(RequestQueue &dstq, bt_index_t idx)
{
  bool result = true;
  PIECE *piece, *prev;

  if( !(piece = FindPiece(idx, &prev)) ) return true;

  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( (&PENDING == &dstq && piece->count >= NSlices(piece->slices->index)) ||
      !dstq.Append(piece) ){
    _empty_slice_list(&piece);
    result = false;
  }
  return result;
}
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;
}