def start
return if @started == true
@started = true
@thread = NewRelic::Agent::Threading::AgentThread.create('Pipe Channel Manager') do
now = nil
loop do
clean_up_pipes
pipes_to_listen_to = @pipes_lock.synchronize do
@pipes.values.map{|pipe| pipe.out} + [wake.out]
end
NewRelic::Agent.record_metric('Supportability/Listeners',
(Time.now - now).to_f) if now
if ready = IO.select(pipes_to_listen_to, [], [], @select_timeout)
now = Time.now
ready_pipes = ready[0]
ready_pipes.each do |pipe|
merge_data_from_pipe(pipe) unless pipe == wake.out
end
wake.out.read(1) if ready_pipes.include?(wake.out)
end
break unless should_keep_listening?
end
end
sleep 0.001
end