Skip to content

Commit fa0d270

Browse files
committed
Merge pull request #1909 from swiftix/wip-non-atomic-apis
Provide non-atomic versions of many reference counting operations.
2 parents d8d9dc4 + 5d22a59 commit fa0d270

File tree

7 files changed

+631
-1
lines changed

7 files changed

+631
-1
lines changed

include/swift/Runtime/HeapObject.h

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,12 +212,37 @@ extern "C"
212212
void (*SWIFT_CC(RegisterPreservingCC) _swift_retain_n)(HeapObject *object,
213213
uint32_t n);
214214

215+
SWIFT_RT_ENTRY_VISIBILITY
216+
extern "C"
217+
void swift_nonatomic_retain(HeapObject *object)
218+
SWIFT_CC(RegisterPreservingCC);
219+
220+
SWIFT_RUNTIME_EXPORT
221+
extern "C"
222+
void (*SWIFT_CC(RegisterPreservingCC) _swift_nonatomic_retain)(HeapObject *object);
223+
224+
SWIFT_RT_ENTRY_VISIBILITY
225+
extern "C"
226+
void swift_nonatomic_retain_n(HeapObject *object, uint32_t n)
227+
SWIFT_CC(RegisterPreservingCC);
228+
229+
SWIFT_RUNTIME_EXPORT
230+
extern "C"
231+
void (*SWIFT_CC(RegisterPreservingCC) _swift_nonatomic_retain_n)(HeapObject *object,
232+
uint32_t n);
233+
215234
static inline void _swift_retain_inlined(HeapObject *object) {
216235
if (object) {
217236
object->refCount.increment();
218237
}
219238
}
220239

240+
static inline void _swift_nonatomic_retain_inlined(HeapObject *object) {
241+
if (object) {
242+
object->refCount.incrementNonAtomic();
243+
}
244+
}
245+
221246
/// Atomically increments the reference count of an object, unless it has
222247
/// already been destroyed. Returns nil if the object is dead.
223248
SWIFT_RT_ENTRY_VISIBILITY
@@ -249,6 +274,10 @@ SWIFT_RT_ENTRY_VISIBILITY
249274
extern "C" HeapObject *swift_tryPin(HeapObject *object)
250275
SWIFT_CC(RegisterPreservingCC);
251276

277+
SWIFT_RT_ENTRY_VISIBILITY
278+
extern "C" HeapObject *swift_nonatomic_tryPin(HeapObject *object)
279+
SWIFT_CC(RegisterPreservingCC);
280+
252281
/// Given that an object is pinned, atomically unpin it and decrement
253282
/// the reference count.
254283
///
@@ -257,6 +286,10 @@ SWIFT_RT_ENTRY_VISIBILITY
257286
extern "C" void swift_unpin(HeapObject *object)
258287
SWIFT_CC(RegisterPreservingCC);
259288

289+
SWIFT_RT_ENTRY_VISIBILITY
290+
extern "C" void swift_nonatomic_unpin(HeapObject *object)
291+
SWIFT_CC(RegisterPreservingCC);
292+
260293
/// Atomically decrements the retain count of an object. If the
261294
/// retain count reaches zero, the object is destroyed as follows:
262295
///
@@ -281,6 +314,15 @@ SWIFT_RUNTIME_EXPORT
281314
extern "C" void (*SWIFT_CC(RegisterPreservingCC)
282315
_swift_release)(HeapObject *object);
283316

