THRIFT-922. cpp: Revert the BufferBase part of r750585

r750585 included two logically distinct changes, one of which was not
referenced in the commit message and was not reviewed by a C++
maintainer.  It was committed more-or-less by accident.  This patch
reverts that part of the change since it conflicts with the template
code in some complicated ways.

git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@1005125 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
David Reiss 2010-10-06 17:09:31 +00:00
parent 1df96ce22f
commit 8c535ab87c

View File

@ -168,15 +168,48 @@ class TBufferBase : public TTransport {
}; };
/** /**
* Base class for all transport which wraps transport to new one. * Buffered transport. For reads it will read more data than is requested
* and will serve future data out of a local buffer. For writes, data is
* stored to an in memory buffer before being written out.
*
*/ */
class TUnderlyingTransport : public TBufferBase { class TBufferedTransport : public TBufferBase {
public: public:
static const int DEFAULT_BUFFER_SIZE = 512; static const int DEFAULT_BUFFER_SIZE = 512;
virtual bool peek() { /// Use default buffer sizes.
return (rBase_ < rBound_) || transport_->peek(); TBufferedTransport(boost::shared_ptr<TTransport> transport)
: transport_(transport)
, rBufSize_(DEFAULT_BUFFER_SIZE)
, wBufSize_(DEFAULT_BUFFER_SIZE)
, rBuf_(new uint8_t[rBufSize_])
, wBuf_(new uint8_t[wBufSize_])
{
initPointers();
}
/// Use specified buffer sizes.
TBufferedTransport(boost::shared_ptr<TTransport> transport, uint32_t sz)
: transport_(transport)
, rBufSize_(sz)
, wBufSize_(sz)
, rBuf_(new uint8_t[rBufSize_])
, wBuf_(new uint8_t[wBufSize_])
{
initPointers();
}
/// Use specified read and write buffer sizes.
TBufferedTransport(boost::shared_ptr<TTransport> transport, uint32_t rsz, uint32_t wsz)
: transport_(transport)
, rBufSize_(rsz)
, wBufSize_(wsz)
, rBuf_(new uint8_t[rBufSize_])
, wBuf_(new uint8_t[wBufSize_])
{
initPointers();
} }
void open() { void open() {
@ -187,82 +220,18 @@ class TUnderlyingTransport : public TBufferBase {
return transport_->isOpen(); return transport_->isOpen();
} }
void close() { bool peek() {
flush();
transport_->close();
}
boost::shared_ptr<TTransport> getUnderlyingTransport() {
return transport_;
}
protected:
boost::shared_ptr<TTransport> transport_;
uint32_t rBufSize_;
uint32_t wBufSize_;
boost::scoped_array<uint8_t> rBuf_;
boost::scoped_array<uint8_t> wBuf_;
TUnderlyingTransport(boost::shared_ptr<TTransport> transport, uint32_t sz)
: transport_(transport)
, rBufSize_(sz)
, wBufSize_(sz)
, rBuf_(new uint8_t[rBufSize_])
, wBuf_(new uint8_t[wBufSize_]) {}
TUnderlyingTransport(boost::shared_ptr<TTransport> transport)
: transport_(transport)
, rBufSize_(DEFAULT_BUFFER_SIZE)
, wBufSize_(DEFAULT_BUFFER_SIZE)
, rBuf_(new uint8_t[rBufSize_])
, wBuf_(new uint8_t[wBufSize_]) {}
TUnderlyingTransport(boost::shared_ptr<TTransport> transport, uint32_t rsz, uint32_t wsz)
: transport_(transport)
, rBufSize_(rsz)
, wBufSize_(wsz)
, rBuf_(new uint8_t[rBufSize_])
, wBuf_(new uint8_t[wBufSize_]) {}
};
/**
* Buffered transport. For reads it will read more data than is requested
* and will serve future data out of a local buffer. For writes, data is
* stored to an in memory buffer before being written out.
*
*/
class TBufferedTransport : public TUnderlyingTransport {
public:
/// Use default buffer sizes.
TBufferedTransport(boost::shared_ptr<TTransport> transport)
: TUnderlyingTransport(transport)
{
initPointers();
}
/// Use specified buffer sizes.
TBufferedTransport(boost::shared_ptr<TTransport> transport, uint32_t sz)
: TUnderlyingTransport(transport, sz)
{
initPointers();
}
/// Use specified read and write buffer sizes.
TBufferedTransport(boost::shared_ptr<TTransport> transport, uint32_t rsz, uint32_t wsz)
: TUnderlyingTransport(transport, rsz, wsz)
{
initPointers();
}
virtual bool peek() {
/* shigin: see THRIFT-96 discussion */
if (rBase_ == rBound_) { if (rBase_ == rBound_) {
setReadBuffer(rBuf_.get(), transport_->read(rBuf_.get(), rBufSize_)); setReadBuffer(rBuf_.get(), transport_->read(rBuf_.get(), rBufSize_));
} }
return (rBound_ > rBase_); return (rBound_ > rBase_);
} }
void close() {
flush();
transport_->close();
}
virtual uint32_t readSlow(uint8_t* buf, uint32_t len); virtual uint32_t readSlow(uint8_t* buf, uint32_t len);
virtual void writeSlow(const uint8_t* buf, uint32_t len); virtual void writeSlow(const uint8_t* buf, uint32_t len);
@ -283,12 +252,23 @@ class TBufferedTransport : public TUnderlyingTransport {
*/ */
virtual const uint8_t* borrowSlow(uint8_t* buf, uint32_t* len); virtual const uint8_t* borrowSlow(uint8_t* buf, uint32_t* len);
boost::shared_ptr<TTransport> getUnderlyingTransport() {
return transport_;
}
protected: protected:
void initPointers() { void initPointers() {
setReadBuffer(rBuf_.get(), 0); setReadBuffer(rBuf_.get(), 0);
setWriteBuffer(wBuf_.get(), wBufSize_); setWriteBuffer(wBuf_.get(), wBufSize_);
// Write size never changes. // Write size never changes.
} }
boost::shared_ptr<TTransport> transport_;
uint32_t rBufSize_;
uint32_t wBufSize_;
boost::scoped_array<uint8_t> rBuf_;
boost::scoped_array<uint8_t> wBuf_;
}; };
@ -319,22 +299,49 @@ class TBufferedTransportFactory : public TTransportFactory {
* other end to always do fixed-length reads. * other end to always do fixed-length reads.
* *
*/ */
class TFramedTransport : public TUnderlyingTransport { class TFramedTransport : public TBufferBase {
public: public:
static const int DEFAULT_BUFFER_SIZE = 512;
/// Use default buffer sizes. /// Use default buffer sizes.
TFramedTransport(boost::shared_ptr<TTransport> transport) TFramedTransport(boost::shared_ptr<TTransport> transport)
: TUnderlyingTransport(transport) : transport_(transport)
, rBufSize_(0)
, wBufSize_(DEFAULT_BUFFER_SIZE)
, rBuf_()
, wBuf_(new uint8_t[wBufSize_])
{ {
initPointers(); initPointers();
} }
TFramedTransport(boost::shared_ptr<TTransport> transport, uint32_t sz) TFramedTransport(boost::shared_ptr<TTransport> transport, uint32_t sz)
: TUnderlyingTransport(transport, sz) : transport_(transport)
, rBufSize_(0)
, wBufSize_(sz)
, rBuf_()
, wBuf_(new uint8_t[wBufSize_])
{ {
initPointers(); initPointers();
} }
void open() {
transport_->open();
}
bool isOpen() {
return transport_->isOpen();
}
bool peek() {
return (rBase_ < rBound_) || transport_->peek();
}
void close() {
flush();
transport_->close();
}
virtual uint32_t readSlow(uint8_t* buf, uint32_t len); virtual uint32_t readSlow(uint8_t* buf, uint32_t len);
virtual void writeSlow(const uint8_t* buf, uint32_t len); virtual void writeSlow(const uint8_t* buf, uint32_t len);
@ -343,6 +350,10 @@ class TFramedTransport : public TUnderlyingTransport {
const uint8_t* borrowSlow(uint8_t* buf, uint32_t* len); const uint8_t* borrowSlow(uint8_t* buf, uint32_t* len);
boost::shared_ptr<TTransport> getUnderlyingTransport() {
return transport_;
}
protected: protected:
/** /**
* Reads a frame of input from the underlying stream. * Reads a frame of input from the underlying stream.
@ -357,6 +368,13 @@ class TFramedTransport : public TUnderlyingTransport {
int32_t pad = 0; int32_t pad = 0;
this->write((uint8_t*)&pad, sizeof(pad)); this->write((uint8_t*)&pad, sizeof(pad));
} }
boost::shared_ptr<TTransport> transport_;
uint32_t rBufSize_;
uint32_t wBufSize_;
boost::scoped_array<uint8_t> rBuf_;
boost::scoped_array<uint8_t> wBuf_;
}; };
/** /**