doc: tag files containing internal implementation details
[ruby-mogilefs-client.git] / lib / mogilefs / socket / kgio.rb
blob292ea7efd28f5e28c207235d2481fc410691af35
1 # -*- encoding: binary -*-
2 # internal implementation details here, do not rely on them in your code
3 require "kgio"
5 class MogileFS::Socket < Kgio::Socket
6   include MogileFS::SocketCommon
8   def self.start(host, port)
9     sock = super(Socket.sockaddr_in(port, host))
10     sock.post_init(host, port)
11   end
13   def self.tcp(host, port, timeout = 5)
14     sock = start(host, port)
15     unless sock.kgio_wait_writable(timeout)
16       sock.close
17       raise MogileFS::Timeout, 'socket connect timeout'
18     end
19     sock
20   end
22   def timed_read(len, dst = "", timeout = 5)
23     case rc = kgio_tryread(len, dst)
24     when :wait_readable
25       kgio_wait_readable(timeout) or unreadable_socket!
26     else
27       return rc
28     end while true
29   end
31   def timed_peek(len, dst, timeout = 5)
32     case rc = kgio_trypeek(len, dst)
33     when :wait_readable
34       kgio_wait_readable(timeout) or unreadable_socket!
35     else
36       return rc
37     end while true
38   end
40   def timed_write(buf, timeout = 5)
41     written = 0
42     expect = buf.bytesize
43     case rc = kgio_trywrite(buf)
44     when :wait_writable
45       kgio_wait_writable(timeout) or request_truncated!(written, expect)
46     when String
47       written += expect - rc.bytesize
48       buf = rc
49     else
50       return rc
51     end while true
52   end
53 end