/* * Copyright (c) 2014, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * */ #import "OSSCancellationTokenRegistration.h" #import "OSSCancellationToken.h" NS_ASSUME_NONNULL_BEGIN @interface OSSCancellationTokenRegistration () @property (nonatomic, weak) OSSCancellationToken *token; @property (nullable, nonatomic, strong) OSSCancellationBlock cancellationObserverBlock; @property (nonatomic, strong) NSObject *lock; @property (nonatomic) BOOL disposed; @end @interface OSSCancellationToken (OSSCancellationTokenRegistration) - (void)unregisterRegistration:(OSSCancellationTokenRegistration *)registration; @end @implementation OSSCancellationTokenRegistration + (instancetype)registrationWithToken:(OSSCancellationToken *)token delegate:(OSSCancellationBlock)delegate { OSSCancellationTokenRegistration *registration = [OSSCancellationTokenRegistration new]; registration.token = token; registration.cancellationObserverBlock = delegate; return registration; } - (instancetype)init { self = [super init]; if (!self) return self; _lock = [NSObject new]; return self; } - (void)dispose { @synchronized(self.lock) { if (self.disposed) { return; } self.disposed = YES; } OSSCancellationToken *token = self.token; if (token != nil) { [token unregisterRegistration:self]; self.token = nil; } self.cancellationObserverBlock = nil; } - (void)notifyDelegate { @synchronized(self.lock) { [self throwIfDisposed]; self.cancellationObserverBlock(); } } - (void)throwIfDisposed { NSAssert(!self.disposed, @"Object already disposed"); } @end NS_ASSUME_NONNULL_END