lib/zmachine/channel.rb in zmachine-0.3.0 vs lib/zmachine/channel.rb in zmachine-0.3.2

- old
+ new

@@ -1,16 +1,17 @@ -java_import java.nio.ByteBuffer +java_import 'java.nio.ByteBuffer' +java_import 'java.util.concurrent.ConcurrentLinkedQueue' module ZMachine class Channel attr_accessor :socket attr_accessor :raw def initialize @inbound_buffer = ByteBuffer.allocate(1024 * 1024) - @outbound_queue = [] + @outbound_queue = ConcurrentLinkedQueue.new @raw = false end # methods that need to be implemented in sub classes: # @@ -36,23 +37,24 @@ ZMachine.logger.debug("zmachine:channel:#{__method__}", channel: self) if ZMachine.debug raise RuntimeError.new("send_data called after close") if @closed_callback return unless data buffer = ByteBuffer.wrap(data) if buffer.has_remaining - @outbound_queue << buffer + @outbound_queue.add(buffer) end end def write_outbound_data ZMachine.logger.debug("zmachine:channel:#{__method__}", channel: self, can_send: can_send?) if ZMachine.debug while can_send? - buffer = @outbound_queue.first + buffer = @outbound_queue.peek + break unless buffer @socket.write(buffer) if buffer.has_remaining # Did we consume the whole outbound buffer? If yes, # pop it off and keep looping. If no, the outbound network # buffers are full, so break out of here. break if buffer.has_remaining - @outbound_queue.shift + @outbound_queue.poll end maybe_close_with_callback end def close(after_writing = false, &block)