Merge pull request #175 from dgrove-oss/SR-2656
SR-2656: extra releases of dispatch_data_t objects on Linux
diff --git a/src/swift/Data.swift b/src/swift/Data.swift
index 7acf50d..6437ea4 100644
--- a/src/swift/Data.swift
+++ b/src/swift/Data.swift
@@ -65,7 +65,11 @@
}
internal init(data: dispatch_data_t) {
- __wrapped = __DispatchData(data: data)
+ __wrapped = __DispatchData(data: data, owned: true)
+ }
+
+ internal init(borrowedData: dispatch_data_t) {
+ __wrapped = __DispatchData(data: borrowedData, owned: false)
}
public var count: Int {
@@ -110,7 +114,7 @@
/// - parameter data: The data to append to this data.
public mutating func append(_ other: DispatchData) {
let data = CDispatch.dispatch_data_create_concat(__wrapped.__wrapped, other.__wrapped.__wrapped)
- __wrapped = __DispatchData(data: data)
+ __wrapped = __DispatchData(data: data, owned: true)
}
/// Append a buffer of bytes to the data.
@@ -244,7 +248,7 @@
public init(_data: DispatchData) {
var ptr: UnsafeRawPointer?
self._count = 0
- self._data = __DispatchData(data: CDispatch.dispatch_data_create_map(_data.__wrapped.__wrapped, &ptr, &self._count))
+ self._data = __DispatchData(data: CDispatch.dispatch_data_create_map(_data.__wrapped.__wrapped, &ptr, &self._count), owned: true)
self._ptr = ptr
self._position = _data.startIndex
diff --git a/src/swift/IO.swift b/src/swift/IO.swift
index 10c7199..8ce417a 100644
--- a/src/swift/IO.swift
+++ b/src/swift/IO.swift
@@ -36,13 +36,13 @@
public class func read(fromFileDescriptor: Int32, maxLength: Int, runningHandlerOn queue: DispatchQueue, handler: @escaping (_ data: DispatchData, _ error: Int32) -> Void) {
dispatch_read(fromFileDescriptor, maxLength, queue.__wrapped) { (data: dispatch_data_t, error: Int32) in
- handler(DispatchData(data: data), error)
+ handler(DispatchData(borrowedData: data), error)
}
}
public class func write(toFileDescriptor: Int32, data: DispatchData, runningHandlerOn queue: DispatchQueue, handler: @escaping (_ data: DispatchData?, _ error: Int32) -> Void) {
dispatch_write(toFileDescriptor, data.__wrapped.__wrapped, queue.__wrapped) { (data: dispatch_data_t?, error: Int32) in
- handler(data.flatMap { DispatchData(data: $0) }, error)
+ handler(data.flatMap { DispatchData(borrowedData: $0) }, error)
}
}
@@ -77,13 +77,13 @@
public func read(offset: off_t, length: Int, queue: DispatchQueue, ioHandler: @escaping (_ done: Bool, _ data: DispatchData?, _ error: Int32) -> Void) {
dispatch_io_read(self.__wrapped, offset, length, queue.__wrapped) { (done: Bool, data: dispatch_data_t?, error: Int32) in
- ioHandler(done, data.flatMap { DispatchData(data: $0) }, error)
+ ioHandler(done, data.flatMap { DispatchData(borrowedData: $0) }, error)
}
}
public func write(offset: off_t, data: DispatchData, queue: DispatchQueue, ioHandler: @escaping (_ done: Bool, _ data: DispatchData?, _ error: Int32) -> Void) {
dispatch_io_write(self.__wrapped, offset, data.__wrapped.__wrapped, queue.__wrapped) { (done: Bool, data: dispatch_data_t?, error: Int32) in
- ioHandler(done, data.flatMap { DispatchData(data: $0) }, error)
+ ioHandler(done, data.flatMap { DispatchData(borrowedData: $0) }, error)
}
}
diff --git a/src/swift/Wrapper.swift b/src/swift/Wrapper.swift
index eb4209a..deb3c6d 100644
--- a/src/swift/Wrapper.swift
+++ b/src/swift/Wrapper.swift
@@ -188,17 +188,21 @@
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)
}
- internal init(data:dispatch_data_t) {
+ internal init(data:dispatch_data_t, owned:Bool) {
__wrapped = data
+ __owned = owned
}
deinit {
- _swift_dispatch_release(wrapped())
+ if __owned {
+ _swift_dispatch_release(wrapped())
+ }
}
}