Locked.swift 877 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. //
  2. // Locked.swift
  3. // LoopKit
  4. //
  5. // Copyright © 2018 LoopKit Authors. All rights reserved.
  6. //
  7. import os.lock
  8. internal class Locked<T> {
  9. private var lock = os_unfair_lock()
  10. private var _value: T
  11. init(_ value: T) {
  12. os_unfair_lock_lock(&lock)
  13. defer { os_unfair_lock_unlock(&lock) }
  14. _value = value
  15. }
  16. var value: T {
  17. get {
  18. os_unfair_lock_lock(&lock)
  19. defer { os_unfair_lock_unlock(&lock) }
  20. return _value
  21. }
  22. set {
  23. os_unfair_lock_lock(&lock)
  24. defer { os_unfair_lock_unlock(&lock) }
  25. _value = newValue
  26. }
  27. }
  28. @discardableResult
  29. func mutate(_ changes: (_ value: inout T) -> Void) -> T {
  30. os_unfair_lock_lock(&lock)
  31. defer { os_unfair_lock_unlock(&lock) }
  32. changes(&_value)
  33. return _value
  34. }
  35. }