Skip to content

Instantly share code, notes, and snippets.

@jspahrsummers
Created September 19, 2012 19:19
Show Gist options
  • Save jspahrsummers/3751646 to your computer and use it in GitHub Desktop.
Save jspahrsummers/3751646 to your computer and use it in GitHub Desktop.
Contrived example of two GCD queue-synchronized objects deadlocking
@implementation OuterClass
- (id)init {
self = [super init];
if (self == nil) return nil;
_outerQueue = dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT);
self.innerObject = [[InnerClass alloc] init];
self.innerObject.delegate = self;
return self;
}
- (NSString *)calculatedProperty {
__block NSString *result;
dispatch_barrier_sync(_outerQueue, ^{
result = [self.innerObject.name copy];
});
return result;
}
- (NSString *)name {
__block NSString *result;
dispatch_barrier_sync(_outerQueue, ^{
result = [_name copy];
});
return result;
}
- (void)setName:(NSString *)name {
dispatch_async(_outerQueue, ^{
_name = [name copy];
});
}
@end
@implementation InnerClass
- (id)init {
self = [super init];
if (self == nil) return nil;
_innerQueue = dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT);
return self;
}
- (NSString *)name {
__block NSString *result;
dispatch_barrier_sync(_innerQueue, ^{
result = [NSString stringWithFormat:@"%@ wrapping %@", self.delegate.name, _name];
});
return result;
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment