def send_blocks_and_reqs(dllim=nil, ullim=nil)
sent_bytes = 0
reqd_bytes = 0
@want_blocks_m.synchronize do
@want_blocks.each do |b|
if b.requested? && (b.time_elapsed > REQUEST_TIMEOUT)
rt_warning "#{self}: for block #{b}, time elapsed since request is #{b.time_elapsed} > #{REQUEST_TIMEOUT}, assuming peer forgot about it"
@want_blocks.delete b
@controller.forget_blocks [b]
end
end
end
unless @peer_choking || !@interested
@want_blocks_m.synchronize do
@want_blocks.each do |b|
break if dllim && (reqd_bytes >= dllim)
next if b.requested?
if @package.pieces[b.pindex].complete?
rt_warning "#{self}: deleting scheduled block for already-complete piece #{b}"
@want_blocks.delete b
next
end
queue_message(:request, {:index => b.pindex, :begin => b.begin,
:length => b.length})
reqd_bytes += b.length
b.requested = true
b.mark_time
send_event(:requested_block, b)
end
end
end
unless @choking || !@peer_interested
while !@peer_want_blocks.empty?
break if ullim && (sent_bytes >= ullim)
if (b = @peer_want_blocks.shift)
sent_bytes += b.length
@send_q.push b
@time[:send_block] = Time.now
send_event(:sent_block, b)
end
end
end
get_want_blocks
[reqd_bytes, sent_bytes]
end