Locked.swift 854 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  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. func mutate(_ changes: (_ value: inout T) -> Void) -> T {
  29. os_unfair_lock_lock(&lock)
  30. defer { os_unfair_lock_unlock(&lock) }
  31. changes(&_value)
  32. return _value
  33. }
  34. }