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

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

Returns:

  • (Boolean)


127
128
129
# File 'lib/memcache/event_machine.rb', line 127

def can_read?(size)
  @buf.size >= @index + size
end

#closeObject



83
84
85
86
# File 'lib/memcache/event_machine.rb', line 83

def close
  @connected = false
  close_connection(true)
end

#closed?Boolean

Returns:

  • (Boolean)


79
80
81
# File 'lib/memcache/event_machine.rb', line 79

def closed?
  !@connected
end

#getsObject



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

#initializeObject



73
74
75
76
77
# File 'lib/memcache/event_machine.rb', line 73

def initialize
  @connected = false
  @index = 0
  @buf = ''
end

#post_initObject



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

#unbindObject



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