aboutsummaryrefslogtreecommitdiffhomepage
path: root/tensorflow/compiler/xla/service/shaped_buffer.cc
diff options
context:
space:
mode:
authorGravatar Justin Lebar <jlebar@google.com>2018-04-19 17:18:10 -0700
committerGravatar TensorFlower Gardener <gardener@tensorflow.org>2018-04-19 17:22:23 -0700
commit4e17a3f1496b398afe632b002b0589b7346b2e3f (patch)
tree3fadd04a5e74f698e2bd2c2e2a5cc21f230b9b51 /tensorflow/compiler/xla/service/shaped_buffer.cc
parent2d8da1d12a5fbeaa99e1cdd761b735a02020611b (diff)
[XLA] De-unique_ptr-ify ShapedBuffer and ScopedShapedBuffer.
These are already notionally equivalent to T* and unique_ptr<T>, so having a unique_ptr of a {Scoped,}ShapedBuffer is pretty redundant. Also clean up the ScopedShapedBuffer API a bit. PiperOrigin-RevId: 193599773
Diffstat (limited to 'tensorflow/compiler/xla/service/shaped_buffer.cc')
-rw-r--r--tensorflow/compiler/xla/service/shaped_buffer.cc36
1 files changed, 22 insertions, 14 deletions
diff --git a/tensorflow/compiler/xla/service/shaped_buffer.cc b/tensorflow/compiler/xla/service/shaped_buffer.cc
index 10a2aa2b30..0b5a383f6f 100644
--- a/tensorflow/compiler/xla/service/shaped_buffer.cc
+++ b/tensorflow/compiler/xla/service/shaped_buffer.cc
@@ -66,6 +66,8 @@ ShapedBuffer& ShapedBuffer::operator=(ShapedBuffer&& s) {
return *this;
}
+ShapedBuffer::~ShapedBuffer() {}
+
void ShapedBuffer::clear() {
for (auto& pair : buffers_) {
// A default constructed DeviceMemoryBase is a null pointer.
@@ -102,18 +104,6 @@ std::ostream& operator<<(std::ostream& out, const ShapedBuffer& buffer) {
return out;
}
-/* static */
-StatusOr<std::unique_ptr<ScopedShapedBuffer>> ScopedShapedBuffer::MakeScoped(
- ShapedBuffer* shaped_buffer, DeviceMemoryAllocator* allocator) {
- auto scoped_buffer = WrapUnique(new ScopedShapedBuffer(
- shaped_buffer->on_host_shape(), shaped_buffer->on_device_shape(),
- allocator, shaped_buffer->device_ordinal()));
- scoped_buffer->buffers_ = shaped_buffer->buffers();
- shaped_buffer->clear();
-
- return std::move(scoped_buffer);
-}
-
ScopedShapedBuffer::ScopedShapedBuffer(const Shape& on_host_shape,
const Shape& on_device_shape,
DeviceMemoryAllocator* allocator,
@@ -126,7 +116,25 @@ ScopedShapedBuffer::ScopedShapedBuffer(ShapedBuffer shaped_buffer,
DeviceMemoryAllocator* allocator)
: ShapedBuffer(std::move(shaped_buffer)), allocator_(allocator) {}
+ScopedShapedBuffer::ScopedShapedBuffer(ScopedShapedBuffer&& s)
+ : ShapedBuffer(std::move(s)), allocator_(s.allocator_) {
+ // Null out s.allocator_ so it doesn't try to free anything in its destructor.
+ s.allocator_ = nullptr;
+}
+
+ScopedShapedBuffer& ScopedShapedBuffer::operator=(ScopedShapedBuffer&& s) {
+ *static_cast<ShapedBuffer*>(this) = std::move(static_cast<ShapedBuffer&>(s));
+ allocator_ = s.allocator_;
+ // Null out s.allocator_ so it doesn't try to free anything in its destructor.
+ s.allocator_ = nullptr;
+ return *this;
+}
+
ScopedShapedBuffer::~ScopedShapedBuffer() {
+ // allocator_ will be null if we were moved-from.
+ if (allocator_ == nullptr) {
+ return;
+ }
// Deallocate all non-null buffers. A buffer may appear in more than one spot
// in the shape (eg, a tuple with a repeated element) so keep track of what
// has been deallocated.
@@ -142,8 +150,8 @@ ScopedShapedBuffer::~ScopedShapedBuffer() {
}
}
-std::unique_ptr<ShapedBuffer> ScopedShapedBuffer::release() {
- auto shaped_buffer = MakeUnique<ShapedBuffer>(std::move(*this));
+ShapedBuffer ScopedShapedBuffer::release() {
+ ShapedBuffer shaped_buffer(std::move(*this));
buffers_ = ShapeTree<se::DeviceMemoryBase>();
return shaped_buffer;
}