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

Commit 9779801

Browse files
committed
Merge pull request #1443 from nguyenhuy/layoutable_context
[ASLayoutable] Introduce ASLayoutableContext, thread-local storage for layout passes.
2 parents e4c6a49 + 7bb3015 commit 9779801

5 files changed

Lines changed: 71 additions & 10 deletions

File tree

AsyncDisplayKit.xcodeproj/project.pbxproj

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -266,13 +266,13 @@
266266
764D83D61C8EA515009B4FB8 /* AsyncDisplayKit+Debug.m in Sources */ = {isa = PBXBuildFile; fileRef = 764D83D31C8EA515009B4FB8 /* AsyncDisplayKit+Debug.m */; };
267267
767E7F8D1C9019130066C000 /* AsyncDisplayKit+Debug.h in Headers */ = {isa = PBXBuildFile; fileRef = 764D83D21C8EA515009B4FB8 /* AsyncDisplayKit+Debug.h */; settings = {ATTRIBUTES = (Public, ); }; };
268268
767E7F8E1C90191D0066C000 /* AsyncDisplayKit+Debug.m in Sources */ = {isa = PBXBuildFile; fileRef = 764D83D31C8EA515009B4FB8 /* AsyncDisplayKit+Debug.m */; };
269-
81EE384F1C8E94F000456208 /* ASRunLoopQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 81EE384D1C8E94F000456208 /* ASRunLoopQueue.h */; settings = {ATTRIBUTES = (Public, ); }; };
270-
81EE38501C8E94F000456208 /* ASRunLoopQueue.mm in Sources */ = {isa = PBXBuildFile; fileRef = 81EE384E1C8E94F000456208 /* ASRunLoopQueue.mm */; };
271269
7A06A73A1C35F08800FE8DAA /* ASRelativeLayoutSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7A06A7381C35F08800FE8DAA /* ASRelativeLayoutSpec.mm */; };
272270
7A06A73B1C35F08800FE8DAA /* ASRelativeLayoutSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A06A7391C35F08800FE8DAA /* ASRelativeLayoutSpec.h */; settings = {ATTRIBUTES = (Public, ); }; };
273271
7AB338661C55B3420055FDE8 /* ASRelativeLayoutSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7A06A7381C35F08800FE8DAA /* ASRelativeLayoutSpec.mm */; };
274272
7AB338671C55B3460055FDE8 /* ASRelativeLayoutSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A06A7391C35F08800FE8DAA /* ASRelativeLayoutSpec.h */; settings = {ATTRIBUTES = (Public, ); }; };
275273
7AB338691C55B97B0055FDE8 /* ASRelativeLayoutSpecSnapshotTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7AB338681C55B97B0055FDE8 /* ASRelativeLayoutSpecSnapshotTests.mm */; };
274+
81EE384F1C8E94F000456208 /* ASRunLoopQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 81EE384D1C8E94F000456208 /* ASRunLoopQueue.h */; settings = {ATTRIBUTES = (Public, ); }; };
275+
81EE38501C8E94F000456208 /* ASRunLoopQueue.mm in Sources */ = {isa = PBXBuildFile; fileRef = 81EE384E1C8E94F000456208 /* ASRunLoopQueue.mm */; };
276276
92DD2FE31BF4B97E0074C9DD /* ASMapNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 92DD2FE11BF4B97E0074C9DD /* ASMapNode.h */; settings = {ATTRIBUTES = (Public, ); }; };
277277
92DD2FE41BF4B97E0074C9DD /* ASMapNode.mm in Sources */ = {isa = PBXBuildFile; fileRef = 92DD2FE21BF4B97E0074C9DD /* ASMapNode.mm */; };
278278
92DD2FE61BF4D05E0074C9DD /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92DD2FE51BF4D05E0074C9DD /* MapKit.framework */; };
@@ -524,6 +524,8 @@
524524
DECBD6EA1BE56E1900CF4905 /* ASButtonNode.mm in Sources */ = {isa = PBXBuildFile; fileRef = DECBD6E61BE56E1900CF4905 /* ASButtonNode.mm */; };
525525
E52405B31C8FEF03004DC8E7 /* ASDisplayNodeLayoutContext.mm in Sources */ = {isa = PBXBuildFile; fileRef = E52405B21C8FEF03004DC8E7 /* ASDisplayNodeLayoutContext.mm */; };
526526
E52405B51C8FEF16004DC8E7 /* ASDisplayNodeLayoutContext.h in Headers */ = {isa = PBXBuildFile; fileRef = E52405B41C8FEF16004DC8E7 /* ASDisplayNodeLayoutContext.h */; };
527+
E55D86321CA8A14000A0C26F /* ASLayoutable.mm in Sources */ = {isa = PBXBuildFile; fileRef = E55D86311CA8A14000A0C26F /* ASLayoutable.mm */; };
528+
E55D86331CA8A14000A0C26F /* ASLayoutable.mm in Sources */ = {isa = PBXBuildFile; fileRef = E55D86311CA8A14000A0C26F /* ASLayoutable.mm */; };
527529
E5711A2B1C840C81009619D4 /* ASIndexedNodeContext.h in Headers */ = {isa = PBXBuildFile; fileRef = E5711A2A1C840C81009619D4 /* ASIndexedNodeContext.h */; settings = {ATTRIBUTES = (Public, ); }; };
528530
E5711A2C1C840C81009619D4 /* ASIndexedNodeContext.h in Headers */ = {isa = PBXBuildFile; fileRef = E5711A2A1C840C81009619D4 /* ASIndexedNodeContext.h */; };
529531
E5711A2E1C840C96009619D4 /* ASIndexedNodeContext.m in Sources */ = {isa = PBXBuildFile; fileRef = E5711A2D1C840C96009619D4 /* ASIndexedNodeContext.m */; };
@@ -742,11 +744,11 @@
742744
6BDC61F51978FEA400E50D21 /* AsyncDisplayKit.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; path = AsyncDisplayKit.h; sourceTree = "<group>"; };
743745
764D83D21C8EA515009B4FB8 /* AsyncDisplayKit+Debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "AsyncDisplayKit+Debug.h"; sourceTree = "<group>"; };
744746
764D83D31C8EA515009B4FB8 /* AsyncDisplayKit+Debug.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "AsyncDisplayKit+Debug.m"; sourceTree = "<group>"; };
745-
81EE384D1C8E94F000456208 /* ASRunLoopQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ASRunLoopQueue.h; path = ../ASRunLoopQueue.h; sourceTree = "<group>"; };
746-
81EE384E1C8E94F000456208 /* ASRunLoopQueue.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ASRunLoopQueue.mm; path = ../ASRunLoopQueue.mm; sourceTree = "<group>"; };
747747
7A06A7381C35F08800FE8DAA /* ASRelativeLayoutSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ASRelativeLayoutSpec.mm; path = AsyncDisplayKit/Layout/ASRelativeLayoutSpec.mm; sourceTree = "<group>"; };
748748
7A06A7391C35F08800FE8DAA /* ASRelativeLayoutSpec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ASRelativeLayoutSpec.h; path = AsyncDisplayKit/Layout/ASRelativeLayoutSpec.h; sourceTree = "<group>"; };
749749
7AB338681C55B97B0055FDE8 /* ASRelativeLayoutSpecSnapshotTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASRelativeLayoutSpecSnapshotTests.mm; sourceTree = "<group>"; };
750+
81EE384D1C8E94F000456208 /* ASRunLoopQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ASRunLoopQueue.h; path = ../ASRunLoopQueue.h; sourceTree = "<group>"; };
751+
81EE384E1C8E94F000456208 /* ASRunLoopQueue.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ASRunLoopQueue.mm; path = ../ASRunLoopQueue.mm; sourceTree = "<group>"; };
750752
92DD2FE11BF4B97E0074C9DD /* ASMapNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASMapNode.h; sourceTree = "<group>"; };
751753
92DD2FE21BF4B97E0074C9DD /* ASMapNode.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASMapNode.mm; sourceTree = "<group>"; };
752754
92DD2FE51BF4D05E0074C9DD /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = System/Library/Frameworks/MapKit.framework; sourceTree = SDKROOT; };
@@ -808,7 +810,7 @@
808810
ACF6ED471B17847A00DA7C62 /* ASStackPositionedLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASStackPositionedLayout.h; sourceTree = "<group>"; };
809811
ACF6ED481B17847A00DA7C62 /* ASStackPositionedLayout.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASStackPositionedLayout.mm; sourceTree = "<group>"; };
810812
ACF6ED491B17847A00DA7C62 /* ASStackUnpositionedLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASStackUnpositionedLayout.h; sourceTree = "<group>"; };
811-
ACF6ED4A1B17847A00DA7C62 /* ASStackUnpositionedLayout.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = ASStackUnpositionedLayout.mm; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
813+
ACF6ED4A1B17847A00DA7C62 /* ASStackUnpositionedLayout.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = ASStackUnpositionedLayout.mm; sourceTree = "<group>"; };
812814
ACF6ED531B178DC700DA7C62 /* ASCenterLayoutSpecSnapshotTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASCenterLayoutSpecSnapshotTests.mm; sourceTree = "<group>"; };
813815
ACF6ED541B178DC700DA7C62 /* ASDimensionTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASDimensionTests.mm; sourceTree = "<group>"; };
814816
ACF6ED551B178DC700DA7C62 /* ASInsetLayoutSpecSnapshotTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASInsetLayoutSpecSnapshotTests.mm; sourceTree = "<group>"; };
@@ -860,6 +862,7 @@
860862
DECBD6E61BE56E1900CF4905 /* ASButtonNode.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASButtonNode.mm; sourceTree = "<group>"; };
861863
E52405B21C8FEF03004DC8E7 /* ASDisplayNodeLayoutContext.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASDisplayNodeLayoutContext.mm; sourceTree = "<group>"; };
862864
E52405B41C8FEF16004DC8E7 /* ASDisplayNodeLayoutContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASDisplayNodeLayoutContext.h; sourceTree = "<group>"; };
865+
E55D86311CA8A14000A0C26F /* ASLayoutable.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ASLayoutable.mm; path = AsyncDisplayKit/Layout/ASLayoutable.mm; sourceTree = "<group>"; };
863866
E5711A2A1C840C81009619D4 /* ASIndexedNodeContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASIndexedNodeContext.h; sourceTree = "<group>"; };
864867
E5711A2D1C840C96009619D4 /* ASIndexedNodeContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASIndexedNodeContext.m; sourceTree = "<group>"; };
865868
EFA731F0396842FF8AB635EE /* libPods-AsyncDisplayKitTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-AsyncDisplayKitTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -1318,6 +1321,7 @@
13181321
ACF6ED0B1B17843500DA7C62 /* ASLayout.h */,
13191322
ACF6ED0C1B17843500DA7C62 /* ASLayout.mm */,
13201323
ACF6ED111B17843500DA7C62 /* ASLayoutable.h */,
1324+
E55D86311CA8A14000A0C26F /* ASLayoutable.mm */,
13211325
9CDC18CB1B910E12004965E2 /* ASLayoutablePrivate.h */,
13221326
ACF6ED0D1B17843500DA7C62 /* ASLayoutSpec.h */,
13231327
ACF6ED0E1B17843500DA7C62 /* ASLayoutSpec.mm */,
@@ -1862,6 +1866,7 @@
18621866
buildActionMask = 2147483647;
18631867
files = (
18641868
058D0A22195D050800B7D73C /* _ASAsyncTransaction.mm in Sources */,
1869+
E55D86321CA8A14000A0C26F /* ASLayoutable.mm in Sources */,
18651870
058D0A23195D050800B7D73C /* _ASAsyncTransactionContainer.m in Sources */,
18661871
058D0A24195D050800B7D73C /* _ASAsyncTransactionGroup.m in Sources */,
18671872
DBDB83961C6E879900D0098C /* ASPagerFlowLayout.m in Sources */,
@@ -2037,6 +2042,7 @@
20372042
AC47D9421B3B891B00AAEE9D /* ASCellNode.m in Sources */,
20382043
34EFC7641B701CC600AD841F /* ASCenterLayoutSpec.mm in Sources */,
20392044
18C2ED831B9B7DE800F627B3 /* ASCollectionNode.mm in Sources */,
2045+
E55D86331CA8A14000A0C26F /* ASLayoutable.mm in Sources */,
20402046
B35061F61B010EFD0018CF92 /* ASCollectionView.mm in Sources */,
20412047
509E68641B3AEDB7009B9150 /* ASCollectionViewLayoutController.mm in Sources */,
20422048
B35061F91B010EFD0018CF92 /* ASControlNode.mm in Sources */,
@@ -2090,7 +2096,6 @@
20902096
9C8221981BA237B80037F19A /* ASStackBaselinePositionedLayout.mm in Sources */,
20912097
34EFC7721B701D0300AD841F /* ASStackLayoutSpec.mm in Sources */,
20922098
34EFC7761B701D2A00AD841F /* ASStackPositionedLayout.mm in Sources */,
2093-
DECC2ED01C35C1C600388446 /* ASRangeControllerBeta.mm in Sources */,
20942099
7AB338661C55B3420055FDE8 /* ASRelativeLayoutSpec.mm in Sources */,
20952100
34EFC7781B701D3100AD841F /* ASStackUnpositionedLayout.mm in Sources */,
20962101
DE84918E1C8FFF9F003D89E9 /* ASRunLoopQueue.mm in Sources */,

AsyncDisplayKit/ASDisplayNode.mm

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,8 @@ - (BOOL)shouldMeasureWithSizeRange:(ASSizeRange)constrainedSize
630630
return NO;
631631
}
632632

