diff options
Diffstat (limited to 'src/cpp')
-rw-r--r-- | src/cpp/server/health/default_health_check_service.cc | 1 | ||||
-rw-r--r-- | src/cpp/util/byte_buffer_cc.cc | 37 | ||||
-rw-r--r-- | src/cpp/util/slice_cc.cc | 2 |
3 files changed, 26 insertions, 14 deletions
diff --git a/src/cpp/server/health/default_health_check_service.cc b/src/cpp/server/health/default_health_check_service.cc index 815b607032..d2cba6d662 100644 --- a/src/cpp/server/health/default_health_check_service.cc +++ b/src/cpp/server/health/default_health_check_service.cc @@ -20,6 +20,7 @@ #include <mutex> #include <grpc++/impl/codegen/method_handler_impl.h> +#include <grpc/slice.h> #include <grpc/support/alloc.h> #include <grpc/support/log.h> diff --git a/src/cpp/util/byte_buffer_cc.cc b/src/cpp/util/byte_buffer_cc.cc index b1ff25252a..1ebe22b6a4 100644 --- a/src/cpp/util/byte_buffer_cc.cc +++ b/src/cpp/util/byte_buffer_cc.cc @@ -16,11 +16,15 @@ * */ +#include <grpc++/impl/grpc_library.h> #include <grpc++/support/byte_buffer.h> +#include <grpc/byte_buffer.h> #include <grpc/byte_buffer_reader.h> namespace grpc { +static internal::GrpcLibraryInitializer g_gli_initializer; + ByteBuffer::ByteBuffer(const Slice* slices, size_t nslices) { // The following assertions check that the representation of a grpc::Slice is // identical to that of a grpc_slice: it has a grpc_slice field, and nothing @@ -29,6 +33,7 @@ ByteBuffer::ByteBuffer(const Slice* slices, size_t nslices) { "Slice must have same representation as grpc_slice"); static_assert(sizeof(Slice) == sizeof(grpc_slice), "Slice must have same representation as grpc_slice"); + g_gli_initializer.summon(); // Make sure that initializer linked in // The const_cast is legal if grpc_raw_byte_buffer_create() does no more // than its advertised side effect of increasing the reference count of the // slices it processes, and such an increase does not affect the semantics @@ -37,19 +42,6 @@ ByteBuffer::ByteBuffer(const Slice* slices, size_t nslices) { reinterpret_cast<grpc_slice*>(const_cast<Slice*>(slices)), nslices); } -ByteBuffer::~ByteBuffer() { - if (buffer_) { - grpc_byte_buffer_destroy(buffer_); - } -} - -void ByteBuffer::Clear() { - if (buffer_) { - grpc_byte_buffer_destroy(buffer_); - buffer_ = nullptr; - } -} - Status ByteBuffer::Dump(std::vector<Slice>* slices) const { slices->clear(); if (!buffer_) { @@ -80,7 +72,9 @@ ByteBuffer::ByteBuffer(const ByteBuffer& buf) : buffer_(grpc_byte_buffer_copy(buf.buffer_)) {} ByteBuffer& ByteBuffer::operator=(const ByteBuffer& buf) { - Clear(); // first remove existing data + if (this != &buf) { + Clear(); // first remove existing data + } if (buf.buffer_) { buffer_ = grpc_byte_buffer_copy(buf.buffer_); // then copy } @@ -93,4 +87,19 @@ void ByteBuffer::Swap(ByteBuffer* other) { buffer_ = tmp; } +ByteBuffer::operator grpc_byte_buffer*() { + // The following assertions check that the representation of a ByteBuffer is + // identical to grpc_byte_buffer*: it has a grpc_byte_buffer* field, + // and nothing else. + static_assert(std::is_same<decltype(buffer_), grpc_byte_buffer*>::value, + "ByteBuffer must have same representation as " + "grpc_byte_buffer*"); + static_assert(sizeof(ByteBuffer) == sizeof(grpc_byte_buffer*), + "ByteBuffer must have same representation as " + "grpc_byte_buffer*"); + return buffer_; +} + +ByteBuffer::operator const grpc_byte_buffer*() const { return buffer_; } + } // namespace grpc diff --git a/src/cpp/util/slice_cc.cc b/src/cpp/util/slice_cc.cc index 486d0cdf0e..3ae17e8052 100644 --- a/src/cpp/util/slice_cc.cc +++ b/src/cpp/util/slice_cc.cc @@ -50,4 +50,6 @@ Slice::Slice(void* buf, size_t len, void (*destroy)(void*), void* user_data) Slice::Slice(void* buf, size_t len, void (*destroy)(void*, size_t)) : slice_(grpc_slice_new_with_len(buf, len, destroy)) {} +grpc_slice Slice::c_slice() const { return grpc_slice_ref(slice_); } + } // namespace grpc |