Browse Source

Update handling of os_unfair_lock to manage the buffer. (#2836)

As recommended by Apple at WWDC, using os_unfair_lock by reference will lead to a crash rate of up to 1%.
Jon Shier 6 years ago
parent
commit
1b89a57c2f
1 changed files with 13 additions and 3 deletions
  1. 13 3
      Source/Protector.swift

+ 13 - 3
Source/Protector.swift

@@ -28,14 +28,24 @@ import Foundation
 
 /// An `os_unfair_lock` wrapper.
 final class UnfairLock {
-    private var unfairLock = os_unfair_lock()
+    private let unfairLock: os_unfair_lock_t
+    
+    init() {
+        unfairLock = .allocate(capacity: 1)
+        unfairLock.initialize(to: os_unfair_lock())
+    }
+    
+    deinit {
+        unfairLock.deinitialize(count: 1)
+        unfairLock.deallocate()
+    }
 
     fileprivate func lock() {
-        os_unfair_lock_lock(&unfairLock)
+        os_unfair_lock_lock(unfairLock)
     }
 
     fileprivate func unlock() {
-        os_unfair_lock_unlock(&unfairLock)
+        os_unfair_lock_unlock(unfairLock)
     }
 
     /// Executes a closure returning a value while acquiring the lock.