633-
if (ASHierarchyStateIncludesLayoutPending(_hierarchyState) && constrainedSize.transitionID != _pendingTransitionID) {
633+
if (ASHierarchyStateIncludesLayoutPending(_hierarchyState)
634+
&& _pendingTransitionID != ASLayoutableGetCurrentContext().transitionID) {
634635
return NO;
635636
}
636637

@@ -668,8 +669,7 @@ - (void)transitionLayoutWithSizeRange:(ASSizeRange)constrainedSize
668669
}
669670

670671
int32_t transitionID = [self _newTransitionID];
671-
constrainedSize.transitionID = transitionID;
672-
672+
673673
ASDisplayNodePerformBlockOnEverySubnode(self, ^(ASDisplayNode * _Nonnull node) {
674674
ASDisplayNodeAssert([node _hasTransitionsInProgress] == NO, @"Can't start a transition when one of the subnodes is performing one.");
675675
node.hierarchyState |= ASHierarchyStateLayoutPending;
@@ -679,13 +679,17 @@ - (void)transitionLayoutWithSizeRange:(ASSizeRange)constrainedSize
679679
void (^transitionBlock)() = ^{
680680
ASLayout *newLayout;
681681
{
682+
ASLayoutableSetCurrentContext(ASLayoutableContextMake(transitionID, NO));
683+
682684
ASDN::MutexLocker l(_propertyLock);
683685
BOOL disableImplicitHierarchyManagement = self.usesImplicitHierarchyManagement == NO;
684686
self.usesImplicitHierarchyManagement = YES; // Temporary flag for 1.9.x
685687
newLayout = [self calculateLayoutThatFits:constrainedSize];
686688
if (disableImplicitHierarchyManagement) {
687689
self.usesImplicitHierarchyManagement = NO; // Temporary flag for 1.9.x
688690
}
691+
692+
ASLayoutableClearCurrentContext();
689693
}
690694

691695
if ([self _shouldAbortTransitionWithID:transitionID]) {

AsyncDisplayKit/Layout/ASDimension.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ typedef struct {
3030
typedef struct {
3131
CGSize min;
3232
CGSize max;
33-
int32_t transitionID;
3433
} ASSizeRange;
3534

3635
extern ASRelativeDimension const ASRelativeDimensionUnconstrained;
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
//
2+
// ASLayoutablePrivate.mm
3+
// AsyncDisplayKit
4+
//
5+
// Created by Huy Nguyen on 3/27/16.
6+
// Copyright © 2016 Facebook. All rights reserved.
7+
//
8+
9+
#import "ASLayoutablePrivate.h"
10+
#import "pthread.h"
11+
#import <map>
12+
13+
ASLayoutableContext ASLayoutableContextMake(int32_t transitionID, BOOL needsVisualizeNode)
14+
{
15+
struct ASLayoutableContext context;
16+
context.transitionID = transitionID;
17+
context.needsVisualizeNode = needsVisualizeNode;
18+
return context;
19+
}
20+
21+
static std::map<mach_port_t, ASLayoutableContext> layoutableContextMap;
22+
23+
static inline mach_port_t ASLayoutableGetCurrentContextKey()
24+
{
25+
return pthread_mach_thread_np(pthread_self());
26+
}
27+
28+
void ASLayoutableSetCurrentContext(struct ASLayoutableContext context)
29+
{
30+
layoutableContextMap[ASLayoutableGetCurrentContextKey()] = context;
31+
}
32+
33+
struct ASLayoutableContext ASLayoutableGetCurrentContext()
34+
{
35+
return layoutableContextMap[ASLayoutableGetCurrentContextKey()];
36+
}
37+
38+
void ASLayoutableClearCurrentContext() {
39+
layoutableContextMap.erase(ASLayoutableGetCurrentContextKey());
40+
}

AsyncDisplayKit/Layout/ASLayoutablePrivate.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,19 @@
1414
@class ASLayoutOptions;
1515
@protocol ASLayoutable;
1616

17+
struct ASLayoutableContext {
18+
int32_t transitionID;
19+
BOOL needsVisualizeNode;
20+
};
21+
22+
extern struct ASLayoutableContext ASLayoutableContextMake(int32_t transitionID, BOOL needsVisualizeNode);
23+
24+
extern void ASLayoutableSetCurrentContext(struct ASLayoutableContext context);
25+
26+
extern struct ASLayoutableContext ASLayoutableGetCurrentContext();
27+
28+
extern void ASLayoutableClearCurrentContext();
29+
1730
/**
1831
* The base protocol for ASLayoutable. Generally the methods/properties in this class do not need to be
1932
* called by the end user and are only called internally. However, there may be a case where the methods are useful.

0 commit comments

Comments
 (0)