Skip to content

Commit 4f68ccf

Browse files
committed
Add swift_nonatomic_unowned(Retain|Release)_n
1 parent ad0c27e commit 4f68ccf

File tree

3 files changed

+49
-0
lines changed

3 files changed

+49
-0
lines changed

include/swift/Runtime/HeapObject.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,16 @@ SWIFT_RT_ENTRY_VISIBILITY
530530
void swift_unownedRelease_n(HeapObject *value, int n)
531531
SWIFT_CC(RegisterPreservingCC);
532532

533+
/// Increment the weak/unowned retain count by n.
534+
SWIFT_RT_ENTRY_VISIBILITY
535+
void swift_nonatomic_unownedRetain_n(HeapObject *value, int n)
536+
SWIFT_CC(RegisterPreservingCC);
537+
538+
/// Decrement the weak/unowned retain count by n.
539+
SWIFT_RT_ENTRY_VISIBILITY
540+
void swift_nonatomic_unownedRelease_n(HeapObject *value, int n)
541+
SWIFT_CC(RegisterPreservingCC);
542+
533543
/// Increment the strong retain count of an object, aborting if it has
534544
/// been deallocated.
535545
SWIFT_RT_ENTRY_VISIBILITY

include/swift/Runtime/RuntimeFunctions.def

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,20 @@ FUNCTION(UnownedReleaseN, swift_unownedRelease_n,
397397
ARGS(RefCountedPtrTy, Int32Ty),
398398
ATTRS(NoUnwind))
399399

400+
// void swift_nonatomic_unownedRetain_n(void *ptr, int32_t n);
401+
FUNCTION(NonAtomicUnownedRetainN, swift_nonatomic_unownedRetain_n,
402+
RegisterPreservingCC,
403+
RETURNS(VoidTy),
404+
ARGS(RefCountedPtrTy, Int32Ty),
405+
ATTRS(NoUnwind))
406+
407+
// void swift_nonatomic_unownedRelease_n(void *ptr, int32_t n);
408+
FUNCTION(NonAtomicUnownedReleaseN, swift_nonatomic_unownedRelease_n,
409+
RegisterPreservingCC,
410+
RETURNS(VoidTy),
411+
ARGS(RefCountedPtrTy, Int32Ty),
412+
ATTRS(NoUnwind))
413+
400414
// void swift_unownedRetainStrong(void *ptr);
401415
FUNCTION(NativeStrongRetainUnowned, swift_unownedRetainStrong, RegisterPreservingCC,
402416
RETURNS(VoidTy),

stdlib/public/runtime/HeapObject.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,31 @@ void swift::swift_unownedRelease_n(HeapObject *object, int n)
394394
}
395395
}
396396

397+
void swift::swift_nonatomic_unownedRetain_n(HeapObject *object, int n)
398+
SWIFT_CC(RegisterPreservingCC_IMPL) {
399+
if (!object)
400+
return;
401+
402+
object->weakRefCount.incrementNonAtomic(n);
403+
}
404+
405+
void swift::swift_nonatomic_unownedRelease_n(HeapObject *object, int n)
406+
SWIFT_CC(RegisterPreservingCC_IMPL) {
407+
if (!object)
408+
return;
409+
410+
if (object->weakRefCount.decrementShouldDeallocateNNonAtomic(n)) {
411+
// Only class objects can be weak-retained and weak-released.
412+
auto metadata = object->metadata;
413+
assert(metadata->isClassObject());
414+
auto classMetadata = static_cast<const ClassMetadata*>(metadata);
415+
assert(classMetadata->isTypeMetadata());
416+
SWIFT_RT_ENTRY_CALL(swift_slowDealloc)
417+
(object, classMetadata->getInstanceSize(),
418+
classMetadata->getInstanceAlignMask());
419+
}
420+
}
421+
397422
HeapObject *swift::swift_tryPin(HeapObject *object)
398423
SWIFT_CC(RegisterPreservingCC_IMPL) {
399424
assert(isValidPointerForNativeRetain(object));

0 commit comments

Comments
 (0)