def add_peer(p)
accept = true
if @peers.length >= MAX_PEERS && !@package.complete?
oldp = @peers.find { |x| !x.running? || ((x.dlamt == 0) && ((Time.now - x.start_time) > BOREDOM_DEATH_INTERVAL)) }
if oldp
rt_debug "killing peer for being boring: #{oldp}"
oldp.shutdown
else
rt_debug "too many peers, ignoring #{p}"
p.shutdown
accept = false
end
end
if accept
p.on_event(self, :received_block) { |peer, block| received_block(block, peer) }
p.on_event(self, :peer_has_piece) { |peer, piece| peer_has_piece(piece, peer) }
p.on_event(self, :peer_has_pieces) { |peer, bitfield| peer_has_pieces(bitfield, peer) }
p.on_event(self, :sent_block) { |peer, block| send_event(:sent_block, block, peer.name) }
p.on_event(self, :requested_block) { |peer, block| send_event(:requested_block, block, peer.name) }
@peers_m.synchronize do
@peers.push p
p.start if @running
end
send_event(:added_peer, p.name)
end
end