317+
SWIFT_RT_ENTRY_VISIBILITY
318+
extern "C" void swift_nonatomic_release(HeapObject *object)
319+
SWIFT_CC(RegisterPreservingCC);
320+
321+
SWIFT_RUNTIME_EXPORT
322+
extern "C" void (*SWIFT_CC(RegisterPreservingCC)
323+
_swift_nonatomic_release)(HeapObject *object);
324+
325+
284326
/// Atomically decrements the retain count of an object n times. If the retain
285327
/// count reaches zero, the object is destroyed
286328
SWIFT_RT_ENTRY_VISIBILITY
@@ -298,6 +340,15 @@ extern "C" void (*SWIFT_CC(RegisterPreservingCC)
298340
SWIFT_RUNTIME_EXPORT
299341
extern "C" void swift_setDeallocating(HeapObject *object);
300342

343+
SWIFT_RT_ENTRY_VISIBILITY
344+
extern "C"
345+
void swift_nonatomic_release_n(HeapObject *object, uint32_t n)
346+
SWIFT_CC(RegisterPreservingCC);
347+
348+
SWIFT_RUNTIME_EXPORT
349+
extern "C" void (*SWIFT_CC(RegisterPreservingCC)
350+
_swift_nonatomic_release_n)(HeapObject *object, uint32_t n);
351+
301352
// Refcounting observation hooks for memory tools. Don't use these.
302353
SWIFT_RUNTIME_EXPORT
303354
extern "C" size_t swift_retainCount(HeapObject *object);
@@ -663,6 +714,15 @@ SWIFT_RUNTIME_EXPORT
663714
extern "C" void *swift_bridgeObjectRetain_n(void *value, int n)
664715
SWIFT_CC(DefaultCC);
665716

717+
SWIFT_RUNTIME_EXPORT
718+
extern "C" void *swift_nonatomic_bridgeObjectRetain(void *value)
719+
SWIFT_CC(DefaultCC);
720+
721+
/// Increment the strong retain count of a bridged object by n.
722+
SWIFT_RUNTIME_EXPORT
723+
extern "C" void *swift_nonatomic_bridgeObjectRetain_n(void *value, int n)
724+
SWIFT_CC(DefaultCC);
725+
666726
/*****************************************************************************/
667727
/************************ UNKNOWN REFERENCE-COUNTING *************************/
668728
/*****************************************************************************/
@@ -680,6 +740,18 @@ SWIFT_RUNTIME_EXPORT
680740
extern "C" void swift_unknownRetain_n(void *value, int n)
681741
SWIFT_CC(DefaultCC);
682742

743+
/// Increment the strong retain count of an object which might not be a native
744+
/// Swift object.
745+
SWIFT_RUNTIME_EXPORT
746+
extern "C" void swift_nonatomic_unknownRetain(void *value)
747+
SWIFT_CC(DefaultCC);
748+
/// Increment the strong retain count of an object which might not be a native
749+
/// Swift object by n.
750+
SWIFT_RUNTIME_EXPORT
751+
extern "C" void swift_nonatomic_unknownRetain_n(void *value, int n)
752+
SWIFT_CC(DefaultCC);
753+
754+
683755
#else
684756

685757
static inline void swift_unknownRetain(void *value)
@@ -692,6 +764,17 @@ static inline void swift_unknownRetain_n(void *value, int n)
692764
swift_retain_n(static_cast<HeapObject *>(value), n);
693765
}
694766

767+
static inline void swift_nonatomic_unknownRetain(void *value)
768+
SWIFT_CC(DefaultCC) {
769+
swift_nonatomic_retain(static_cast<HeapObject *>(value));
770+
}
771+
772+
static inline void swift_nonatomic_unknownRetain_n(void *value, int n)
773+
SWIFT_CC(DefaultCC) {
774+
swift_nonatomic_retain_n(static_cast<HeapObject *>(value), n);
775+
}
776+
777+
695778
#endif /* SWIFT_OBJC_INTEROP */
696779

697780
SWIFT_RUNTIME_EXPORT
@@ -702,6 +785,14 @@ SWIFT_RUNTIME_EXPORT
702785
extern "C" void swift_bridgeObjectRelease_n(void *value, int n)
703786
SWIFT_CC(DefaultCC);
704787

788+
SWIFT_RUNTIME_EXPORT
789+
extern "C" void swift_nonatomic_bridgeObjectRelease(void *value)
790+
SWIFT_CC(DefaultCC);
791+
/// Decrement the strong retain count of a bridged object by n.
792+
SWIFT_RUNTIME_EXPORT
793+
extern "C" void swift_nonatomic_bridgeObjectRelease_n(void *value, int n)
794+
SWIFT_CC(DefaultCC);
795+
705796
#if SWIFT_OBJC_INTEROP
706797

