initial imple of byte buffer and slice

pull/1003/head
Yang Gao 10 years ago
parent 5f4539f4e8
commit 61c413182d
  1. 4
      Makefile
  2. 2
      build.json
  3. 24
      include/grpc++/byte_buffer.h
  4. 21
      include/grpc++/slice.h
  5. 73
      src/cpp/util/byte_buffer.cc
  6. 50
      src/cpp/util/slice.cc

@ -3092,6 +3092,7 @@ LIBGRPC++_SRC = \
src/cpp/server/server_credentials.cc \
src/cpp/server/thread_pool.cc \
src/cpp/util/byte_buffer.cc \
src/cpp/util/slice.cc \
src/cpp/util/status.cc \
src/cpp/util/time.cc \
@ -3116,6 +3117,7 @@ PUBLIC_HEADERS_CXX += \
include/grpc++/server_builder.h \
include/grpc++/server_context.h \
include/grpc++/server_credentials.h \
include/grpc++/slice.h \
include/grpc++/status.h \
include/grpc++/status_code_enum.h \
include/grpc++/stream.h \
@ -3173,6 +3175,7 @@ src/cpp/server/server_context.cc: $(OPENSSL_DEP)
src/cpp/server/server_credentials.cc: $(OPENSSL_DEP)
src/cpp/server/thread_pool.cc: $(OPENSSL_DEP)
src/cpp/util/byte_buffer.cc: $(OPENSSL_DEP)
src/cpp/util/slice.cc: $(OPENSSL_DEP)
src/cpp/util/status.cc: $(OPENSSL_DEP)
src/cpp/util/time.cc: $(OPENSSL_DEP)
endif
@ -3234,6 +3237,7 @@ $(OBJDIR)/$(CONFIG)/src/cpp/server/server_context.o:
$(OBJDIR)/$(CONFIG)/src/cpp/server/server_credentials.o:
$(OBJDIR)/$(CONFIG)/src/cpp/server/thread_pool.o:
$(OBJDIR)/$(CONFIG)/src/cpp/util/byte_buffer.o:
$(OBJDIR)/$(CONFIG)/src/cpp/util/slice.o:
$(OBJDIR)/$(CONFIG)/src/cpp/util/status.o:
$(OBJDIR)/$(CONFIG)/src/cpp/util/time.o:

@ -413,6 +413,7 @@
"include/grpc++/server_builder.h",
"include/grpc++/server_context.h",
"include/grpc++/server_credentials.h",
"include/grpc++/slice.h",
"include/grpc++/status.h",
"include/grpc++/status_code_enum.h",
"include/grpc++/stream.h",
@ -443,6 +444,7 @@
"src/cpp/server/server_credentials.cc",
"src/cpp/server/thread_pool.cc",
"src/cpp/util/byte_buffer.cc",
"src/cpp/util/slice.cc",
"src/cpp/util/status.cc",
"src/cpp/util/time.cc"
],

@ -31,12 +31,15 @@
*
*/
#ifndef __GRPCPP_BYTE_BUFFER_H_
#define __GRPCPP_BYTE_BUFFER_H_
#ifndef GRPCXX_BYTE_BUFFER_H
#define GRPCXX_BYTE_BUFFER_H
#include <grpc/grpc.h>
#include <grpc/support/log.h>
#include <grpc++/config.h>
#include <grpc++/slice.h>
#include <vector>
namespace grpc {
@ -44,29 +47,38 @@ class ByteBuffer GRPC_FINAL {
public:
ByteBuffer() : buffer_(nullptr) {}
ByteBuffer(Slice* slices, size_t nslices);
~ByteBuffer() {
if (buffer_) {
grpc_byte_buffer_destroy(buffer_);
}
}
void Dump(std::vector<Slice>* slices);
void Clear();
size_t Length();
private:
friend class CallOpBuffer;
// takes ownership
void set_buffer(grpc_byte_buffer* buf) {
GPR_ASSERT(!buffer_);
if (buffer_) {
gpr_log(GPR_ERROR, "Overriding existing buffer");
Clear();
}
buffer_ = buf;
}
grpc_byte_buffer* buffer() const {
GPR_ASSERT(buffer_);
return buffer_;
}
grpc_byte_buffer* buffer_;
};
} // namespace
} // namespace grpc
#endif
#endif // GRPCXX_BYTE_BUFFER_H

@ -31,15 +31,15 @@
*
*/
#ifndef __GRPCPP_SLICE_H_
#define __GRPCPP_SLICE_H_
#ifndef GRPCXX_SLICE_H
#define GRPCXX_SLICE_H
#include <grpc++/stream.h>
#include <grpc/slice.h>
#include <grpc/support/slice.h>
#include <grpc++/config.h>
namespace grpc {
class Slice {
class Slice GRPC_FINAL {
public:
// construct empty slice
Slice();
@ -54,16 +54,21 @@ class Slice {
// copy constructor - adds a ref
Slice(const Slice& other);
// assignment
Slice& operator=(Slice other) { std::swap(slice_, other.slice_); }
Slice& operator=(Slice other) {
std::swap(slice_, other.slice_);
return *this;
}
size_t size() const { return GPR_SLICE_LENGTH(slice_); }
const gpr_uint8* begin() const { return GPR_SLICE_START_PTR(slice_); }
const gpr_uint8* end() const { return GPR_SLICE_END_PTR(slice_); }
private:
friend class ByteBuffer;
gpr_slice slice_;
};
} // namespace grpc
} // namespace grpc
#endif
#endif // GRPCXX_SLICE_H

@ -1,2 +1,75 @@
/*
*
* Copyright 2015, Google Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#include <grpc++/byte_buffer.h>
namespace grpc {
ByteBuffer::ByteBuffer(Slice* slices, size_t nslices) {
// TODO(yangg) maybe expose some core API to simplify this
std::vector<gpr_slice> c_slices(nslices);
for (size_t i = 0; i < nslices; i++) {
c_slices[i] = slices[i].slice_;
}
buffer_ = grpc_byte_buffer_create(c_slices.data(), nslices);
}
void ByteBuffer::Clear() {
if (buffer_) {
grpc_byte_buffer_destroy(buffer_);
buffer_ = nullptr;
}
}
void ByteBuffer::Dump(std::vector<Slice>* slices) {
slices->clear();
if (!buffer_) {
return;
}
grpc_byte_buffer_reader* reader = grpc_byte_buffer_reader_create(buffer_);
gpr_slice s;
while (grpc_byte_buffer_reader_next(reader, &s)) {
slices->push_back(Slice(s, Slice::STEAL_REF));
}
grpc_byte_buffer_reader_destroy(reader);
}
size_t ByteBuffer::Length() {
if (buffer_) {
return grpc_byte_buffer_length(buffer_);
} else {
return 0;
}
}
} // namespace grpc

@ -0,0 +1,50 @@
/*
*
* Copyright 2015, Google Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#include <grpc++/slice.h>
namespace grpc {
Slice::Slice() : slice_(gpr_empty_slice()) {}
Slice::~Slice() {
gpr_slice_unref(slice_);
}
Slice::Slice(gpr_slice slice, AddRef) : slice_(gpr_slice_ref(slice)) {}
Slice::Slice(gpr_slice slice, StealRef) : slice_(slice) {}
Slice::Slice(const Slice& other) : slice_(gpr_slice_ref(other.slice_)) {}
} // namespace grpc
Loading…
Cancel
Save