Skip to content

Commit 1fec2b5

Browse files
authored
Respect SWIFT_STDLIB_SINGLE_THREADED_RUNTIME and use nonatomic refcounting in swift_retain, swift_release, etc. (#33644)
1 parent b07ecb9 commit 1fec2b5

File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed

stdlib/public/runtime/HeapObject.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,11 @@ static HeapObject *_swift_retain_(HeapObject *object) {
336336
}
337337

338338
HeapObject *swift::swift_retain(HeapObject *object) {
339+
#ifdef SWIFT_STDLIB_SINGLE_THREADED_RUNTIME
340+
return swift_nonatomic_retain(object);
341+
#else
339342
CALL_IMPL(swift_retain, (object));
343+
#endif
340344
}
341345

342346
SWIFT_RUNTIME_EXPORT
@@ -358,7 +362,11 @@ static HeapObject *_swift_retain_n_(HeapObject *object, uint32_t n) {
358362
}
359363

360364
HeapObject *swift::swift_retain_n(HeapObject *object, uint32_t n) {
365+
#ifdef SWIFT_STDLIB_SINGLE_THREADED_RUNTIME
366+
return swift_nonatomic_retain_n(object, n);
367+
#else
361368
CALL_IMPL(swift_retain_n, (object, n));
369+
#endif
362370
}
363371

364372
SWIFT_RUNTIME_EXPORT
@@ -379,7 +387,11 @@ static void _swift_release_(HeapObject *object) {
379387
}
380388

381389
void swift::swift_release(HeapObject *object) {
390+
#ifdef SWIFT_STDLIB_SINGLE_THREADED_RUNTIME
391+
swift_nonatomic_release(object);
392+
#else
382393
CALL_IMPL(swift_release, (object));
394+
#endif
383395
}
384396

385397
SWIFT_RUNTIME_EXPORT
@@ -399,7 +411,11 @@ static void _swift_release_n_(HeapObject *object, uint32_t n) {
399411
}
400412

401413
void swift::swift_release_n(HeapObject *object, uint32_t n) {
414+
#ifdef SWIFT_STDLIB_SINGLE_THREADED_RUNTIME
415+
swift_nonatomic_release_n(object, n);
416+
#else
402417
CALL_IMPL(swift_release_n, (object, n));
418+
#endif
403419
}
404420

405421
SWIFT_RUNTIME_EXPORT
@@ -427,15 +443,22 @@ size_t swift::swift_weakRetainCount(HeapObject *object) {
427443
}
428444

429445
HeapObject *swift::swift_unownedRetain(HeapObject *object) {
446+
#ifdef SWIFT_STDLIB_SINGLE_THREADED_RUNTIME
447+
return static_cast<HeapObject *>(swift_nonatomic_unownedRetain(object));
448+
#else
430449
SWIFT_RT_TRACK_INVOCATION(object, swift_unownedRetain);
431450
if (!isValidPointerForNativeRetain(object))
432451
return object;
433452

434453
object->refCounts.incrementUnowned(1);
435454
return object;
455+
#endif
436456
}
437457

438458
void swift::swift_unownedRelease(HeapObject *object) {
459+
#ifdef SWIFT_STDLIB_SINGLE_THREADED_RUNTIME
460+
swift_nonatomic_unownedRelease(object);
461+
#else
439462
SWIFT_RT_TRACK_INVOCATION(object, swift_unownedRelease);
440463
if (!isValidPointerForNativeRetain(object))
441464
return;
@@ -450,6 +473,7 @@ void swift::swift_unownedRelease(HeapObject *object) {
450473
swift_slowDealloc(object, classMetadata->getInstanceSize(),
451474
classMetadata->getInstanceAlignMask());
452475
}
476+
#endif
453477
}
454478

455479
void *swift::swift_nonatomic_unownedRetain(HeapObject *object) {
@@ -479,15 +503,22 @@ void swift::swift_nonatomic_unownedRelease(HeapObject *object) {
479503
}
480504

481505
HeapObject *swift::swift_unownedRetain_n(HeapObject *object, int n) {
506+
#ifdef SWIFT_STDLIB_SINGLE_THREADED_RUNTIME
507+
return swift_nonatomic_unownedRetain_n(object, n);
508+
#else
482509
SWIFT_RT_TRACK_INVOCATION(object, swift_unownedRetain_n);
483510
if (!isValidPointerForNativeRetain(object))
484511
return object;
485512

486513
object->refCounts.incrementUnowned(n);
487514
return object;
515+
#endif
488516
}
489517

490518
void swift::swift_unownedRelease_n(HeapObject *object, int n) {
519+
#ifdef SWIFT_STDLIB_SINGLE_THREADED_RUNTIME
520+
swift_nonatomic_unownedRelease_n(object, n);
521+
#else
491522
SWIFT_RT_TRACK_INVOCATION(object, swift_unownedRelease_n);
492523
if (!isValidPointerForNativeRetain(object))
493524
return;
@@ -501,6 +532,7 @@ void swift::swift_unownedRelease_n(HeapObject *object, int n) {
501532
swift_slowDealloc(object, classMetadata->getInstanceSize(),
502533
classMetadata->getInstanceAlignMask());
503534
}
535+
#endif
504536
}
505537

506538
HeapObject *swift::swift_nonatomic_unownedRetain_n(HeapObject *object, int n) {
@@ -533,8 +565,13 @@ static HeapObject *_swift_tryRetain_(HeapObject *object) {
533565
if (!isValidPointerForNativeRetain(object))
534566
return nullptr;
535567

568+
#ifdef SWIFT_STDLIB_SINGLE_THREADED_RUNTIME
569+
if (object->refCounts.tryIncrementNonAtomic()) return object;
570+
else return nullptr;
571+
#else
536572
if (object->refCounts.tryIncrement()) return object;
537573
else return nullptr;
574+
#endif
538575
}
539576

540577
HeapObject *swift::swift_tryRetain(HeapObject *object) {
@@ -557,6 +594,9 @@ void swift::swift_setDeallocating(HeapObject *object) {
557594
}
558595

559596
HeapObject *swift::swift_unownedRetainStrong(HeapObject *object) {
597+
#ifdef SWIFT_STDLIB_SINGLE_THREADED_RUNTIME
598+
return swift_nonatomic_unownedRetainStrong(object);
599+
#else
560600
SWIFT_RT_TRACK_INVOCATION(object, swift_unownedRetainStrong);
561601
if (!isValidPointerForNativeRetain(object))
562602
return object;
@@ -566,6 +606,7 @@ HeapObject *swift::swift_unownedRetainStrong(HeapObject *object) {
566606
if (! object->refCounts.tryIncrement())
567607
swift::swift_abortRetainUnowned(object);
568608
return object;
609+
#endif
569610
}
570611

571612
HeapObject *swift::swift_nonatomic_unownedRetainStrong(HeapObject *object) {
@@ -581,6 +622,9 @@ HeapObject *swift::swift_nonatomic_unownedRetainStrong(HeapObject *object) {
581622
}
582623

583624
void swift::swift_unownedRetainStrongAndRelease(HeapObject *object) {
625+
#ifdef SWIFT_STDLIB_SINGLE_THREADED_RUNTIME
626+
swift_nonatomic_unownedRetainStrongAndRelease(object);
627+
#else
584628
SWIFT_RT_TRACK_INVOCATION(object, swift_unownedRetainStrongAndRelease);
585629
if (!isValidPointerForNativeRetain(object))
586630
return;
@@ -594,6 +638,7 @@ void swift::swift_unownedRetainStrongAndRelease(HeapObject *object) {
594638
bool dealloc = object->refCounts.decrementUnownedShouldFree(1);
595639
assert(!dealloc && "retain-strong-and-release caused dealloc?");
596640
(void) dealloc;
641+
#endif
597642
}
598643

599644
void swift::swift_nonatomic_unownedRetainStrongAndRelease(HeapObject *object) {

0 commit comments

Comments
 (0)