diff options
author | Mathias Stearn <mathias@10gen.com> | 2014-11-07 19:42:38 -0500 |
---|---|---|
committer | Mathias Stearn <mathias@10gen.com> | 2014-11-10 13:57:10 -0500 |
commit | 7fa44159b371c106cd9742174ff13a22aab5ce21 (patch) | |
tree | a44f75b1cb2ca56e42ff69e66f04041dd9f99c9d /src/mongo/db/storage/record_data.h | |
parent | 0c1c8e9e31bfe24aaf4ad77090dd835eae125265 (diff) | |
download | mongo-7fa44159b371c106cd9742174ff13a22aab5ce21.tar.gz |
SERVER-16048 Eliminate double copy and most ref-counting with RecordData
Diffstat (limited to 'src/mongo/db/storage/record_data.h')
-rw-r--r-- | src/mongo/db/storage/record_data.h | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/src/mongo/db/storage/record_data.h b/src/mongo/db/storage/record_data.h index e617f342a8c..a819422f0ab 100644 --- a/src/mongo/db/storage/record_data.h +++ b/src/mongo/db/storage/record_data.h @@ -30,9 +30,8 @@ #pragma once -#include <boost/shared_array.hpp> - #include "mongo/bson/bsonobj.h" +#include "mongo/util/shared_buffer.h" namespace mongo { @@ -45,10 +44,11 @@ namespace mongo { class RecordData { public: RecordData() : _data( NULL ), _size( 0 ) {} - RecordData(const char* data, int size): _data(data), _size(size), _dataPtr() { } + RecordData(const char* data, int size): _data(data), _size(size) { } - RecordData(const char* data, int size, const boost::shared_array<char>& dataPtr) - : _data(data), _size(size), _dataPtr(dataPtr) { } + RecordData(SharedBuffer ownedData, int size) + : _data(ownedData.get()), _size(size), _ownedData(ownedData.moveFrom()) { + } const char* data() const { return _data; } @@ -57,15 +57,23 @@ namespace mongo { /** * Returns true if this owns its own memory, and false otherwise */ - bool isOwned() const { return _dataPtr.get(); } + bool isOwned() const { return _ownedData.get(); } + + SharedBuffer releaseBuffer() { + return _ownedData.moveFrom(); + } + + BSONObj toBson() const { return isOwned() ? BSONObj(_ownedData) : BSONObj(_data); } + + BSONObj releaseToBson() { return isOwned() ? BSONObj(releaseBuffer()) : BSONObj(_data); } - // TODO eliminate double-copying - BSONObj toBson() const { return isOwned() ? BSONObj(_data).getOwned() : BSONObj(_data); } + // TODO uncomment once we require compilers that support overloading for rvalue this. + // BSONObj toBson() && { return releaseToBson(); } private: const char* _data; int _size; - boost::shared_array<char> _dataPtr; + SharedBuffer _ownedData; }; } // namespace mongo |