Skip to content

Commit

Permalink
[ASTraitCollection] Convert ASPrimitiveTraitCollection from lock to a…
Browse files Browse the repository at this point in the history
…tomic. (TextureGroup#355)

* [ASTraitCollection] Convert ASPrimitiveTraitCollection from lock to atomic.

This resolves a deadlock case: TextureGroup#353

* [ASTraitCollection] Use assignment operator instead of .store() for C++ atomic.
  • Loading branch information
appleguy authored and bernieperez committed Apr 25, 2018
1 parent 80aac00 commit 0a554c5
Show file tree
Hide file tree
Showing 5 changed files with 7 additions and 13 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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)
Expand Down
13 changes: 3 additions & 10 deletions Source/ASDisplayNode+Layout.mm
Original file line number Diff line number Diff line change
Expand Up @@ -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];
}

Expand Down
2 changes: 1 addition & 1 deletion Source/Details/ASTraitCollection.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ ASDISPLAYNODE_EXTERN_C_END
#define ASPrimitiveTraitCollectionDefaults \
- (ASPrimitiveTraitCollection)primitiveTraitCollection\
{\
return _primitiveTraitCollection;\
return _primitiveTraitCollection.load();\
}\
- (void)setPrimitiveTraitCollection:(ASPrimitiveTraitCollection)traitCollection\
{\
Expand Down
2 changes: 1 addition & 1 deletion Source/Private/ASDisplayNodeInternal.h
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ FOUNDATION_EXPORT NSString * const ASRenderingEngineDidDisplayNodesScheduledBefo
NSArray<ASDisplayNode *> *_cachedSubnodes;

ASLayoutElementStyle *_style;
ASPrimitiveTraitCollection _primitiveTraitCollection;
std::atomic<ASPrimitiveTraitCollection> _primitiveTraitCollection;

std::atomic_uint _displaySentinel;

Expand Down
2 changes: 1 addition & 1 deletion Source/Private/Layout/ASLayoutSpecPrivate.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ NS_ASSUME_NONNULL_BEGIN

@interface ASLayoutSpec() {
ASDN::RecursiveMutex __instanceLock__;
ASPrimitiveTraitCollection _primitiveTraitCollection;
std::atomic <ASPrimitiveTraitCollection> _primitiveTraitCollection;
ASLayoutElementStyle *_style;
NSMutableArray *_childrenArray;
}
Expand Down

0 comments on commit 0a554c5

Please sign in to comment.