Skip to content
This repository was archived by the owner on Feb 2, 2023. It is now read-only.

Commit f39c2ce

Browse files
Hannah Troisiappleguy
authored andcommitted
[ASTextNode, ASImageNode, ASVideoNode] Use ASDisplayNode base class lock for subclass property synchronization (#1877)
* [ASTextNode, ASVideoNode] Use ASDisplayNode base class lock for subclass property synchronization * fix headers to match master * address @appleguy, @maicki comments * import header * Swap lock in ASNetworkImageNode as well * remove invalid comment * more cleanup of locks
1 parent 131dd25 commit f39c2ce

File tree

4 files changed

+123
-144
lines changed

4 files changed

+123
-144
lines changed

AsyncDisplayKit/ASImageNode.mm

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ @implementation ASImageNode
4444
UIImage *_image;
4545

4646
void (^_displayCompletionBlock)(BOOL canceled);
47-
ASDN::RecursiveMutex _imageLock;
4847

4948
// Drawing
5049
ASImageNodeDrawParameters _drawParameter;
@@ -119,7 +118,7 @@ - (void)dealloc
119118

120119
- (CGSize)calculateSizeThatFits:(CGSize)constrainedSize
121120
{
122-
ASDN::MutexLocker l(_imageLock);
121+
ASDN::MutexLocker l(_propertyLock);
123122
// if a preferredFrameSize is set, call the superclass to return that instead of using the image size.
124123
if (CGSizeEqualToSize(self.preferredFrameSize, CGSizeZero) == NO)
125124
return [super calculateSizeThatFits:constrainedSize];
@@ -133,11 +132,9 @@ - (CGSize)calculateSizeThatFits:(CGSize)constrainedSize
133132

134133
- (void)setImage:(UIImage *)image
135134
{
136-
_imageLock.lock();
135+
ASDN::MutexLocker l(_propertyLock);
137136
if (!ASObjectIsEqual(_image, image)) {
138137
_image = image;
139-
140-
_imageLock.unlock();
141138

142139
[self invalidateCalculatedLayout];
143140
if (image) {
@@ -153,14 +150,12 @@ - (void)setImage:(UIImage *)image
153150
} else {
154151
self.contents = nil;
155152
}
156-
} else {
157-
_imageLock.unlock(); // We avoid using MutexUnlocker as it needlessly re-locks at the end of the scope.
158153
}
159154
}
160155

161156
- (UIImage *)image
162157
{
163-
ASDN::MutexLocker l(_imageLock);
158+
ASDN::MutexLocker l(_propertyLock);
164159
return _image;
165160
}
166161

@@ -176,7 +171,7 @@ - (void)setPlaceholderColor:(UIColor *)placeholderColor
176171

177172
- (NSObject *)drawParametersForAsyncLayer:(_ASDisplayLayer *)layer
178173
{
179-
ASDN::MutexLocker l(_imageLock);
174+
ASDN::MutexLocker l(_propertyLock);
180175

181176
_drawParameter = {
182177
.bounds = self.bounds,
@@ -221,7 +216,7 @@ - (UIImage *)displayWithParameters:(id<NSObject> *)parameter isCancelled:(asdisp
221216
asimagenode_modification_block_t imageModificationBlock;
222217

223218
{
224-
ASDN::MutexLocker l(_imageLock);
219+
ASDN::MutexLocker l(_propertyLock);
225220
ASImageNodeDrawParameters drawParameter = _drawParameter;
226221

227222
drawParameterBounds = drawParameter.bounds;
@@ -356,19 +351,19 @@ - (void)displayDidFinish
356351
{
357352
[super displayDidFinish];
358353

359-
_imageLock.lock();
354+
_propertyLock.lock();
360355
void (^displayCompletionBlock)(BOOL canceled) = _displayCompletionBlock;
361356
UIImage *image = _image;
362-
_imageLock.unlock();
357+
_propertyLock.unlock();
363358

364359
// If we've got a block to perform after displaying, do it.
365360
if (image && displayCompletionBlock) {
366361

367362
displayCompletionBlock(NO);
368363

369-
_imageLock.lock();
364+
_propertyLock.lock();
370365
_displayCompletionBlock = nil;
371-
_imageLock.unlock();
366+
_propertyLock.unlock();
372367
}
373368
}
374369

@@ -381,7 +376,7 @@ - (void)setNeedsDisplayWithCompletion:(void (^ _Nullable)(BOOL canceled))display
381376
}
382377

383378
// Stash the block and call-site queue. We'll invoke it in -displayDidFinish.
384-
ASDN::MutexLocker l(_imageLock);
379+
ASDN::MutexLocker l(_propertyLock);
385380
if (_displayCompletionBlock != displayCompletionBlock) {
386381
_displayCompletionBlock = [displayCompletionBlock copy];
387382
}
@@ -393,7 +388,7 @@ - (void)setNeedsDisplayWithCompletion:(void (^ _Nullable)(BOOL canceled))display
393388

394389
- (BOOL)isCropEnabled
395390
{
396-
ASDN::MutexLocker l(_imageLock);
391+
ASDN::MutexLocker l(_propertyLock);
397392
return _cropEnabled;
398393
}
399394

@@ -404,7 +399,7 @@ - (void)setCropEnabled:(BOOL)cropEnabled
404399

405400
- (void)setCropEnabled:(BOOL)cropEnabled recropImmediately:(BOOL)recropImmediately inBounds:(CGRect)cropBounds
406401
{
407-
ASDN::MutexLocker l(_imageLock);
402+
ASDN::MutexLocker l(_propertyLock);
408403
if (_cropEnabled == cropEnabled)
409404
return;
410405

@@ -425,13 +420,13 @@ - (void)setCropEnabled:(BOOL)cropEnabled recropImmediately:(BOOL)recropImmediate
425420

426421
- (CGRect)cropRect
427422
{
428-
ASDN::MutexLocker l(_imageLock);
423+
ASDN::MutexLocker l(_propertyLock);
429424
return _cropRect;
430425
}
431426

432427
- (void)setCropRect:(CGRect)cropRect
433428
{
434-
ASDN::MutexLocker l(_imageLock);
429+
ASDN::MutexLocker l(_propertyLock);
435430
if (CGRectEqualToRect(_cropRect, cropRect))
436431
return;
437432

@@ -452,25 +447,25 @@ - (void)setCropRect:(CGRect)cropRect
452447

453448
- (BOOL)forceUpscaling
454449
{
455-
ASDN::MutexLocker l(_imageLock);
450+
ASDN::MutexLocker l(_propertyLock);
456451
return _forceUpscaling;
457452
}
458453

459454
- (void)setForceUpscaling:(BOOL)forceUpscaling
460455
{
461-
ASDN::MutexLocker l(_imageLock);
456+
ASDN::MutexLocker l(_propertyLock);
462457
_forceUpscaling = forceUpscaling;
463458
}
464459

465460
- (asimagenode_modification_block_t)imageModificationBlock
466461
{
467-
ASDN::MutexLocker l(_imageLock);
462+
ASDN::MutexLocker l(_propertyLock);
468463
return _imageModificationBlock;
469464
}
470465

471466
- (void)setImageModificationBlock:(asimagenode_modification_block_t)imageModificationBlock
472467
{
473-
ASDN::MutexLocker l(_imageLock);
468+
ASDN::MutexLocker l(_propertyLock);
474469
_imageModificationBlock = imageModificationBlock;
475470
}
476471

0 commit comments

Comments
 (0)