@@ -18,22 +18,27 @@ @implementation ASNodeController
18
18
{
19
19
ASDisplayNode *_strongNode;
20
20
__weak ASDisplayNode *_weakNode;
21
- ASDN::RecursiveMutex __instanceLock__ ;
21
+ ASDN::Mutex _nodeLock ;
22
22
}
23
23
24
- - (void ) loadNode
24
+ - (ASDisplayNode *) createNode
25
25
{
26
- ASLockScopeSelf ();
27
- self.node = [[ASDisplayNode alloc ] init ];
26
+ return [[ASDisplayNode alloc ] init ];
28
27
}
29
28
30
29
- (ASDisplayNode *)node
31
30
{
32
- ASLockScopeSelf ();
33
- if (_node == nil ) {
34
- [self loadNode ];
31
+ ASDN::MutexLocker l (_nodeLock);
32
+ ASDisplayNode *node = _node;
33
+ if (!node) {
34
+ node = [self createNode ];
35
+ if (!node) {
36
+ ASDisplayNodeCFailAssert (@" Returned nil from -createNode." );
37
+ node = [[ASDisplayNode alloc ] init ];
38
+ }
39
+ [self setupReferencesWithNode: node];
35
40
}
36
- return _node ;
41
+ return node ;
37
42
}
38
43
39
44
- (void )setupReferencesWithNode : (ASDisplayNode *)node
@@ -53,12 +58,6 @@ - (void)setupReferencesWithNode:(ASDisplayNode *)node
53
58
[node addInterfaceStateDelegate: self ];
54
59
}
55
60
56
- - (void )setNode : (ASDisplayNode *)node
57
- {
58
- ASLockScopeSelf ();
59
- [self setupReferencesWithNode: node];
60
- }
61
-
62
61
- (void )setShouldInvertStrongReference : (BOOL )shouldInvertStrongReference
63
62
{
64
63
ASLockScopeSelf ();
@@ -93,12 +92,19 @@ - (void)hierarchyDisplayDidFinish {}
93
92
94
93
- (void )lock
95
94
{
96
- __instanceLock__. lock () ;
95
+ [ self .node lock ] ;
97
96
}
98
97
99
98
- (void )unlock
100
99
{
101
- __instanceLock__.unlock ();
100
+ // Since the node was already locked on this thread, we don't need to call our accessor or take our lock.
101
+ ASDisplayNodeAssertNotNil (_node, @" Node deallocated while locked." );
102
+ [_node unlock ];
103
+ }
104
+
105
+ - (BOOL )tryLock
106
+ {
107
+ return [self .node tryLock ];
102
108
}
103
109
104
110
@end
0 commit comments