12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- /*
- * 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
|