THRIFT-401. rb: Speed up FramedTransport
Author: Tyler Kovacs
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@758510 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/rb/lib/thrift/transport.rb b/lib/rb/lib/thrift/transport.rb
index 503c6dd..4aa50d0 100644
--- a/lib/rb/lib/thrift/transport.rb
+++ b/lib/rb/lib/thrift/transport.rb
@@ -91,6 +91,7 @@
@transport = transport
@wbuf = ''
@rbuf = ''
+ @index = 0
end
def open?
@@ -107,13 +108,16 @@
end
def read(sz)
- ret = @rbuf.slice!(0...sz)
+ @index += sz
+ ret = @rbuf.slice(@index - sz, sz) || ''
+
if ret.length == 0
- @rbuf = @transport.read([sz, DEFAULT_BUFFER].max)
- @rbuf.slice!(0...sz)
- else
- ret
+ @rbuf = @transport.read([sz, DEFAULT_BUFFER].max)
+ @index = sz
+ ret = @rbuf.slice(0, sz) || ''
end
+
+ ret
end
def write(buf)
@@ -143,6 +147,7 @@
@wbuf = ''
@read = read
@write = write
+ @index = 0
end
def open?
@@ -162,9 +167,10 @@
return '' if sz <= 0
- read_frame if @rbuf.empty?
+ read_frame if @index >= @rbuf.length
- @rbuf.slice!(0, sz)
+ @index += sz
+ @rbuf.slice(@index - sz, sz) || ''
end
def write(buf,sz=nil)
@@ -192,7 +198,8 @@
def read_frame
sz = @transport.read_all(4).unpack('N').first
- @rbuf = @transport.read_all(sz).dup # protect against later #slice!
+ @index = 0
+ @rbuf = @transport.read_all(sz)
end
end