UnfairLock.swift 878 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. //
  2. // UnfairLock.swift
  3. // LoopKit Example
  4. //
  5. // Created by Pete Schwamb on 3/22/19.
  6. // Copyright © 2019 LoopKit Authors. All rights reserved.
  7. //
  8. // Source: http://www.russbishop.net/the-law
  9. import Foundation
  10. public class UnfairLock {
  11. private var _lock: UnsafeMutablePointer<os_unfair_lock>
  12. public init() {
  13. _lock = UnsafeMutablePointer<os_unfair_lock>.allocate(capacity: 1)
  14. _lock.initialize(to: os_unfair_lock())
  15. }
  16. deinit {
  17. _lock.deallocate()
  18. }
  19. public func withLock<ReturnValue>(_ f: () throws -> ReturnValue) rethrows -> ReturnValue {
  20. os_unfair_lock_lock(_lock)
  21. defer { os_unfair_lock_unlock(_lock) }
  22. return try f()
  23. }
  24. public func assertOwned() {
  25. os_unfair_lock_assert_owner(_lock)
  26. }
  27. public func assertNotOwned() {
  28. os_unfair_lock_assert_not_owner(_lock)
  29. }
  30. }