From a65ac6b5fb1fdef03d067612c2291e47d0f9f10f Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 6 Mar 2017 02:09:37 +0300 Subject: [PATCH] no message --- SwiftSignalKit/Disposable.swift | 58 ++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/SwiftSignalKit/Disposable.swift b/SwiftSignalKit/Disposable.swift index eb22eb4ffa..a333eae4e2 100644 --- a/SwiftSignalKit/Disposable.swift +++ b/SwiftSignalKit/Disposable.swift @@ -34,7 +34,7 @@ public final class ActionDisposable : Disposable { pthread_mutex_destroy(&self.lock) } - public func dispose() {var disposable: Disposable! = nil + public func dispose() { let disposeAction: (() -> Void)? pthread_mutex_lock(&self.lock) @@ -171,3 +171,59 @@ public final class DisposableSet : Disposable { } } } + +public final class DisposableDict : Disposable { + private var lock = pthread_mutex_t() + private var disposed = false + private var disposables: [T: Disposable] = [:] + + public init() { + pthread_mutex_init(&self.lock, nil) + } + + deinit { + pthread_mutex_lock(&self.lock) + self.disposables.removeAll() + pthread_mutex_unlock(&self.lock) + + pthread_mutex_destroy(&self.lock) + } + + public func set(_ disposable: Disposable?, forKey key: T) { + var disposeImmediately = false + var disposePrevious: Disposable? + + pthread_mutex_lock(&self.lock) + if self.disposed { + disposeImmediately = true + } else { + disposePrevious = self.disposables[key] + if let disposable = disposable { + self.disposables[key] = disposable + } + } + pthread_mutex_unlock(&self.lock) + + if disposeImmediately { + disposable?.dispose() + } + disposePrevious?.dispose() + } + + public func dispose() { + var disposables: [T: Disposable] = [:] + pthread_mutex_lock(&self.lock) + if !self.disposed { + self.disposed = true + disposables = self.disposables + self.disposables = [:] + } + pthread_mutex_unlock(&self.lock) + + if disposables.count != 0 { + for disposable in disposables.values { + disposable.dispose() + } + } + } +}