From 81def94f6f83667a5b37fa5efe1572aedc0f8b73 Mon Sep 17 00:00:00 2001 From: appleguy Date: Wed, 14 Jun 2017 13:55:52 -0700 Subject: [PATCH] [ASTraitCollection] Convert ASPrimitiveTraitCollection from lock to atomic. (#355) * [ASTraitCollection] Convert ASPrimitiveTraitCollection from lock to atomic. This resolves a deadlock case: https://github.com/TextureGroup/Texture/issues/353 * [ASTraitCollection] Use assignment operator instead of .store() for C++ atomic. --- CHANGELOG.md | 1 + Source/ASDisplayNode+Layout.mm | 13 +++---------- Source/Details/ASTraitCollection.h | 2 +- Source/Private/ASDisplayNodeInternal.h | 2 +- Source/Private/Layout/ASLayoutSpecPrivate.h | 2 +- 5 files changed, 7 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 978c2fc3b..42bc33956 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## master * Add your own contributions to the next release on the line below this with your name. +- [ASTraitCollection] Convert ASPrimitiveTraitCollection from lock to atomic. [Scott Goodson](https://github.com/appleguy) - Add a synchronous mode to ASCollectionNode, for colletion view data source debugging. [Hannah Troisi](https://github.com/hannahmbanana) - [ASDisplayNode+Layout] Add check for orphaned nodes after layout transition to clean up. #336. [Scott Goodson](https://github.com/appleguy) - Fixed an issue where GIFs with placeholders never had their placeholders uncover the GIF. [Garrett Moon](https://github.com/garrettmoon) diff --git a/Source/ASDisplayNode+Layout.mm b/Source/ASDisplayNode+Layout.mm index f34628976..cd80e7f65 100644 --- a/Source/ASDisplayNode+Layout.mm +++ b/Source/ASDisplayNode+Layout.mm @@ -98,28 +98,21 @@ - (ASLayout *)layoutThatFits:(ASSizeRange)constrainedSize parentSize:(CGSize)par - (ASPrimitiveTraitCollection)primitiveTraitCollection { - ASDN::MutexLocker l(__instanceLock__); - return _primitiveTraitCollection; + return _primitiveTraitCollection.load(); } - (void)setPrimitiveTraitCollection:(ASPrimitiveTraitCollection)traitCollection { - __instanceLock__.lock(); - if (ASPrimitiveTraitCollectionIsEqualToASPrimitiveTraitCollection(traitCollection, _primitiveTraitCollection) == NO) { + if (ASPrimitiveTraitCollectionIsEqualToASPrimitiveTraitCollection(traitCollection, _primitiveTraitCollection.load()) == NO) { _primitiveTraitCollection = traitCollection; ASDisplayNodeLogEvent(self, @"asyncTraitCollectionDidChange: %@", NSStringFromASPrimitiveTraitCollection(traitCollection)); - __instanceLock__.unlock(); - + [self asyncTraitCollectionDidChange]; - return; } - - __instanceLock__.unlock(); } - (ASTraitCollection *)asyncTraitCollection { - ASDN::MutexLocker l(__instanceLock__); return [ASTraitCollection traitCollectionWithASPrimitiveTraitCollection:self.primitiveTraitCollection]; } diff --git a/Source/Details/ASTraitCollection.h b/Source/Details/ASTraitCollection.h index a1e9971b1..760919c0d 100644 --- a/Source/Details/ASTraitCollection.h +++ b/Source/Details/ASTraitCollection.h @@ -104,7 +104,7 @@ ASDISPLAYNODE_EXTERN_C_END #define ASPrimitiveTraitCollectionDefaults \ - (ASPrimitiveTraitCollection)primitiveTraitCollection\ {\ - return _primitiveTraitCollection;\ + return _primitiveTraitCollection.load();\ }\ - (void)setPrimitiveTraitCollection:(ASPrimitiveTraitCollection)traitCollection\ {\ diff --git a/Source/Private/ASDisplayNodeInternal.h b/Source/Private/ASDisplayNodeInternal.h index 83e2db737..7d16fb8b1 100644 --- a/Source/Private/ASDisplayNodeInternal.h +++ b/Source/Private/ASDisplayNodeInternal.h @@ -127,7 +127,7 @@ FOUNDATION_EXPORT NSString * const ASRenderingEngineDidDisplayNodesScheduledBefo NSArray *_cachedSubnodes; ASLayoutElementStyle *_style; - ASPrimitiveTraitCollection _primitiveTraitCollection; + std::atomic _primitiveTraitCollection; std::atomic_uint _displaySentinel; diff --git a/Source/Private/Layout/ASLayoutSpecPrivate.h b/Source/Private/Layout/ASLayoutSpecPrivate.h index 17cf16c98..f8813afeb 100644 --- a/Source/Private/Layout/ASLayoutSpecPrivate.h +++ b/Source/Private/Layout/ASLayoutSpecPrivate.h @@ -28,7 +28,7 @@ NS_ASSUME_NONNULL_BEGIN @interface ASLayoutSpec() { ASDN::RecursiveMutex __instanceLock__; - ASPrimitiveTraitCollection _primitiveTraitCollection; + std::atomic _primitiveTraitCollection; ASLayoutElementStyle *_style; NSMutableArray *_childrenArray; }