Class: Async::IO::Generic

Inherits:
Wrapper
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/async/io/generic.rb

Overview

Represents an asynchronous IO within a reactor.

Direct Known Subclasses

BasicSocket, Protocol::Line, SSLSocket

Constant Summary collapse

WRAPPERS =
{}

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Class Attribute Details

.wrapped_klassObject (readonly)

Returns the value of attribute wrapped_klass.



59
60
61
# File 'lib/async/io/generic.rb', line 59

def wrapped_klass
  @wrapped_klass
end

Instance Attribute Details

#timeoutObject

Returns the value of attribute timeout.



135
136
137
# File 'lib/async/io/generic.rb', line 135

def timeout
  @timeout
end

Class Method Details

.wrap(*args) ⇒ Object

Instantiate a wrapped instance of the class, and optionally yield it to a given block, closing it afterwards.



73
74
75
76
77
78
79
80
81
82
83
# File 'lib/async/io/generic.rb', line 73

def wrap(*args)
  wrapper = self.new(@wrapped_klass.new(*args))
  
  return wrapper unless block_given?
  
  begin
    yield wrapper
  ensure
    wrapper.close
  end
end

.wrap_blocking_method(new_name, method_name, invert: true) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/async/io/generic.rb', line 45

def wrap_blocking_method(new_name, method_name, invert: true)
  define_method(new_name) do |*args|
    async_send(method_name, *args)
  end
  
  if invert
    # We define the original _nonblock method to call the async variant. We ignore options.
    # define_method(method_name) do |*args, **options|
    #   self.__send__(new_name, *args)
    # end
    def_delegators :@io, method_name
  end
end

.wraps(klass, *additional_methods) ⇒ Object



61
62
63
64
65
66
67
68
69
70
# File 'lib/async/io/generic.rb', line 61

def wraps(klass, *additional_methods)
  @wrapped_klass = klass
  WRAPPERS[klass] = self
  
  # These are methods implemented by the wrapped class, that we aren't overriding, that may be of interest:
  # fallback_methods = klass.instance_methods(false) - instance_methods
  # puts "Forwarding #{klass} methods #{fallback_methods} to @io"
  
  def_delegators :@io, *additional_methods
end

Instance Method Details

#connected?Boolean

Returns:

  • (Boolean)


131
132
133
# File 'lib/async/io/generic.rb', line 131

def connected?
  !@io.closed?
end

#dupObject



100
101
102
103
104
# File 'lib/async/io/generic.rb', line 100

def dup
  super.tap do |copy|
    copy.timeout = self.timeout
  end
end

#nonblockObject



119
120
121
# File 'lib/async/io/generic.rb', line 119

def nonblock
  true
end

#nonblock=(value) ⇒ Object



123
124
125
# File 'lib/async/io/generic.rb', line 123

def nonblock= value
  true
end

#nonblock?Boolean

Returns:

  • (Boolean)


127
128
129
# File 'lib/async/io/generic.rb', line 127

def nonblock?
  true
end

#readObject Also known as: sysread, readpartial

Invokes read_nonblock on the underlying io. If the operation would block, the current task is paused until the operation can succeed, at which point it’s resumed and the operation is completed.

Examples:

data = io.read(512)


90
# File 'lib/async/io/generic.rb', line 90

wrap_blocking_method :read, :read_nonblock

#wait(timeout = self.timeout, mode = :read) ⇒ Object



106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/async/io/generic.rb', line 106

def wait(timeout = self.timeout, mode = :read)
  case mode
  when :read
    wait_readable(timeout)
  when :write
    wait_writable(timeout)
  else
    wait_any(:rw, timeout)
  end
rescue TimeoutError
  return nil
end

#writeObject Also known as: syswrite, <<

Invokes write_nonblock on the underlying io. If the operation would block, the current task is paused until the operation can succeed, at which point it’s resumed and the operation is completed.

Examples:

io.write("Hello World")


96
# File 'lib/async/io/generic.rb', line 96

wrap_blocking_method :write, :write_nonblock