From 0b884db73439fa7036cbfe9bc88a2ec3701a05a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20Wei=C3=9F?= Date: Mon, 16 Jan 2017 19:37:06 +0000 Subject: [PATCH] don't hold references to unowned DispatchData objects (SR-3628) (cherry picked from commit dac881a0ec3e41b669aac1f2d686e90e665f08ae) --- src/swift/DispatchStubs.cc | 6 ++++++ src/swift/Wrapper.swift | 12 +++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/swift/DispatchStubs.cc b/src/swift/DispatchStubs.cc index a3629c60d..c81768ab8 100644 --- a/src/swift/DispatchStubs.cc +++ b/src/swift/DispatchStubs.cc @@ -165,6 +165,12 @@ _swift_dispatch_release(dispatch_object_t obj) { dispatch_release(obj); } +SWIFT_CC(swift) DISPATCH_RUNTIME_STDLIB_INTERFACE +extern "C" void +_swift_dispatch_retain(dispatch_object_t obj) { + dispatch_retain(obj); +} + // DISPATCH_RUNTIME_STDLIB_INTERFACE // extern "C" dispatch_queue_t // _swift_apply_current_root_queue() { diff --git a/src/swift/Wrapper.swift b/src/swift/Wrapper.swift index 34ccc1b1f..ece006d6b 100644 --- a/src/swift/Wrapper.swift +++ b/src/swift/Wrapper.swift @@ -188,7 +188,6 @@ extension DispatchSource : DispatchSourceProcess, internal class __DispatchData : DispatchObject { internal let __wrapped:dispatch_data_t - internal let __owned:Bool final internal override func wrapped() -> dispatch_object_t { return unsafeBitCast(__wrapped, to: dispatch_object_t.self) @@ -196,13 +195,13 @@ internal class __DispatchData : DispatchObject { internal init(data:dispatch_data_t, owned:Bool) { __wrapped = data - __owned = owned + if !owned { + _swift_dispatch_retain(unsafeBitCast(data, to: dispatch_object_t.self)) + } } deinit { - if __owned { - _swift_dispatch_release(wrapped()) - } + _swift_dispatch_release(wrapped()) } } @@ -335,3 +334,6 @@ internal enum _OSQoSClass : UInt32 { @_silgen_name("_swift_dispatch_release") internal func _swift_dispatch_release(_ obj: dispatch_object_t) -> Void + +@_silgen_name("_swift_dispatch_retain") +internal func _swift_dispatch_retain(_ obj: dispatch_object_t) -> Void