File tree 4 files changed +20
-10
lines changed
4 files changed +20
-10
lines changed Original file line number Diff line number Diff line change @@ -23,8 +23,7 @@ namespace NActors {
23
23
NActors::NMemory::TLabel<MemoryLabelSharedData>::Add (allocSize);
24
24
25
25
auto * header = reinterpret_cast <THeader*>(raw + PrivateHeaderSize);
26
- header->RefCount = 1 ;
27
- header->Owner = nullptr ;
26
+ new (header) THeader (nullptr );
28
27
29
28
data = raw + OverheadSize;
30
29
NSan::Poison (data, size);
@@ -41,6 +40,7 @@ namespace NActors {
41
40
42
41
auto * header = reinterpret_cast <THeader*>(raw + PrivateHeaderSize);
43
42
Y_DEBUG_ABORT_UNLESS (header->Owner == nullptr );
43
+ header->~THeader ();
44
44
45
45
y_deallocate (raw);
46
46
}
Original file line number Diff line number Diff line change 6
6
#include < util/system/compiler.h>
7
7
#include < util/generic/array_ref.h>
8
8
9
+ #include < atomic>
10
+
9
11
namespace NActors {
10
12
11
13
class TSharedData {
@@ -25,8 +27,13 @@ namespace NActors {
25
27
static_assert (sizeof (TPrivateHeader) == 16 , " TPrivateHeader has an unexpected size" );
26
28
27
29
struct THeader {
28
- TAtomic RefCount;
30
+ std::atomic< size_t > RefCount;
29
31
IOwner* Owner;
32
+
33
+ explicit THeader (IOwner* owner)
34
+ : RefCount{ 1 }
35
+ , Owner(owner)
36
+ {}
30
37
};
31
38
32
39
static_assert (sizeof (THeader) == 16 , " THeader has an unexpected size" );
@@ -193,19 +200,19 @@ namespace NActors {
193
200
}
194
201
195
202
static bool IsPrivate (THeader* header) noexcept {
196
- return 1 == AtomicGet ( header->RefCount );
203
+ return 1 == header->RefCount . load (std::memory_order_relaxed );
197
204
}
198
205
199
206
void AddRef () noexcept {
200
207
if (Data_) {
201
- AtomicIncrement ( Header ()->RefCount );
208
+ Header ()->RefCount . fetch_add ( 1 , std::memory_order_relaxed );
202
209
}
203
210
}
204
211
205
212
void Release () noexcept {
206
213
if (Data_) {
207
214
auto * header = Header ();
208
- if (IsPrivate (header) || 0 == AtomicDecrement ( header->RefCount )) {
215
+ if (1 == header->RefCount . fetch_sub ( 1 , std::memory_order_acq_rel )) {
209
216
if (auto * owner = header->Owner ) {
210
217
owner->Deallocate (Data_);
211
218
} else {
Original file line number Diff line number Diff line change @@ -30,8 +30,7 @@ class TBackTracingOwner : public NActors::TSharedData::IOwner {
30
30
TSelf* btOwner = new TSelf;
31
31
btOwner->BackTrace .Capture ();
32
32
btOwner->Info = info;
33
- header->RefCount = 1 ;
34
- header->Owner = btOwner;
33
+ new (header) THeader (btOwner);
35
34
char * data = raw + OverheadSize;
36
35
return data;
37
36
}
@@ -59,6 +58,8 @@ class TBackTracingOwner : public NActors::TSharedData::IOwner {
59
58
60
59
void Deallocate (char * data) noexcept override {
61
60
if (!RealOwner) {
61
+ THeader* header = reinterpret_cast <THeader*>(data - sizeof (THeader));
62
+ header->~THeader ();
62
63
char * raw = data - OverheadSize;
63
64
y_deallocate (raw);
64
65
} else {
Original file line number Diff line number Diff line change @@ -80,8 +80,7 @@ namespace NActors {
80
80
TSharedData Allocate (size_t size) {
81
81
char * raw = reinterpret_cast <char *>(y_allocate (sizeof (THeader) + size));
82
82
THeader* header = reinterpret_cast <THeader*>(raw);
83
- header->RefCount = 1 ;
84
- header->Owner = this ;
83
+ new (header) THeader (this );
85
84
char * data = raw + sizeof (THeader);
86
85
Y_ABORT_UNLESS (Allocated_.insert (data).second );
87
86
return TSharedData::AttachUnsafe (data, size);
@@ -90,6 +89,8 @@ namespace NActors {
90
89
void Deallocate (char * data) noexcept {
91
90
Y_ABORT_UNLESS (Allocated_.erase (data) > 0 );
92
91
char * raw = data - sizeof (THeader);
92
+ THeader* header = reinterpret_cast <THeader*>(raw);
93
+ header->~THeader ();
93
94
y_deallocate (raw);
94
95
Deallocated_.push_back (data);
95
96
}
@@ -190,6 +191,7 @@ namespace NActors {
190
191
// Test Detach copies correctly and doesn't affect owned data
191
192
{
192
193
auto data = owner.Allocate (42 );
194
+ ptr = data.data ();
193
195
auto disowned = data;
194
196
disowned.Detach ();
195
197
UNIT_ASSERT (owner.NextDeallocated () == nullptr );
You can’t perform that action at this time.
0 commit comments