Module: EM::SocketConnection
- Includes:
- Deferrable
- Defined in:
- lib/memcache/event_machine.rb
Constant Summary collapse
- SEP =
"\r\n"
Class Method Summary collapse
Instance Method Summary collapse
- #can_read?(size) ⇒ Boolean
- #close ⇒ Object
- #closed? ⇒ Boolean
- #gets ⇒ Object
- #initialize ⇒ Object
- #post_init ⇒ Object
- #read(size) ⇒ Object
-
#receive_data(data) ⇒ Object
EM callbacks.
- #unbind ⇒ Object
- #write(buf) ⇒ Object
Class Method Details
.connect(host, port, timeout) ⇒ Object
67 68 69 70 71 |
# File 'lib/memcache/event_machine.rb', line 67 def self.connect(host, port, timeout) EM.connect(host, port, self) do |conn| conn.pending_connect_timeout = timeout end end |
Instance Method Details
#can_read?(size) ⇒ Boolean
127 128 129 |
# File 'lib/memcache/event_machine.rb', line 127 def can_read?(size) @buf.size >= @index + size end |
#close ⇒ Object
83 84 85 86 |
# File 'lib/memcache/event_machine.rb', line 83 def close @connected = false close_connection(true) end |
#closed? ⇒ Boolean
79 80 81 |
# File 'lib/memcache/event_machine.rb', line 79 def closed? !@connected end |
#gets ⇒ Object
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
# File 'lib/memcache/event_machine.rb', line 109 def gets while true # Read to ensure we have some data in the buffer line = read(2) # Reset the buffer index to zero @buf = @buf.slice(@index..-1) @index = 0 if eol = @buf.index(SEP) line << yank(eol + SEP.size) break else # EOL not in the current buffer line << yank(@buf.size) end end line end |
#initialize ⇒ Object
73 74 75 76 77 |
# File 'lib/memcache/event_machine.rb', line 73 def initialize @connected = false @index = 0 @buf = '' end |
#post_init ⇒ Object
144 145 146 147 |
# File 'lib/memcache/event_machine.rb', line 144 def post_init @connected = true succeed end |
#read(size) ⇒ Object
92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/memcache/event_machine.rb', line 92 def read(size) if can_read?(size) yank(size) else fiber = Fiber.current @size = size @callback = proc { |data| fiber.resume(data) } # TODO Can leak fiber if the connection dies while # this fiber is yielded, waiting for data Fiber.yield end end |
#receive_data(data) ⇒ Object
EM callbacks
133 134 135 136 137 138 139 140 141 142 |
# File 'lib/memcache/event_machine.rb', line 133 def receive_data(data) @buf << data if @callback and can_read?(@size) callback = @callback data = yank(@size) @callback = @size = nil callback.call(data) end end |
#unbind ⇒ Object
149 150 151 152 153 154 155 |
# File 'lib/memcache/event_machine.rb', line 149 def unbind if @connected @connected = false else fail end end |
#write(buf) ⇒ Object
88 89 90 |
# File 'lib/memcache/event_machine.rb', line 88 def write(buf) send_data(buf) end |