Repository: arrow Updated Branches: refs/heads/master 8d917c1f9 -> 543e50814
ARROW-469: C++: Add option so that resize doesn't decrease the capacity Author: Uwe L. Korn <[email protected]> Closes #277 from xhochy/ARROW-469 and squashes the following commits: f59059f [Uwe L. Korn] ARROW-469: C++: Add option so that resize doesn't decrease the capacity Project: http://git-wip-us.apache.org/repos/asf/arrow/repo Commit: http://git-wip-us.apache.org/repos/asf/arrow/commit/543e5081 Tree: http://git-wip-us.apache.org/repos/asf/arrow/tree/543e5081 Diff: http://git-wip-us.apache.org/repos/asf/arrow/diff/543e5081 Branch: refs/heads/master Commit: 543e50814c15d58387683a43b5abc661c4acc484 Parents: 8d917c1 Author: Uwe L. Korn <[email protected]> Authored: Tue Jan 10 13:27:34 2017 -0500 Committer: Wes McKinney <[email protected]> Committed: Tue Jan 10 13:27:34 2017 -0500 ---------------------------------------------------------------------- cpp/src/arrow/buffer-test.cc | 11 ++++++++++- cpp/src/arrow/buffer.cc | 11 ++++++----- cpp/src/arrow/buffer.h | 13 ++++++++----- 3 files changed, 24 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/arrow/blob/543e5081/cpp/src/arrow/buffer-test.cc ---------------------------------------------------------------------- diff --git a/cpp/src/arrow/buffer-test.cc b/cpp/src/arrow/buffer-test.cc index c1d027b..2ded1e1 100644 --- a/cpp/src/arrow/buffer-test.cc +++ b/cpp/src/arrow/buffer-test.cc @@ -53,8 +53,17 @@ TEST_F(TestBuffer, Resize) { ASSERT_EQ(200, buf.size()); // Make it smaller, too - ASSERT_OK(buf.Resize(50)); + ASSERT_OK(buf.Resize(50, true)); ASSERT_EQ(50, buf.size()); + // We have actually shrunken in size + // The spec requires that capacity is a multiple of 64 + ASSERT_EQ(64, buf.capacity()); + + // Resize to a larger capacity again to test shrink_to_fit = false + ASSERT_OK(buf.Resize(100)); + ASSERT_EQ(128, buf.capacity()); + ASSERT_OK(buf.Resize(50, false)); + ASSERT_EQ(128, buf.capacity()); } TEST_F(TestBuffer, ResizeOOM) { http://git-wip-us.apache.org/repos/asf/arrow/blob/543e5081/cpp/src/arrow/buffer.cc ---------------------------------------------------------------------- diff --git a/cpp/src/arrow/buffer.cc b/cpp/src/arrow/buffer.cc index 2e64ffd..6cce0ef 100644 --- a/cpp/src/arrow/buffer.cc +++ b/cpp/src/arrow/buffer.cc @@ -91,13 +91,14 @@ Status PoolBuffer::Reserve(int64_t new_capacity) { return Status::OK(); } -Status PoolBuffer::Resize(int64_t new_size) { - if (new_size > size_) { +Status PoolBuffer::Resize(int64_t new_size, bool shrink_to_fit) { + if (!shrink_to_fit || (new_size > size_)) { RETURN_NOT_OK(Reserve(new_size)); } else { // Buffer is not growing, so shrink to the requested size without // excess space. - if (capacity_ != new_size) { + int64_t new_capacity = BitUtil::RoundUpToMultipleOf64(new_size); + if (capacity_ != new_capacity) { // Buffer hasn't got yet the requested size. if (new_size == 0) { pool_->Free(mutable_data_, capacity_); @@ -105,9 +106,9 @@ Status PoolBuffer::Resize(int64_t new_size) { mutable_data_ = nullptr; data_ = nullptr; } else { - RETURN_NOT_OK(pool_->Reallocate(capacity_, new_size, &mutable_data_)); + RETURN_NOT_OK(pool_->Reallocate(capacity_, new_capacity, &mutable_data_)); data_ = mutable_data_; - capacity_ = new_size; + capacity_ = new_capacity; } } } http://git-wip-us.apache.org/repos/asf/arrow/blob/543e5081/cpp/src/arrow/buffer.h ---------------------------------------------------------------------- diff --git a/cpp/src/arrow/buffer.h b/cpp/src/arrow/buffer.h index 27437ca..ac78808 100644 --- a/cpp/src/arrow/buffer.h +++ b/cpp/src/arrow/buffer.h @@ -127,10 +127,13 @@ class ARROW_EXPORT MutableBuffer : public Buffer { class ARROW_EXPORT ResizableBuffer : public MutableBuffer { public: - // Change buffer reported size to indicated size, allocating memory if - // necessary. This will ensure that the capacity of the buffer is a multiple - // of 64 bytes as defined in Layout.md. - virtual Status Resize(int64_t new_size) = 0; + /// Change buffer reported size to indicated size, allocating memory if + /// necessary. This will ensure that the capacity of the buffer is a multiple + /// of 64 bytes as defined in Layout.md. + /// + /// @param shrink_to_fit On deactivating this option, the capacity of the Buffer won't + /// decrease. + virtual Status Resize(int64_t new_size, bool shrink_to_fit = true) = 0; // Ensure that buffer has enough memory allocated to fit the indicated // capacity (and meets the 64 byte padding requirement in Layout.md). @@ -147,7 +150,7 @@ class ARROW_EXPORT PoolBuffer : public ResizableBuffer { explicit PoolBuffer(MemoryPool* pool = nullptr); virtual ~PoolBuffer(); - Status Resize(int64_t new_size) override; + Status Resize(int64_t new_size, bool shrink_to_fit = true) override; Status Reserve(int64_t new_capacity) override; private:
