diff options
author | innokentii <innokentii@yandex-team.com> | 2022-11-11 16:06:16 +0300 |
---|---|---|
committer | innokentii <innokentii@yandex-team.com> | 2022-11-11 16:06:16 +0300 |
commit | eb299967e503717d223751ed6a2f3c834429f60e (patch) | |
tree | 0b0396dcb7e8ba05351de1d63804d81982f36445 /library/cpp | |
parent | 34d7ddb0a460e57587d80c1a118b87cfdc5460ad (diff) | |
download | ydb-eb299967e503717d223751ed6a2f3c834429f60e.tar.gz |
Add Detach to TSharedData
add Detach to TSharedData
Diffstat (limited to 'library/cpp')
-rw-r--r-- | library/cpp/actors/util/contiguous_data.h | 2 | ||||
-rw-r--r-- | library/cpp/actors/util/shared_data.h | 14 | ||||
-rw-r--r-- | library/cpp/actors/util/shared_data_native_rope_backend_ut.cpp | 2 | ||||
-rw-r--r-- | library/cpp/actors/util/shared_data_rope_backend_ut.cpp | 2 | ||||
-rw-r--r-- | library/cpp/actors/util/shared_data_ut.cpp | 22 |
5 files changed, 36 insertions, 6 deletions
diff --git a/library/cpp/actors/util/contiguous_data.h b/library/cpp/actors/util/contiguous_data.h index c52ef4b7d8..382b19f82c 100644 --- a/library/cpp/actors/util/contiguous_data.h +++ b/library/cpp/actors/util/contiguous_data.h @@ -639,7 +639,7 @@ class TContiguousData { NActors::TSharedData GetRawTrimmed(size_t size) const { NActors::TSharedData result = GetRaw<NActors::TSharedData>(); - result.Trim(size); + result.TrimBack(size); return result; } diff --git a/library/cpp/actors/util/shared_data.h b/library/cpp/actors/util/shared_data.h index 6fdc9bf35f..8425738578 100644 --- a/library/cpp/actors/util/shared_data.h +++ b/library/cpp/actors/util/shared_data.h @@ -101,7 +101,7 @@ namespace NActors { * Underlying data is not reallocated * Returns trimmed amount in bytes */ - size_t Trim(size_t size) noexcept { + size_t TrimBack(size_t size) noexcept { size_t trimmed = 0; if (Size_ > size) { trimmed = Size_ - size; @@ -115,6 +115,18 @@ namespace NActors { } /** + * Copies data to new allocated buffer if data is shared + * New container loses original owner + * Returns pointer to mutable buffer + */ + char* Detach() { + if (IsShared()) { + *this = TSharedData::Copy(data(), size()); + } + return Data_; + } + + /** * Returns a view of underlying data starting with pos and up to len bytes */ TStringBuf Slice(size_t pos = 0, size_t len = -1) const noexcept { diff --git a/library/cpp/actors/util/shared_data_native_rope_backend_ut.cpp b/library/cpp/actors/util/shared_data_native_rope_backend_ut.cpp index 443fc149da..4939403454 100644 --- a/library/cpp/actors/util/shared_data_native_rope_backend_ut.cpp +++ b/library/cpp/actors/util/shared_data_native_rope_backend_ut.cpp @@ -221,7 +221,7 @@ namespace NActors { UNIT_ASSERT_EQUAL(dataCopy.data(), data.data()); rope.Insert(rope.End(), TRope(data)); rope.Insert(rope.End(), TRope(data)); - dataCopy.Trim(10); + dataCopy.TrimBack(10); UNIT_ASSERT_EQUAL(rope.GetSize(), data.size() * 3); } UNIT_ASSERT(data.IsPrivate()); diff --git a/library/cpp/actors/util/shared_data_rope_backend_ut.cpp b/library/cpp/actors/util/shared_data_rope_backend_ut.cpp index 3ffe14a544..b2b4e04634 100644 --- a/library/cpp/actors/util/shared_data_rope_backend_ut.cpp +++ b/library/cpp/actors/util/shared_data_rope_backend_ut.cpp @@ -221,7 +221,7 @@ namespace NActors { UNIT_ASSERT_EQUAL(dataCopy.data(), data.data()); rope.Insert(rope.End(), TRope(MakeIntrusive<TRopeSharedDataBackend>(data))); rope.Insert(rope.End(), TRope(MakeIntrusive<TRopeSharedDataBackend>(data))); - dataCopy.Trim(10); + dataCopy.TrimBack(10); UNIT_ASSERT_EQUAL(rope.GetSize(), data.size() * 3); } UNIT_ASSERT(data.IsPrivate()); diff --git a/library/cpp/actors/util/shared_data_ut.cpp b/library/cpp/actors/util/shared_data_ut.cpp index 8ed0df6866..0a510122b4 100644 --- a/library/cpp/actors/util/shared_data_ut.cpp +++ b/library/cpp/actors/util/shared_data_ut.cpp @@ -43,6 +43,12 @@ namespace NActors { UNIT_ASSERT_VALUES_EQUAL(TString(data.Slice(1, 3)), TString("ell")); UNIT_ASSERT_VALUES_EQUAL(TString(data.Slice(1, 100)), TString("ello")); UNIT_ASSERT_VALUES_EQUAL(TString(data.Slice(0, 4)), TString("Hell")); + + link = data; + UNIT_ASSERT(link.data() == data.data()); + UNIT_ASSERT_VALUES_UNEQUAL(link.Detach(), data.data()); + UNIT_ASSERT_EQUAL(data.size(), link.size()); + UNIT_ASSERT_VALUES_EQUAL(TString(data.Slice()), TString(link.Slice())); } Y_UNIT_TEST(TrimBehavior) { @@ -53,14 +59,14 @@ namespace NActors { // Trim to non-zero does not change addresses const char* ptr1 = data.data(); - data.Trim(31); + data.TrimBack(31); const char* ptr2 = data.data(); UNIT_ASSERT_VALUES_EQUAL(data.size(), 31u); UNIT_ASSERT(ptr1 == ptr2); // Trim to zero releases underlying data - data.Trim(0); + data.TrimBack(0); UNIT_ASSERT_VALUES_EQUAL(data.size(), 0u); UNIT_ASSERT(data.data() == nullptr); @@ -179,6 +185,18 @@ namespace NActors { UNIT_ASSERT(owner.NextDeallocated() == ptr); UNIT_ASSERT(owner.NextDeallocated() == nullptr); + + // Test Detach copies correctly and doesn't affect owned data + { + auto data = owner.Allocate(42); + auto disowned = data; + disowned.Detach(); + UNIT_ASSERT(owner.NextDeallocated() == nullptr); + } + + UNIT_ASSERT(owner.NextDeallocated() == ptr); + UNIT_ASSERT(owner.NextDeallocated() == nullptr); + } } |