0001 // 0002 // RefCountDisposable.swift 0003 // Rx 0004 // 0005 // Created by Junior B. on 10/29/15. 0006 // Copyright © 2015 Krunoslav Zaher. All rights reserved. 0007 // 0008 0009 import Foundation 0010 0011 /** 0012 Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed. 0013 */ 0014 public class RefCountDisposable: DisposeBase, Cancelable { 0015 private var _lock
AddRef.swift:33 private let _refCount: RefCountDisposableAddRef.swift:35 init(source: Observable<Element>, refCount: RefCountDisposable) {RefCountDisposable.swift:114 private let _parent: RefCountDisposableRefCountDisposable.swift:117 init(_ parent: RefCountDisposable)Window.swift:28 private let _refCountDisposable: RefCountDisposableWindow.swift:36 _refCountDisposable = RefCountDisposable(disposable: _groupDisposable)= SpinLock() 0016 private var _disposable
RefCountDisposable.swift:25 _lock.lock(); defer { _lock.unlock() }RefCountDisposable.swift:25 _lock.lock(); defer { _lock.unlock() }RefCountDisposable.swift:44 return _lock.calculateLocked {RefCountDisposable.swift:64 let oldDisposable: Disposable? = _lock.calculateLocked {RefCountDisposable.swift:85 let oldDisposable: Disposable? = _lock.calculateLocked {= nil as Disposable? 0017 private var _primaryDisposed
RefCountDisposable.swift:26 return _disposable == nilRefCountDisposable.swift:34 _disposable = disposableRefCountDisposable.swift:45 if let _ = _disposable {RefCountDisposable.swift:65 if let oldDisposable = _disposable where !_primaryDisposedRefCountDisposable.swift:71 _disposable = nilRefCountDisposable.swift:86 if let oldDisposable = _disposable {RefCountDisposable.swift:98 _disposable = nil= false 0018 private var _count
RefCountDisposable.swift:65 if let oldDisposable = _disposable where !_primaryDisposedRefCountDisposable.swift:67 _primaryDisposed = trueRefCountDisposable.swift:97 if _primaryDisposed && _count == 0 {= 0 0019 0020 /** 0021 - returns: Was resource disposed. 0022 */ 0023 public var disposed: Bool { 0024 get { 0025 _lock.lock(); defer { _lock.unlock() } 0026 return _disposable == nil 0027 } 0028 } 0029 0030 /** 0031 Initializes a new instance of the `RefCountDisposable`. 0032 */ 0033 public init
RefCountDisposable.swift:48 try incrementChecked(&_count)RefCountDisposable.swift:69 if (_count == 0)RefCountDisposable.swift:88 try decrementChecked(&_count)RefCountDisposable.swift:93 guard _count >= 0 else {RefCountDisposable.swift:97 if _primaryDisposed && _count == 0 {(disposable: Disposable) { 0034 _disposable = disposable 0035 super.init() 0036 } 0037 0038 /** 0039 Holds a dependent disposable that when disposed decreases the refcount on the underlying disposable. 0040 0041 When getter is called, a dependent disposable contributing to the reference count that manages the underlying disposable's lifetime is returned. 0042 */ 0043 public func retain
Window.swift:36 _refCountDisposable = RefCountDisposable(disposable: _groupDisposable)() -> Disposable { 0044 return _lock.calculateLocked { 0045 if let _ = _disposable { 0046 0047 do { 0048 try incrementChecked(&_count) 0049 } catch (_) { 0050 rxFatalError("RefCountDisposable increment failed") 0051 } 0052 0053 return RefCountInnerDisposable(self) 0054 } else { 0055 return NopDisposable.instance 0056 } 0057 } 0058 } 0059 0060 /** 0061 Disposes the underlying disposable only when all dependent disposables have been disposed. 0062 */ 0063 public func dispose() { 0064 let oldDisposable: Disposable? = _lock.calculateLocked { 0065 if let oldDisposable = _disposable where !_primaryDisposed 0066 { 0067 _primaryDisposed = true 0068 0069 if (_count == 0) 0070 { 0071 _disposable = nil 0072 return oldDisposable 0073 } 0074 } 0075 0076 return nil 0077 } 0078 0079 if let disposable = oldDisposable { 0080 disposable.dispose() 0081 } 0082 } 0083 0084 private func release
AddRef.swift:41 let releaseDisposable = _refCount.retain()() { 0085 let oldDisposable: Disposable? = _lock.calculateLocked { 0086 if let oldDisposable = _disposable { 0087 do { 0088 try decrementChecked(&_count) 0089 } catch (_) { 0090 rxFatalError("RefCountDisposable decrement on release failed") 0091 } 0092 0093 guard _count >= 0 else { 0094 rxFatalError("RefCountDisposable counter is lower than 0") 0095 } 0096 0097 if _primaryDisposed && _count == 0 { 0098 _disposable = nil 0099 return oldDisposable 0100 } 0101 } 0102 0103 return nil 0104 } 0105 0106 if let disposable = oldDisposable { 0107 disposable.dispose() 0108 } 0109 } 0110 } 0111 0112 internal final class RefCountInnerDisposable
RefCountDisposable.swift:126 _parent.release(): DisposeBase, Disposable 0113 { 0114 private let _parent
RefCountDisposable.swift:53 return RefCountInnerDisposable(self): RefCountDisposable 0115 private var _disposed
RefCountDisposable.swift:119 _parent = parentRefCountDisposable.swift:126 _parent.release(): AtomicInt = 0 0116 0117 init
RefCountDisposable.swift:125 if AtomicCompareAndSwap(0, 1, &_disposed) {(_ parent: RefCountDisposable) 0118 { 0119 _parent = parent 0120 super.init() 0121 } 0122 0123 internal func dispose() 0124 { 0125 if AtomicCompareAndSwap(0, 1, &_disposed) { 0126 _parent.release() 0127 } 0128 } 0129 } 0130
RefCountDisposable.swift:53 return RefCountInnerDisposable(self)