707798
/// Decrement the strong retain count of an object which might not be a native
@@ -715,6 +806,17 @@ SWIFT_RUNTIME_EXPORT
715806
extern "C" void swift_unknownRelease_n(void *value, int n)
716807
SWIFT_CC(DefaultCC);
717808

809+
/// Decrement the strong retain count of an object which might not be a native
810+
/// Swift object.
811+
SWIFT_RUNTIME_EXPORT
812+
extern "C" void swift_nonatomic_unknownRelease(void *value)
813+
SWIFT_CC(DefaultCC);
814+
/// Decrement the strong retain count of an object which might not be a native
815+
/// Swift object by n.
816+
SWIFT_RUNTIME_EXPORT
817+
extern "C" void swift_nonatomic_unknownRelease_n(void *value, int n)
818+
SWIFT_CC(DefaultCC);
819+
718820
#else
719821

720822
static inline void swift_unknownRelease(void *value)
@@ -727,6 +829,16 @@ static inline void swift_unknownRelease_n(void *value, int n)
727829
swift_release_n(static_cast<HeapObject *>(value), n);
728830
}
729831

832+
static inline void swift_nonatomic_unknownRelease(void *value)
833+
SWIFT_CC(RegisterPreservingCC) {
834+
swift_nonatomic_release(static_cast<HeapObject *>(value));
835+
}
836+
837+
static inline void swift_nonatomic_unknownRelease_n(void *value, int n)
838+
SWIFT_CC(RegisterPreservingCC) {
839+
swift_nonatomic_release_n(static_cast<HeapObject *>(value), n);
840+
}
841+
730842
#endif /* SWIFT_OBJC_INTEROP */
731843

732844
/*****************************************************************************/

include/swift/Runtime/InstrumentsSupport.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,17 @@ extern "C" void (*_swift_retain)(HeapObject *object);
3333
SWIFT_RUNTIME_EXPORT
3434
extern "C" void (*_swift_retain_n)(HeapObject *object, uint32_t n);
3535
SWIFT_RUNTIME_EXPORT
36+
extern "C" void (*_swift_nonatomic_retain)(HeapObject *object);
37+
SWIFT_RUNTIME_EXPORT
3638
extern "C" HeapObject *(*_swift_tryRetain)(HeapObject *object);
3739
SWIFT_RUNTIME_EXPORT
3840
extern "C" bool (*_swift_isDeallocating)(HeapObject *object);
3941
SWIFT_RUNTIME_EXPORT
4042
extern "C" void (*_swift_release)(HeapObject *object);
4143
SWIFT_RUNTIME_EXPORT
4244
extern "C" void (*_swift_release_n)(HeapObject *object, uint32_t n);
45+
SWIFT_RUNTIME_EXPORT
46+
extern "C" void (*_swift_nonatomic_release)(HeapObject *object);
4347

4448
// liboainject on iOS 8 patches the function pointers below if present.
4549
// Do not reuse these names unless you do what oainject expects you to do.

include/swift/Runtime/RuntimeFunctions.def

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,20 @@ FUNCTION(NativeSetDeallocating, swift_setDeallocating,
174174
ARGS(RefCountedPtrTy),
175175
ATTRS(NoUnwind))
176176

