Commit c9d4d11
Make RCTDeviceInfo._invalidated std::atomic<BOOL> (facebook#48890)
Summary:
When running the tests associated with `RNTestPods` with `TSan` enabled, I get a data race:
```
WARNING: ThreadSanitizer: data race (pid=28047)
Read of size 1 at 0x000144c30be9 by thread T32:
#0 -[RCTDeviceInfo invalidate] <null> (RNTesterUnitTests:arm64+0x434bf8)
facebook#1 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ <null> (CoreFoundation:arm64+0x5e7fc)
facebook#2 decltype(std::declval<void () block_pointer __strong&>()()) std::__1::__invoke[abi:de180100]<void () block_pointer __strong&>(&&, decltype(std::declval<void () block_pointer __strong&>()())&&...) <null> (RNTesterUnitTests:arm64+0x2a19d4)
facebook#3 std::__1::__function::__func<void () block_pointer __strong, std::__1::allocator<std::__1::allocator>, void ()>::operator()() <null> (RNTesterUnitTests:arm64+0x2a16ec)
facebook#4 std::__1::__function::__value_func<void ()>::operator()[abi:de180100]() const <null> (RNTesterUnitTests:arm64+0x2455d4)
facebook#5 std::__1::function<void ()>::operator()() const <null> (RNTesterUnitTests:arm64+0x245404)
facebook#6 facebook::react::tryAndReturnError(std::__1::function<void ()> const&) <null> (RNTesterUnitTests:arm64+0x2c85b4)
facebook#7 -[RCTCxxBridge _tryAndHandleError:] <null> (RNTesterUnitTests:arm64+0x27c9e8)
facebook#8 __NSThreadPerformPerform <null> (Foundation:arm64+0x76c5e8)
facebook#9 __NSThread__start__ <null> (Foundation:arm64+0x76c27c)
Previous write of size 1 at 0x000144c30be9 by thread T30:
#0 -[RCTDeviceInfo invalidate] <null> (RNTesterUnitTests:arm64+0x434c1c)
facebook#1 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ <null> (CoreFoundation:arm64+0x5e7fc)
facebook#2 decltype(std::declval<void () block_pointer __strong&>()()) std::__1::__invoke[abi:de180100]<void () block_pointer __strong&>(&&, decltype(std::declval<void () block_pointer __strong&>()())&&...) <null> (RNTesterUnitTests:arm64+0x2a19d4)
facebook#3 std::__1::__function::__func<void () block_pointer __strong, std::__1::allocator<std::__1::allocator>, void ()>::operator()() <null> (RNTesterUnitTests:arm64+0x2a16ec)
facebook#4 std::__1::__function::__value_func<void ()>::operator()[abi:de180100]() const <null> (RNTesterUnitTests:arm64+0x2455d4)
facebook#5 std::__1::function<void ()>::operator()() const <null> (RNTesterUnitTests:arm64+0x245404)
facebook#6 facebook::react::tryAndReturnError(std::__1::function<void ()> const&) <null> (RNTesterUnitTests:arm64+0x2c85b4)
facebook#7 -[RCTCxxBridge _tryAndHandleError:] <null> (RNTesterUnitTests:arm64+0x27c9e8)
facebook#8 __NSThreadPerformPerform <null> (Foundation:arm64+0x76c5e8)
facebook#9 __NSThread__start__ <null> (Foundation:arm64+0x76c27c)
Location is heap block of size 48 at 0x000144c30bd0 allocated by main thread:
#0 calloc <null> (libclang_rt.tsan_iossim_dynamic.dylib:arm64+0x53b90)
facebook#1 _malloc_type_calloc_outlined <null> (libsystem_malloc.dylib:arm64+0xf8dc)
facebook#2 -[RCTModuleData setUpInstanceAndBridge:] <null> (RNTesterUnitTests:arm64+0x32715c)
facebook#3 __25-[RCTModuleData instance]_block_invoke <null> (RNTesterUnitTests:arm64+0x32a288)
facebook#4 RCTUnsafeExecuteOnMainQueueSync <null> (RNTesterUnitTests:arm64+0x3d6e1c)
facebook#5 -[RCTModuleData instance] <null> (RNTesterUnitTests:arm64+0x329d78)
facebook#6 __49-[RCTCxxBridge _prepareModulesWithDispatchGroup:]_block_invoke <null> (RNTesterUnitTests:arm64+0x287e74)
facebook#7 __wrap_dispatch_group_async_block_invoke <null> (libclang_rt.tsan_iossim_dynamic.dylib:arm64+0x7cffc)
facebook#8 _dispatch_client_callout <null> (libdispatch.dylib:arm64+0x3c04)
facebook#9 __70-[XCTestCase _shouldContinueAfterPerformingSetUpSequenceWithSelector:]_block_invoke.136 <null> (XCTestCore:arm64+0x2d068)
Thread T32 (tid=4154385, running) created by main thread at:
#0 pthread_create <null> (libclang_rt.tsan_iossim_dynamic.dylib:arm64+0x3027c)
facebook#1 -[NSThread startAndReturnError:] <null> (Foundation:arm64+0x76bec4)
facebook#2 -[RCTBridge setUp] <null> (RNTesterUnitTests:arm64+0x23d638)
facebook#3 -[RCTBridge initWithDelegate:bundleURL:moduleProvider:launchOptions:] <null> (RNTesterUnitTests:arm64+0x23addc)
facebook#4 -[RCTBridge initWithBundleURL:moduleProvider:launchOptions:] <null> (RNTesterUnitTests:arm64+0x23aa4c)
facebook#5 -[RCTImageLoaderTests testImageLoaderUsesImageDecoderWithHighestPriority] <null> (RNTesterUnitTests:arm64+0xc578)
facebook#6 __invoking___ <null> (CoreFoundation:arm64+0x132cdc)
Thread T30 (tid=4154383, running) created by main thread at:
#0 pthread_create <null> (libclang_rt.tsan_iossim_dynamic.dylib:arm64+0x3027c)
facebook#1 -[NSThread startAndReturnError:] <null> (Foundation:arm64+0x76bec4)
facebook#2 -[RCTBridge setUp] <null> (RNTesterUnitTests:arm64+0x23d638)
facebook#3 -[RCTBridge initWithDelegate:bundleURL:moduleProvider:launchOptions:] <null> (RNTesterUnitTests:arm64+0x23addc)
facebook#4 -[RCTBridge initWithBundleURL:moduleProvider:launchOptions:] <null> (RNTesterUnitTests:arm64+0x23aa4c)
facebook#5 -[RCTImageLoaderTests testImageDecoding] <null> (RNTesterUnitTests:arm64+0xa8d0)
facebook#6 __invoking___ <null> (CoreFoundation:arm64+0x132cdc)
```
The proposed solution is making the `BOOL` ivar in question a `std::atomic<BOOL>` instead.
## Changelog:
[IOS][FIXED] Data race related to read/write of RCTDeviceInfo._invalidated.
Pull Request resolved: facebook#48890
Test Plan: Existing tests in `RNTesterPods` and manually running RNTester application.
Reviewed By: christophpurrer
Differential Revision: D68629011
Pulled By: javache
fbshipit-source-id: 229d0db4aa13253b96ce0a20c9795c17e344cfc11 parent 054151d commit c9d4d11
1 file changed
+3
-3
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
| 19 | + | |
19 | 20 | | |
20 | 21 | | |
21 | 22 | | |
| |||
28 | 29 | | |
29 | 30 | | |
30 | 31 | | |
31 | | - | |
| 32 | + | |
32 | 33 | | |
33 | 34 | | |
34 | 35 | | |
| |||
96 | 97 | | |
97 | 98 | | |
98 | 99 | | |
99 | | - | |
| 100 | + | |
100 | 101 | | |
101 | 102 | | |
102 | | - | |
103 | 103 | | |
104 | 104 | | |
105 | 105 | | |
| |||
0 commit comments