def accept(queue)
@closed and raise 'closed'
begin
loop do
case (socket = queue.pop)
when SocketQueue::CMD_CLOSE
break
else
begin
receive(socket)
rescue StandardError, ScriptError
@logger.warn("failed to dispatch: #{$!.message} (#{$!.class}): #{$!.backtrace[0]}")
ensure
begin
socket.close unless socket.closed?
rescue
@logger.warn("failed to close socket: #{$!.message} (#{$!.class}): #{$!.backtrace[0]}")
end
end
end
end
ensure
begin
close
rescue
@logger.warn("failed to close messenger: #{$!.message} (#{$!.class}): #{$!.backtrace[0]}")
ensure
@closed = true
end
end
nil
end