From 772be9cdfab7d420308d3c7078e046c8a2dac8a5 Mon Sep 17 00:00:00 2001 From: Luke Zhao Date: Fri, 22 Nov 2019 14:50:52 -0800 Subject: [PATCH] fix tintColor dead lock update to use scoped lock --- Source/ASImageNode.mm | 72 +++++++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 34 deletions(-) diff --git a/Source/ASImageNode.mm b/Source/ASImageNode.mm index 0a5a4e59c..b14921789 100644 --- a/Source/ASImageNode.mm +++ b/Source/ASImageNode.mm @@ -302,44 +302,48 @@ - (void)setPlaceholderColor:(UIColor *)placeholderColor - (NSObject *)drawParametersForAsyncLayer:(_ASDisplayLayer *)layer { - ASLockScopeSelf(); - - UIImage *drawImage = _image; - if (AS_AVAILABLE_IOS_TVOS(13, 10)) { - if (_imageNodeFlags.regenerateFromImageAsset && drawImage != nil) { - _imageNodeFlags.regenerateFromImageAsset = NO; - UITraitCollection *tc = [UITraitCollection traitCollectionWithUserInterfaceStyle:_primitiveTraitCollection.userInterfaceStyle]; - UIImage *generatedImage = [drawImage.imageAsset imageWithTraitCollection:tc]; - if ( generatedImage != nil ) { - drawImage = generatedImage; + ASImageNodeDrawParameters *drawParameters = [[ASImageNodeDrawParameters alloc] init]; + + { + ASLockScopeSelf(); + UIImage *drawImage = _image; + if (AS_AVAILABLE_IOS_TVOS(13, 10)) { + if (_imageNodeFlags.regenerateFromImageAsset && drawImage != nil) { + _imageNodeFlags.regenerateFromImageAsset = NO; + UITraitCollection *tc = [UITraitCollection traitCollectionWithUserInterfaceStyle:_primitiveTraitCollection.userInterfaceStyle]; + UIImage *generatedImage = [drawImage.imageAsset imageWithTraitCollection:tc]; + if ( generatedImage != nil ) { + drawImage = generatedImage; + } } } - } - ASImageNodeDrawParameters *drawParameters = [[ASImageNodeDrawParameters alloc] init]; - drawParameters->_image = drawImage; - drawParameters->_bounds = [self threadSafeBounds]; - drawParameters->_opaque = self.opaque; - drawParameters->_contentsScale = _contentsScaleForDisplay; - drawParameters->_backgroundColor = self.backgroundColor; + drawParameters->_image = drawImage; + drawParameters->_bounds = [self threadSafeBounds]; + drawParameters->_opaque = self.opaque; + drawParameters->_contentsScale = _contentsScaleForDisplay; + drawParameters->_backgroundColor = self.backgroundColor; + drawParameters->_contentMode = self.contentMode; + drawParameters->_cropEnabled = _imageNodeFlags.cropEnabled; + drawParameters->_forceUpscaling = _imageNodeFlags.forceUpscaling; + drawParameters->_forcedSize = _forcedSize; + drawParameters->_cropRect = _cropRect; + drawParameters->_cropDisplayBounds = _cropDisplayBounds; + drawParameters->_imageModificationBlock = _imageModificationBlock; + drawParameters->_willDisplayNodeContentWithRenderingContext = _willDisplayNodeContentWithRenderingContext; + drawParameters->_didDisplayNodeContentWithRenderingContext = _didDisplayNodeContentWithRenderingContext; + drawParameters->_traitCollection = _primitiveTraitCollection; + + // Hack for now to retain the weak entry that was created while this drawing happened + drawParameters->_didDrawBlock = ^(ASWeakMapEntry *entry){ + ASLockScopeSelf(); + _weakCacheEntry = entry; + }; + } + + // we need to unlock before we access the tintColor. + // this is to avoid dead locking by walking up the tree drawParameters->_tintColor = self.tintColor; - drawParameters->_contentMode = self.contentMode; - drawParameters->_cropEnabled = _imageNodeFlags.cropEnabled; - drawParameters->_forceUpscaling = _imageNodeFlags.forceUpscaling; - drawParameters->_forcedSize = _forcedSize; - drawParameters->_cropRect = _cropRect; - drawParameters->_cropDisplayBounds = _cropDisplayBounds; - drawParameters->_imageModificationBlock = _imageModificationBlock; - drawParameters->_willDisplayNodeContentWithRenderingContext = _willDisplayNodeContentWithRenderingContext; - drawParameters->_didDisplayNodeContentWithRenderingContext = _didDisplayNodeContentWithRenderingContext; - drawParameters->_traitCollection = _primitiveTraitCollection; - - - // Hack for now to retain the weak entry that was created while this drawing happened - drawParameters->_didDrawBlock = ^(ASWeakMapEntry *entry){ - ASLockScopeSelf(); - _weakCacheEntry = entry; - }; return drawParameters; }