You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by je...@apache.org on 2013/03/07 20:41:58 UTC

git commit: THRIFT-1872 issues with TBufferedTransport buffer

Updated Branches:
  refs/heads/master 20c81ad74 -> 6a7463a72


THRIFT-1872 issues with TBufferedTransport buffer

Patch: Jens Geyer


Project: http://git-wip-us.apache.org/repos/asf/thrift/repo
Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/6a7463a7
Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/6a7463a7
Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/6a7463a7

Branch: refs/heads/master
Commit: 6a7463a725db0ff228cc9048f9f1bfb8319c0f96
Parents: 20c81ad
Author: Jens Geyer <je...@apache.org>
Authored: Thu Mar 7 20:40:59 2013 +0100
Committer: Jens Geyer <je...@apache.org>
Committed: Thu Mar 7 20:40:59 2013 +0100

----------------------------------------------------------------------
 lib/delphi/src/Thrift.Transport.pas |   63 +++++++++++++++++------------
 1 files changed, 37 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/thrift/blob/6a7463a7/lib/delphi/src/Thrift.Transport.pas
----------------------------------------------------------------------
diff --git a/lib/delphi/src/Thrift.Transport.pas b/lib/delphi/src/Thrift.Transport.pas
index 0664772..8668e5a 100644
--- a/lib/delphi/src/Thrift.Transport.pas
+++ b/lib/delphi/src/Thrift.Transport.pas
@@ -26,6 +26,7 @@ interface
 uses
   Classes,
   SysUtils,
+  Math,
   Sockets,
   Generics.Collections,
   Thrift.Collections,
@@ -202,7 +203,8 @@ type
   private
     FStream : IThriftStream;
     FBufSize : Integer;
-    FBuffer : TMemoryStream;
+    FReadBuffer : TMemoryStream;
+    FWriteBuffer : TMemoryStream;
   protected
     procedure Write( const buffer: TBytes; offset: Integer; count: Integer); override;
     function Read( var buffer: TBytes; offset: Integer; count: Integer): Integer; override;
@@ -769,15 +771,20 @@ procedure TBufferedStreamImpl.Close;
 begin
   Flush;
   FStream := nil;
-  FBuffer.Free;
-  FBuffer := nil;
+
+  FReadBuffer.Free;
+  FReadBuffer := nil;
+
+  FWriteBuffer.Free;
+  FWriteBuffer := nil;
 end;
 
 constructor TBufferedStreamImpl.Create( const AStream: IThriftStream; ABufSize: Integer);
 begin
   FStream := AStream;
   FBufSize := ABufSize;
-  FBuffer := TMemoryStream.Create;
+  FReadBuffer := TMemoryStream.Create;
+  FWriteBuffer := TMemoryStream.Create;
 end;
 
 destructor TBufferedStreamImpl.Destroy;
@@ -793,21 +800,23 @@ var
 begin
   if IsOpen then
   begin
-    len := FBuffer.Size;
+    len := FWriteBuffer.Size;
     if len > 0 then
     begin
       SetLength( buf, len );
-      FBuffer.Position := 0;
-      FBuffer.Read( Pointer(@buf[0])^, len );
+      FWriteBuffer.Position := 0;
+      FWriteBuffer.Read( Pointer(@buf[0])^, len );
       FStream.Write( buf, 0, len );
     end;
-    FBuffer.Clear;
+    FWriteBuffer.Clear;
   end;
 end;
 
 function TBufferedStreamImpl.IsOpen: Boolean;
 begin
-  Result := (FBuffer <> nil) and ( FStream <> nil);
+  Result := (FWriteBuffer <> nil)
+        and (FReadBuffer <> nil)
+        and (FStream <> nil);
 end;
 
 procedure TBufferedStreamImpl.Open;
@@ -822,25 +831,27 @@ var
 begin
   inherited;
   Result := 0;
-  if count > 0 then
+  if IsOpen then
   begin
-    if IsOpen then
-    begin
-      if FBuffer.Position >= FBuffer.Size then
+    while count > 0 do begin
+
+      if FReadBuffer.Position >= FReadBuffer.Size then
       begin
-        FBuffer.Clear;
+        FReadBuffer.Clear;
         SetLength( tempbuf, FBufSize);
         nRead := FStream.Read( tempbuf, 0, FBufSize );
-        if nRead > 0 then
-        begin
-          FBuffer.WriteBuffer( Pointer(@tempbuf[0])^, nRead );
-          FBuffer.Position := 0;
-        end;
+        if nRead = 0 then Break; // avoid infinite loop
+
+        FReadBuffer.WriteBuffer( Pointer(@tempbuf[0])^, nRead );
+        FReadBuffer.Position := 0;
       end;
 
-      if FBuffer.Position < FBuffer.Size then
+      if FReadBuffer.Position < FReadBuffer.Size then
       begin
-        Result := FBuffer.Read( Pointer(@buffer[offset])^, count );
+        nRead  := Min( FReadBuffer.Size - FReadBuffer.Position, count);
+        Inc( Result, FReadBuffer.Read( Pointer(@buffer[offset])^, nRead));
+        Dec( count, nRead);
+        Inc( offset, nRead);
       end;
     end;
   end;
@@ -854,15 +865,15 @@ begin
 
   if IsOpen then
   begin
-    len := FBuffer.Size;
+    len := FReadBuffer.Size;
   end;
 
   SetLength( Result, len);
 
   if len > 0 then
   begin
-    FBuffer.Position := 0;
-    FBuffer.Read( Pointer(@Result[0])^, len );
+    FReadBuffer.Position := 0;
+    FReadBuffer.Read( Pointer(@Result[0])^, len );
   end;
 end;
 
@@ -873,8 +884,8 @@ begin
   begin
     if IsOpen then
     begin
-      FBuffer.Write( Pointer(@buffer[offset])^, count );
-      if FBuffer.Size > FBufSize then
+      FWriteBuffer.Write( Pointer(@buffer[offset])^, count );
+      if FWriteBuffer.Size > FBufSize then
       begin
         Flush;
       end;