177+
// void swift_nonatomic_retain_n(void *ptr, int32_t n);
178+
FUNCTION_WITH_GLOBAL_SYMBOL_AND_IMPL(NativeNonAtomicStrongRetainN, swift_nonatomic_retain_n,
179+
_swift_nonatomic_retain_n, _swift_nonatomic_retain_n_, RegisterPreservingCC,
180+
RETURNS(VoidTy),
181+
ARGS(RefCountedPtrTy, Int32Ty),
182+
ATTRS(NoUnwind))
183+
184+
// void swift_nonatomic_release_n(void *ptr, int32_t n);
185+
FUNCTION_WITH_GLOBAL_SYMBOL_AND_IMPL(NativeNonAtomicStrongReleaseN, swift_nonatomic_release_n,
186+
_swift_nonatomic_release_n, _swift_nonatomic_release_n_, RegisterPreservingCC,
187+
RETURNS(VoidTy),
188+
ARGS(RefCountedPtrTy, Int32Ty),
189+
ATTRS(NoUnwind))
190+
177191
// void swift_unknownRetain_n(void *ptr, int32_t n);
178192
FUNCTION(UnknownRetainN, swift_unknownRetain_n,
179193
DefaultCC,
@@ -188,6 +202,20 @@ FUNCTION(UnknownReleaseN, swift_unknownRelease_n,
188202
ARGS(RefCountedPtrTy, Int32Ty),
189203
ATTRS(NoUnwind))
190204

205+
// void swift_nonatomic_unknownRetain_n(void *ptr, int32_t n);
206+
FUNCTION(NonAtomicUnknownRetainN, swift_nonatomic_unknownRetain_n,
207+
DefaultCC,
208+
RETURNS(VoidTy),
209+
ARGS(RefCountedPtrTy, Int32Ty),
210+
ATTRS(NoUnwind))
211+
212+
// void swift_nonatomic_unknownRelease_n(void *ptr, int32_t n);
213+
FUNCTION(NonAtomicUnknownReleaseN, swift_nonatomic_unknownRelease_n,
214+
DefaultCC,
215+
RETURNS(VoidTy),
216+
ARGS(RefCountedPtrTy, Int32Ty),
217+
ATTRS(NoUnwind))
218+
191219
// void swift_bridgeObjectRetain_n(void *ptr, int32_t n);
192220
FUNCTION(BridgeObjectRetainN, swift_bridgeObjectRetain_n,
193221
DefaultCC,
@@ -202,12 +230,40 @@ FUNCTION(BridgeObjectReleaseN, swift_bridgeObjectRelease_n,
202230
ARGS(BridgeObjectPtrTy, Int32Ty),
203231
ATTRS(NoUnwind))
204232

233+
// void swift_nonatomic_bridgeObjectRetain_n(void *ptr, int32_t n);
234+
FUNCTION(NonAtomicBridgeObjectRetainN, swift_nonatomic_bridgeObjectRetain_n,
235+
DefaultCC,
236+
RETURNS(BridgeObjectPtrTy),
237+
ARGS(BridgeObjectPtrTy, Int32Ty),
238+
ATTRS(NoUnwind))
239+
240+
// void swift_nonatomic_bridgeObjectRelease_n(void *ptr, int32_t n);
241+
FUNCTION(NonAtomicBridgeObjectReleaseN, swift_nonatomic_bridgeObjectRelease_n,
242+
DefaultCC,
243+
RETURNS(VoidTy),
244+
ARGS(BridgeObjectPtrTy, Int32Ty),
245+
ATTRS(NoUnwind))
246+
247+
// void swift_nonatomic_retain(void *ptr);
248+
FUNCTION_WITH_GLOBAL_SYMBOL_AND_IMPL(NativeNonAtomicStrongRetain, swift_nonatomic_retain,
249+
_swift_nonatomic_retain, _swift_nonatomic_retain_, RegisterPreservingCC,
250+
RETURNS(VoidTy),
251+
ARGS(RefCountedPtrTy),
252+
ATTRS(NoUnwind))
253+
205254
// void *swift_tryPin(void *ptr);
206255
FUNCTION(NativeTryPin, swift_tryPin, RegisterPreservingCC,
207256
RETURNS(RefCountedPtrTy),
208257
ARGS(RefCountedPtrTy),
209258
ATTRS(NoUnwind))
210259

260+
// void swift_nonatomic_release(void *ptr);
261+
FUNCTION_WITH_GLOBAL_SYMBOL_AND_IMPL(NativeNonAtomicStrongRelease, swift_nonatomic_release,
262+
_swift_nonatomic_release, _swift_nonatomic_release_, RegisterPreservingCC,
263+
RETURNS(VoidTy),
264+
ARGS(RefCountedPtrTy),
265+
ATTRS(NoUnwind))
266+
211267
// void *swift_tryRetain(void *ptr);
212268
FUNCTION_WITH_GLOBAL_SYMBOL_AND_IMPL(NativeTryRetain, swift_tryRetain,
213269
_swift_tryRetain, _swift_tryRetain_, RegisterPreservingCC,
@@ -228,6 +284,18 @@ FUNCTION_WITH_GLOBAL_SYMBOL_AND_IMPL(IsDeallocating, swift_isDeallocating,
228284
ARGS(RefCountedPtrTy),
229285
ATTRS(NoUnwind, ZExt))
230286

287+
// void *swift_nonatomic_tryPin(void *ptr);
288+
FUNCTION(NonAtomicNativeTryPin, swift_nonatomic_tryPin, RegisterPreservingCC,
289+
RETURNS(RefCountedPtrTy),
290+
ARGS(RefCountedPtrTy),
291+
ATTRS(NoUnwind))
292+
293+
// void swift_nonatomic_unpin(void *ptr);
294+
FUNCTION(NonAtomicNativeUnpin, swift_nonatomic_unpin, RegisterPreservingCC,
295+
RETURNS(VoidTy),
296+
ARGS(RefCountedPtrTy),
297+
ATTRS(NoUnwind))
298+
231299
// void swift_unknownRetain(void *ptr);
232300
FUNCTION(UnknownRetain, swift_unknownRetain, DefaultCC,
233301
RETURNS(VoidTy),
@@ -240,6 +308,18 @@ FUNCTION(UnknownRelease, swift_unknownRelease, DefaultCC,
240308
ARGS(UnknownRefCountedPtrTy),
241309
ATTRS(NoUnwind))
242310

311+
// void swift_nonatomic_unknownRetain(void *ptr);
312+
FUNCTION(NonAtomicUnknownRetain, swift_nonatomic_unknownRetain, DefaultCC,
313+
RETURNS(VoidTy),
314+
ARGS(UnknownRefCountedPtrTy),
315+
ATTRS(NoUnwind))
316+
317+
// void swift_unknownRelease(void *ptr);
318+
FUNCTION(NonAtomicUnknownRelease, swift_nonatomic_unknownRelease, DefaultCC,
319+
RETURNS(VoidTy),
320+
ARGS(UnknownRefCountedPtrTy),
321+
ATTRS(NoUnwind))
322+
243323
// void *swift_bridgeObjectRetain(void *ptr);
244324
FUNCTION(BridgeObjectStrongRetain, swift_bridgeObjectRetain, DefaultCC,
245325
RETURNS(BridgeObjectPtrTy),
@@ -252,6 +332,19 @@ FUNCTION(BridgeObjectStrongRelease, swift_bridgeObjectRelease, DefaultCC,
252332
ARGS(BridgeObjectPtrTy),
253333
ATTRS(NoUnwind))
254334

335+
// void *swift_nonatomic_bridgeObjectRetain(void *ptr);
336+
FUNCTION(NonAtomicBridgeObjectStrongRetain, swift_nonatomic_bridgeObjectRetain, DefaultCC,
337+
RETURNS(BridgeObjectPtrTy),
338+
ARGS(BridgeObjectPtrTy),
339+
ATTRS(NoUnwind))
340+
341+
// void swift_nonatomic_bridgeRelease(void *ptr);
342+
FUNCTION(NonAtomicBridgeObjectStrongRelease, swift_nonatomic_bridgeObjectRelease, DefaultCC,
343+
RETURNS(VoidTy),
344+
ARGS(BridgeObjectPtrTy),
345+
ATTRS(NoUnwind))
346+
347+
255348
// error *swift_errorRetain(error *ptr);
256349
FUNCTION(ErrorStrongRetain, swift_errorRetain, DefaultCC,
257350
RETURNS(ErrorPtrTy),

0 commit comments

Comments
 (0)