Class: Pwrake::NBIO::Reader

Inherits:
Object
  • Object
show all
Defined in:
lib/pwrake/nbio.rb

Overview


Direct Known Subclasses

MultiReader

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(selector, io) ⇒ Reader

Returns a new instance of Reader.



230
231
232
233
234
235
236
237
238
# File 'lib/pwrake/nbio.rb', line 230

def initialize(selector, io)
  @selector = selector
  @io = io
  @waiter = []
  @buf = ''
  @eof = false
  @sep = "\n"
  @chunk_size = 8192
end

Instance Attribute Details

#check_timeoutObject

Returns the value of attribute check_timeout.



240
241
242
# File 'lib/pwrake/nbio.rb', line 240

def check_timeout
  @check_timeout
end

#ioObject (readonly)

Returns the value of attribute io.



239
240
241
# File 'lib/pwrake/nbio.rb', line 239

def io
  @io
end

#waiterObject (readonly)

Returns the value of attribute waiter.



239
240
241
# File 'lib/pwrake/nbio.rb', line 239

def waiter
  @waiter
end

Instance Method Details

#_read(sz) ⇒ Object

from Bartender



299
300
301
302
303
304
305
306
307
308
# File 'lib/pwrake/nbio.rb', line 299

def _read(sz)
  @io.read_nonblock(sz)
rescue EOFError
  @eof = true
  nil
rescue IO::WaitReadable
  return nil if @halting
  select_io
  retry
end

#callObject

call from Selector#run



243
244
245
# File 'lib/pwrake/nbio.rb', line 243

def call
  @waiter.each{|f| f.resume}
end

#eof?Boolean

Returns:

  • (Boolean)


293
294
295
# File 'lib/pwrake/nbio.rb', line 293

def eof?
  @eof && @buf.empty?
end

#error(e) ⇒ Object



281
282
283
284
# File 'lib/pwrake/nbio.rb', line 281

def error(e)
  @closed = true
  raise e
end

#haltObject



286
287
288
289
290
291
# File 'lib/pwrake/nbio.rb', line 286

def halt
  @halting = true
  call
ensure
  @halting = false
end

#read(n) ⇒ Object



310
311
312
313
314
315
316
317
# File 'lib/pwrake/nbio.rb', line 310

def read(n)
  while @buf.bytesize < n
    chunk = _read(n)
    break if chunk.nil? || chunk.empty?
    @buf += chunk
  end
  @buf.slice!(0, n)
end

#read_line_nonblockObject

call from MultiReader#call



248
249
250
251
252
253
254
255
256
257
258
259
260
# File 'lib/pwrake/nbio.rb', line 248

def read_line_nonblock
  until index = @buf.index(@sep)
    @buf << @io.read_nonblock(@chunk_size)
  end
  @buf.slice!(0, index+@sep.bytesize)
rescue EOFError => e
  if @buf.empty?
    raise e
  else
    buf = @buf; @buf = ''
    return buf
  end
end

#read_until(sep = "\r\n", chunk_size = 8192) ⇒ Object



319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
# File 'lib/pwrake/nbio.rb', line 319

def read_until(sep="\r\n", chunk_size=8192)
  until i = @buf.index(sep)
    if s = _read(chunk_size)
      @buf += s
    else
      if @buf.empty?
        return nil
      else
        buf = @buf; @buf = ''
        return buf
      end
    end
  end
  @buf.slice!(0, i+sep.bytesize)
end

#readlnObject Also known as: get_line, gets



335
336
337
# File 'lib/pwrake/nbio.rb', line 335

def readln
  read_until(@sep)
end

#select_ioObject

call from Reader#_read and FiberReaderQueue#deq



263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
# File 'lib/pwrake/nbio.rb', line 263

def select_io
  if @waiter.empty?
    @selector.add_reader(self)
  else
    if @selector.reader[@io] != self
      raise RuntimeError, "access from multiple Fiber"
    end
  end
  @waiter.push(Fiber.current)
  if $debug && defined? Log
    Log.debug("Reader#select_io: #{Fiber.current.inspect}\n "+caller.join("\n "))
  end
  Fiber.yield
ensure
  @waiter.delete(Fiber.current)
  @selector.delete_reader(self) if @waiter.empty?
end