Skip to content

Commit ae0e855

Browse files
committed
Revert "Runtime: Remove retainCount entry points."
This reverts commit 51e0594. The retainCount entry points are used by Instruments.
1 parent fc83c88 commit ae0e855

File tree

6 files changed

+51
-2
lines changed

6 files changed

+51
-2
lines changed

docs/Runtime.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,14 @@ Rename with a non-`stdlib` naming scheme.
8989

9090
## Reference counting
9191

92+
### swift\_retainCount
93+
94+
```
95+
@convention(c) (@unowned NativeObject) -> UInt
96+
```
97+
98+
Returns a random number. Only used by allocation profiling tools.
99+
92100
### TODO
93101

94102
```

include/swift/Runtime/HeapObject.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,12 @@ extern "C" void swift_release(HeapObject *object);
220220
SWIFT_RUNTIME_EXPORT
221221
extern "C" void swift_release_n(HeapObject *object, uint32_t n);
222222

223+
// Refcounting observation hooks for memory tools. Don't use these.
224+
SWIFT_RUNTIME_EXPORT
225+
extern "C" size_t swift_retainCount(HeapObject *object);
226+
SWIFT_RUNTIME_EXPORT
227+
extern "C" size_t swift_unownedRetainCount(HeapObject *object);
228+
223229
/// Is this pointer a non-null unique reference to an object
224230
/// that uses Swift reference counting?
225231
SWIFT_RUNTIME_EXPORT

stdlib/public/runtime/HeapObject.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,14 @@ static void _swift_release_n_(HeapObject *object, uint32_t n) {
302302
}
303303
auto swift::_swift_release_n = _swift_release_n_;
304304

305+
size_t swift::swift_retainCount(HeapObject *object) {
306+
return object->refCount.getCount();
307+
}
308+
309+
size_t swift::swift_unownedRetainCount(HeapObject *object) {
310+
return object->weakRefCount.getCount();
311+
}
312+
305313
void swift::swift_unownedRetain(HeapObject *object) {
306314
if (!object) return;
307315

stdlib/public/runtime/SwiftObject.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ - (id)autorelease {
258258
return _objc_rootAutorelease(self);
259259
}
260260
- (NSUInteger)retainCount {
261-
return reinterpret_cast<HeapObject *>(self)->refCount.getCount();
261+
return swift::swift_retainCount(reinterpret_cast<HeapObject *>(self));
262262
}
263263
- (BOOL)_isDeallocating {
264264
return swift_isDeallocating(reinterpret_cast<HeapObject *>(self));

unittests/runtime/Refcounting.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,16 @@ TEST(RefcountingTest, retain_release_n) {
122122
swift_release_n(object, 1);
123123
EXPECT_EQ(0u, value);
124124
EXPECT_EQ(1u, _retainCount(object));
125+
EXPECT_EQ(34u, swift_retainCount(object));
126+
swift_release_n(object, 31);
127+
EXPECT_EQ(0u, value);
128+
EXPECT_EQ(3u, swift_retainCount(object));
129+
swift_release(object);
130+
EXPECT_EQ(0u, value);
131+
EXPECT_EQ(2u, swift_retainCount(object));
132+
swift_release_n(object, 1);
133+
EXPECT_EQ(0u, value);
134+
EXPECT_EQ(1u, swift_retainCount(object));
125135
swift_release(object);
126136
EXPECT_EQ(1u, value);
127137
}
@@ -143,6 +153,16 @@ TEST(RefcountingTest, unknown_retain_release_n) {
143153
swift_unknownRelease_n(object, 1);
144154
EXPECT_EQ(0u, value);
145155
EXPECT_EQ(1u, _retainCount(object));
156+
EXPECT_EQ(34u, swift_retainCount(object));
157+
swift_unknownRelease_n(object, 31);
158+
EXPECT_EQ(0u, value);
159+
EXPECT_EQ(3u, swift_retainCount(object));
160+
swift_unknownRelease(object);
161+
EXPECT_EQ(0u, value);
162+
EXPECT_EQ(2u, swift_retainCount(object));
163+
swift_unknownRelease_n(object, 1);
164+
EXPECT_EQ(0u, value);
165+
EXPECT_EQ(1u, swift_retainCount(object));
146166
swift_unknownRelease(object);
147167
EXPECT_EQ(1u, value);
148168
}
@@ -160,6 +180,13 @@ TEST(RefcountingTest, unowned_retain_release_n) {
160180
EXPECT_EQ(2u, _unownedRetainCount(object));
161181
swift_unownedRelease_n(object, 1);
162182
EXPECT_EQ(1u, _unownedRetainCount(object));
183+
EXPECT_EQ(34u, swift_unownedRetainCount(object));
184+
swift_unownedRelease_n(object, 31);
185+
EXPECT_EQ(3u, swift_unownedRetainCount(object));
186+
swift_unownedRelease(object);
187+
EXPECT_EQ(2u, swift_unownedRetainCount(object));
188+
swift_unownedRelease_n(object, 1);
189+
EXPECT_EQ(1u, swift_unownedRetainCount(object));
163190
swift_release(object);
164191
EXPECT_EQ(1u, value);
165192
}

unittests/runtime/weak.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ - (void) dealloc {
4040
extern "C" HeapObject *make_swift_object();
4141

4242
static unsigned getUnownedRetainCount(HeapObject *object) {
43-
return object->weakRefCount.getCount() - 1;
43+
return swift_unownedRetainCount(object) - 1;
4444
}
4545

4646
static void unknown_release(void *value) {

0 commit comments

Comments
 (0)