Browse Source

ByteBuffer improvements suggested by jconverse

Tim Burks 9 years ago
parent
commit
311de0aedb

+ 3 - 30
Packages/CgRPC/Sources/byte_buffer.c

@@ -43,45 +43,21 @@ void cgrpc_byte_buffer_destroy(cgrpc_byte_buffer *bb) {
   grpc_byte_buffer_destroy(bb);
 }
 
-cgrpc_byte_buffer *cgrpc_byte_buffer_create_with_string(const char *string) {
-  gpr_slice request_payload_slice = gpr_slice_from_copied_string(string);
-  cgrpc_byte_buffer *bb = grpc_raw_byte_buffer_create(&request_payload_slice, 1);
-  gpr_slice_unref(request_payload_slice);
-  return bb;
-}
-
-cgrpc_byte_buffer *cgrpc_byte_buffer_create_with_data(const void *source, size_t len) {
+cgrpc_byte_buffer *cgrpc_byte_buffer_create_by_copying_data(const void *source, size_t len) {
   gpr_slice request_payload_slice = gpr_slice_from_copied_buffer(source, len);
   cgrpc_byte_buffer *bb = grpc_raw_byte_buffer_create(&request_payload_slice, 1);
   gpr_slice_unref(request_payload_slice);
   return bb;
 }
 
-const char *cgrpc_byte_buffer_as_string(grpc_byte_buffer *bb) {
-  if (!bb) {
-    return "";
-  }
-  grpc_byte_buffer_reader reader;
-  bool success = grpc_byte_buffer_reader_init(&reader, bb);
-  if (!success) {
-    return "";
-  }
-  gpr_slice slice = grpc_byte_buffer_reader_readall(&reader);
-  const char *result = strndup((const char *) GPR_SLICE_START_PTR(slice),
-                               (size_t) GPR_SLICE_LENGTH(slice));
-  gpr_slice_unref(slice);
-  grpc_byte_buffer_reader_destroy(&reader);
-  return result;
-}
-
-const void *cgrpc_byte_buffer_as_data(cgrpc_byte_buffer *bb, size_t *length) {
+const void *cgrpc_byte_buffer_copy_data(cgrpc_byte_buffer *bb, size_t *length) {
   if (!bb) {
     return NULL;
   }
   grpc_byte_buffer_reader reader;
   bool success = grpc_byte_buffer_reader_init(&reader, bb);
   if (!success) {
-    return "";
+    return NULL;
   }
   gpr_slice slice = grpc_byte_buffer_reader_readall(&reader);
   *length = (size_t) GPR_SLICE_LENGTH(slice);
@@ -91,6 +67,3 @@ const void *cgrpc_byte_buffer_as_data(cgrpc_byte_buffer *bb, size_t *length) {
   grpc_byte_buffer_reader_destroy(&reader);
   return result;
 }
-
-
-

+ 2 - 4
Packages/CgRPC/Sources/cgrpc.h

@@ -194,10 +194,8 @@ void cgrpc_mutex_unlock(cgrpc_mutex *mu);
 
 // byte buffer support
 void cgrpc_byte_buffer_destroy(cgrpc_byte_buffer *bb);
-cgrpc_byte_buffer *cgrpc_byte_buffer_create_with_string(const char *string);
-cgrpc_byte_buffer *cgrpc_byte_buffer_create_with_data(const void *source, size_t len);
-const char *cgrpc_byte_buffer_as_string(cgrpc_byte_buffer *bb);
-const void *cgrpc_byte_buffer_as_data(cgrpc_byte_buffer *bb, size_t *length);
+cgrpc_byte_buffer *cgrpc_byte_buffer_create_by_copying_data(const void *source, size_t len);
+const void *cgrpc_byte_buffer_copy_data(cgrpc_byte_buffer *bb, size_t *length);
 
 // event support
 int64_t cgrpc_event_tag(grpc_event ev);

+ 20 - 35
Packages/gRPC/Sources/ByteBuffer.swift

@@ -36,57 +36,42 @@
 import Foundation // for String.Encoding
 
 /// Representation of raw data that may be sent and received using gRPC
-class ByteBuffer {
+public class ByteBuffer {
 
   /// Pointer to underlying C representation
-  var b: UnsafeMutableRawPointer!
+  internal var internalByteBuffer: UnsafeMutableRawPointer!
 
-  /// The provider of data in the buffer (if needed) to ensure that it is retained.
-  private var source : Any?
-
-  /// Initializes a ByteBuffer
-  ///
-  /// - Parameter b: the underlying C representation
-  init(b: UnsafeMutableRawPointer) {
-    self.b = b
-  }
-
-  /// Initializes a ByteBuffer
+  /// Creates a ByteBuffer from an underlying C representation.
+  /// The ByteBuffer takes ownership of the passed-in representation.
   ///
-  /// - Parameter string: a string to store in the buffer
-  init(string: String) {
-    self.b = cgrpc_byte_buffer_create_with_string(string)
-    self.source = string
+  /// - Parameter underlyingByteBuffer: the underlying C representation
+  internal init(underlyingByteBuffer: UnsafeMutableRawPointer) {
+    self.internalByteBuffer = underlyingByteBuffer
   }
 
-  /// Initializes a ByteBuffer
+  /// Creates a byte buffer that contains a copy of the contents of `data`
   ///
-  /// - Parameter data: data to store in the buffer
-  init(data: Data) {
+  /// - Parameter data: the data to store in the buffer
+  public init(data: Data) {
     data.withUnsafeBytes { (bytes) in
-      self.b = cgrpc_byte_buffer_create_with_data(bytes, data.count)
+      self.internalByteBuffer = cgrpc_byte_buffer_create_by_copying_data(bytes, data.count)
     }
-    self.source = data
   }
 
   deinit {
-    cgrpc_byte_buffer_destroy(b);
+    cgrpc_byte_buffer_destroy(internalByteBuffer);
   }
 
-  /// Gets a string from the contents of the ByteBuffer
-  ///
-  /// - Returns: a string formed from the ByteBuffer contents
-  func string() -> String {
-    return String(cString:cgrpc_byte_buffer_as_string(b),
-                  encoding:String.Encoding.utf8)!
-  }
-
-  /// Gets raw data from the contents of the ByteBuffer
+  /// Gets data from the contents of the ByteBuffer
   ///
   /// - Returns: data formed from the ByteBuffer contents
-  func data() -> Data {
+  public func data() -> Data? {
     var length : Int = 0
-    let bytes = cgrpc_byte_buffer_as_data(b, &length)
-    return Data(bytes:bytes!, count: length)
+    guard let bytes = cgrpc_byte_buffer_copy_data(internalByteBuffer, &length) else {
+      return nil
+    }
+    return Data(bytesNoCopy: UnsafeMutableRawPointer(mutating: bytes),
+                count: length,
+                deallocator: .free)
   }
 }

+ 2 - 2
Packages/gRPC/Sources/Operation.swift

@@ -72,7 +72,7 @@ class Operation_SendMessage : Operation {
   /// - Parameter message: the message to send
   init(message:ByteBuffer) {
     super.init(observer:cgrpc_observer_create_send_message())
-    cgrpc_observer_send_message_set_message(observer, message.b);
+    cgrpc_observer_send_message_set_message(observer, message.internalByteBuffer);
   }
 }
 
@@ -131,7 +131,7 @@ class Operation_ReceiveMessage : Operation {
   /// - Returns: message
   func message() -> ByteBuffer? {
     if let b = cgrpc_observer_recv_message_get_message(observer) {
-      return ByteBuffer(b:b)
+      return ByteBuffer(underlyingByteBuffer:b)
     } else {
       return nil
     }