react-native-windows 0.81.34 → 0.81.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Directory.Build.props +1 -16
- package/Folly/ThreadNameStub.cpp +4 -6
- package/Microsoft.ReactNative/Fabric/Composition/BorderPrimitive.cpp +1 -1
- package/Microsoft.ReactNative/Fabric/Composition/CompositionEventHandler.cpp +27 -4
- package/Microsoft.ReactNative/Fabric/Composition/ScrollViewComponentView.cpp +8 -4
- package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp +7 -3
- package/Microsoft.ReactNative/Fabric/Composition/TooltipService.cpp +48 -2
- package/Microsoft.ReactNative/Fabric/WindowsImageManager.cpp +40 -13
- package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj +1 -7
- package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj.filters +0 -3
- package/Microsoft.ReactNative/TurboModulesProvider.cpp +30 -13
- package/PropertySheets/Generated/PackageVersion.g.props +3 -3
- package/PropertySheets/React.Cpp.props +3 -3
- package/ReactCommon/ReactCommon.vcxproj +0 -10
- package/ReactCommon/packages.lock.win32.json +0 -10
- package/Scripts/Tfs/Layout-Desktop-Headers.ps1 +4 -37
- package/Scripts/creaternwlib.cmd +2 -2
- package/Shared/Shared.vcxitems +2 -0
- package/{Folly → external}/.clang-format +0 -1
- package/external/External.vcxitems +10 -0
- package/external/fast-float/.syncignore +10 -0
- package/external/fast-float/LICENSE-APACHE +190 -0
- package/external/fast-float/LICENSE-BOOST +23 -0
- package/external/fast-float/LICENSE-MIT +27 -0
- package/external/fast-float/README.md +545 -0
- package/external/fast-float/cgmanifest.json +15 -0
- package/external/fast-float/fast-float.vcxitems +14 -0
- package/external/fast-float/include/fast_float/ascii_number.h +588 -0
- package/external/fast-float/include/fast_float/bigint.h +638 -0
- package/external/fast-float/include/fast_float/constexpr_feature_detect.h +46 -0
- package/external/fast-float/include/fast_float/decimal_to_binary.h +212 -0
- package/external/fast-float/include/fast_float/digit_comparison.h +457 -0
- package/external/fast-float/include/fast_float/fast_float.h +59 -0
- package/external/fast-float/include/fast_float/fast_table.h +708 -0
- package/external/fast-float/include/fast_float/float_common.h +1240 -0
- package/external/fast-float/include/fast_float/parse_number.h +399 -0
- package/external/fast-float/sync-config.json +8 -0
- package/external/fmt/.syncignore +10 -0
- package/external/fmt/CONTRIBUTING.md +20 -0
- package/external/fmt/LICENSE +27 -0
- package/external/fmt/README.md +484 -0
- package/{fmt → external/fmt}/cgmanifest.json +1 -1
- package/external/fmt/doc/ChangeLog-old.md +3290 -0
- package/external/fmt/doc/api.md +650 -0
- package/external/fmt/doc/fmt.css +61 -0
- package/external/fmt/doc/fmt.js +4 -0
- package/external/fmt/doc/get-started.md +222 -0
- package/external/fmt/doc/index.md +151 -0
- package/external/fmt/doc/perf.svg +1 -0
- package/external/fmt/doc/python-license.txt +290 -0
- package/external/fmt/doc/syntax.md +887 -0
- package/external/fmt/fmt.vcxitems +28 -0
- package/external/fmt/include/fmt/args.h +228 -0
- package/{fmt/TEMP_UntilFmtUpdate/core.h → external/fmt/include/fmt/base.h} +1188 -1036
- package/external/fmt/include/fmt/chrono.h +2432 -0
- package/external/fmt/include/fmt/color.h +612 -0
- package/external/fmt/include/fmt/compile.h +529 -0
- package/external/fmt/include/fmt/core.h +5 -0
- package/external/fmt/include/fmt/format-inl.h +1928 -0
- package/external/fmt/include/fmt/format.h +4427 -0
- package/external/fmt/include/fmt/os.h +439 -0
- package/external/fmt/include/fmt/ostream.h +211 -0
- package/external/fmt/include/fmt/printf.h +656 -0
- package/external/fmt/include/fmt/ranges.h +882 -0
- package/external/fmt/include/fmt/std.h +699 -0
- package/external/fmt/include/fmt/xchar.h +322 -0
- package/external/fmt/src/fmt.cc +135 -0
- package/external/fmt/src/format.cc +43 -0
- package/external/fmt/src/os.cc +403 -0
- package/external/fmt/sync-config.json +8 -0
- package/external/folly/.syncignore +60 -0
- package/external/folly/LICENSE +200 -0
- package/external/folly/README.md +263 -0
- package/{fmt → external/folly/folly}/.clang-format +0 -1
- package/external/folly/folly/AtomicHashArray-inl.h +546 -0
- package/external/folly/folly/AtomicHashArray.h +431 -0
- package/external/folly/folly/AtomicHashMap-inl.h +653 -0
- package/external/folly/folly/AtomicHashMap.h +484 -0
- package/external/folly/folly/AtomicIntrusiveLinkedList.h +206 -0
- package/external/folly/folly/AtomicLinkedList.h +110 -0
- package/external/folly/folly/AtomicUnorderedMap.h +522 -0
- package/external/folly/folly/BUCK +1631 -0
- package/external/folly/folly/BUILD_MODE.bzl +72 -0
- package/external/folly/folly/Benchmark.cpp +986 -0
- package/external/folly/folly/Benchmark.h +680 -0
- package/external/folly/folly/BenchmarkUtil.h +47 -0
- package/external/folly/folly/Bits.h +17 -0
- package/external/folly/folly/CMakeLists.txt +110 -0
- package/external/folly/folly/CPortability.h +338 -0
- package/external/folly/folly/CancellationToken-inl.h +449 -0
- package/external/folly/folly/CancellationToken.cpp +250 -0
- package/external/folly/folly/CancellationToken.h +365 -0
- package/external/folly/folly/Chrono.h +132 -0
- package/external/folly/folly/ClockGettimeWrappers.cpp +93 -0
- package/external/folly/folly/ClockGettimeWrappers.h +29 -0
- package/external/folly/folly/ConcurrentBitSet.h +157 -0
- package/external/folly/folly/ConcurrentLazy.h +74 -0
- package/external/folly/folly/ConcurrentSkipList-inl.h +341 -0
- package/external/folly/folly/ConcurrentSkipList.h +824 -0
- package/external/folly/folly/ConstructorCallbackList.h +158 -0
- package/external/folly/folly/Conv.h +2026 -0
- package/external/folly/folly/CppAttributes.h +170 -0
- package/external/folly/folly/CpuId.h +297 -0
- package/external/folly/folly/DefaultKeepAliveExecutor.h +172 -0
- package/external/folly/folly/Demangle.cpp +255 -0
- package/external/folly/folly/Demangle.h +73 -0
- package/external/folly/folly/DiscriminatedPtr.h +236 -0
- package/external/folly/folly/DynamicConverter.h +17 -0
- package/external/folly/folly/Exception.h +150 -0
- package/external/folly/folly/ExceptionString.cpp +51 -0
- package/external/folly/folly/ExceptionString.h +33 -0
- package/external/folly/folly/ExceptionWrapper-inl.h +264 -0
- package/external/folly/folly/ExceptionWrapper.cpp +37 -0
- package/external/folly/folly/ExceptionWrapper.h +377 -0
- package/external/folly/folly/Executor.cpp +111 -0
- package/external/folly/folly/Executor.h +351 -0
- package/external/folly/folly/Expected.h +1725 -0
- package/external/folly/folly/FBString.h +2888 -0
- package/external/folly/folly/FBVector.h +17 -0
- package/external/folly/folly/File.cpp +180 -0
- package/external/folly/folly/File.h +177 -0
- package/external/folly/folly/FileUtil.cpp +378 -0
- package/external/folly/folly/FileUtil.h +332 -0
- package/external/folly/folly/Fingerprint.cpp +135 -0
- package/external/folly/folly/Fingerprint.h +289 -0
- package/external/folly/folly/FixedString.h +2965 -0
- package/external/folly/folly/FollyMemcpy.cpp +30 -0
- package/external/folly/folly/FollyMemcpy.h +23 -0
- package/external/folly/folly/FollyMemset.cpp +29 -0
- package/external/folly/folly/FollyMemset.h +25 -0
- package/external/folly/folly/Format-inl.h +1152 -0
- package/external/folly/folly/Format.cpp +429 -0
- package/external/folly/folly/Format.h +463 -0
- package/external/folly/folly/FormatArg.h +285 -0
- package/external/folly/folly/FormatTraits.h +65 -0
- package/external/folly/folly/Function.h +1159 -0
- package/external/folly/folly/GLog.h +85 -0
- package/external/folly/folly/GroupVarint.cpp +153 -0
- package/external/folly/folly/GroupVarint.h +630 -0
- package/external/folly/folly/Hash.h +20 -0
- package/external/folly/folly/IPAddress.cpp +490 -0
- package/external/folly/folly/IPAddress.h +667 -0
- package/external/folly/folly/IPAddressException.h +82 -0
- package/external/folly/folly/IPAddressV4.cpp +305 -0
- package/external/folly/folly/IPAddressV4.h +495 -0
- package/external/folly/folly/IPAddressV6.cpp +541 -0
- package/external/folly/folly/IPAddressV6.h +627 -0
- package/external/folly/folly/Indestructible.h +164 -0
- package/external/folly/folly/IndexedMemPool.h +550 -0
- package/external/folly/folly/IntrusiveList.h +17 -0
- package/external/folly/folly/Lazy.h +142 -0
- package/external/folly/folly/Likely.h +76 -0
- package/external/folly/folly/MPMCPipeline.h +280 -0
- package/external/folly/folly/MPMCQueue.h +1556 -0
- package/external/folly/folly/MacAddress.cpp +188 -0
- package/external/folly/folly/MacAddress.h +260 -0
- package/external/folly/folly/MapUtil.h +17 -0
- package/external/folly/folly/Math.h +258 -0
- package/external/folly/folly/MaybeManagedPtr.h +120 -0
- package/external/folly/folly/Memory.h +900 -0
- package/external/folly/folly/MicroLock.cpp +76 -0
- package/external/folly/folly/MicroLock.h +354 -0
- package/external/folly/folly/MicroSpinLock.h +17 -0
- package/external/folly/folly/MoveWrapper.h +76 -0
- package/external/folly/folly/ObserverContainer.h +1026 -0
- package/external/folly/folly/Optional.h +743 -0
- package/external/folly/folly/Overload.h +325 -0
- package/external/folly/folly/PackedSyncPtr.h +147 -0
- package/external/folly/folly/Padded.h +464 -0
- package/external/folly/folly/Poly-inl.h +230 -0
- package/external/folly/folly/Poly.h +1095 -0
- package/external/folly/folly/PolyException.h +43 -0
- package/external/folly/folly/Portability.h +644 -0
- package/external/folly/folly/Preprocessor.h +236 -0
- package/external/folly/folly/ProducerConsumerQueue.h +182 -0
- package/external/folly/folly/RWSpinLock.h +17 -0
- package/external/folly/folly/Random-inl.h +86 -0
- package/external/folly/folly/Random.cpp +184 -0
- package/external/folly/folly/Random.h +434 -0
- package/external/folly/folly/Range.h +1772 -0
- package/external/folly/folly/Replaceable.h +636 -0
- package/external/folly/folly/ScopeGuard.cpp +29 -0
- package/external/folly/folly/ScopeGuard.h +420 -0
- package/external/folly/folly/SharedMutex.cpp +81 -0
- package/external/folly/folly/SharedMutex.h +1751 -0
- package/external/folly/folly/Singleton-inl.h +332 -0
- package/external/folly/folly/Singleton.cpp +512 -0
- package/external/folly/folly/Singleton.h +891 -0
- package/external/folly/folly/SingletonThreadLocal.cpp +53 -0
- package/external/folly/folly/SingletonThreadLocal.h +263 -0
- package/external/folly/folly/SocketAddress.cpp +786 -0
- package/external/folly/folly/SocketAddress.h +768 -0
- package/external/folly/folly/SpinLock.h +55 -0
- package/external/folly/folly/String-inl.h +668 -0
- package/external/folly/folly/String.cpp +777 -0
- package/external/folly/folly/String.h +767 -0
- package/external/folly/folly/Subprocess.cpp +1142 -0
- package/external/folly/folly/Subprocess.h +1055 -0
- package/external/folly/folly/Synchronized.h +1833 -0
- package/external/folly/folly/SynchronizedPtr.h +106 -0
- package/external/folly/folly/ThreadCachedInt.h +175 -0
- package/external/folly/folly/ThreadLocal.h +478 -0
- package/external/folly/folly/TimeoutQueue.cpp +78 -0
- package/external/folly/folly/TimeoutQueue.h +123 -0
- package/external/folly/folly/TokenBucket.h +673 -0
- package/external/folly/folly/Traits.h +1442 -0
- package/external/folly/folly/Try-inl.h +372 -0
- package/external/folly/folly/Try.cpp +23 -0
- package/external/folly/folly/Try.h +728 -0
- package/external/folly/folly/UTF8String.h +56 -0
- package/external/folly/folly/Unicode.cpp +201 -0
- package/external/folly/folly/Unicode.h +94 -0
- package/external/folly/folly/Unit.h +65 -0
- package/external/folly/folly/Uri-inl.h +101 -0
- package/external/folly/folly/Uri.cpp +190 -0
- package/external/folly/folly/Uri.h +142 -0
- package/external/folly/folly/Utility.h +932 -0
- package/external/folly/folly/VERSION +1 -0
- package/external/folly/folly/Varint.h +230 -0
- package/external/folly/folly/VirtualExecutor.h +17 -0
- package/external/folly/folly/algorithm/simd/BUCK +47 -0
- package/external/folly/folly/algorithm/simd/Contains.cpp +42 -0
- package/external/folly/folly/algorithm/simd/Contains.h +116 -0
- package/external/folly/folly/algorithm/simd/FindFixed.h +301 -0
- package/external/folly/folly/algorithm/simd/Ignore.h +52 -0
- package/external/folly/folly/algorithm/simd/Movemask.h +207 -0
- package/external/folly/folly/algorithm/simd/detail/BUCK +70 -0
- package/external/folly/folly/algorithm/simd/detail/ContainsImpl.h +91 -0
- package/external/folly/folly/algorithm/simd/detail/SimdAnyOf.h +83 -0
- package/external/folly/folly/algorithm/simd/detail/SimdForEach.h +209 -0
- package/external/folly/folly/algorithm/simd/detail/SimdPlatform.h +445 -0
- package/external/folly/folly/algorithm/simd/detail/Traits.h +125 -0
- package/external/folly/folly/algorithm/simd/detail/UnrollUtils.h +126 -0
- package/external/folly/folly/base64.h +264 -0
- package/external/folly/folly/chrono/BUCK +29 -0
- package/external/folly/folly/chrono/Clock.h +65 -0
- package/external/folly/folly/chrono/Conv.h +712 -0
- package/external/folly/folly/chrono/test/BUCK +26 -0
- package/external/folly/folly/chrono/test/ClockTest.cpp +68 -0
- package/external/folly/folly/chrono/test/ConvTest.cpp +652 -0
- package/external/folly/folly/concurrency/AtomicSharedPtr.h +387 -0
- package/external/folly/folly/concurrency/BUCK +170 -0
- package/external/folly/folly/concurrency/CacheLocality.h +460 -0
- package/external/folly/folly/concurrency/ConcurrentHashMap.h +822 -0
- package/external/folly/folly/concurrency/CoreCachedSharedPtr.h +232 -0
- package/external/folly/folly/concurrency/DeadlockDetector.cpp +27 -0
- package/external/folly/folly/concurrency/DeadlockDetector.h +44 -0
- package/external/folly/folly/concurrency/DynamicBoundedQueue.h +751 -0
- package/external/folly/folly/concurrency/PriorityUnboundedQueueSet.h +207 -0
- package/external/folly/folly/concurrency/ProcessLocalUniqueId.cpp +46 -0
- package/external/folly/folly/concurrency/ProcessLocalUniqueId.h +38 -0
- package/external/folly/folly/concurrency/SingletonRelaxedCounter.h +325 -0
- package/external/folly/folly/concurrency/ThreadCachedSynchronized.h +227 -0
- package/external/folly/folly/concurrency/UnboundedQueue.h +891 -0
- package/external/folly/folly/concurrency/container/BUCK +77 -0
- package/external/folly/folly/concurrency/container/FlatCombiningPriorityQueue.h +426 -0
- package/external/folly/folly/concurrency/container/LockFreeRingBuffer.h +306 -0
- package/external/folly/folly/concurrency/container/RelaxedConcurrentPriorityQueue.h +1212 -0
- package/external/folly/folly/concurrency/container/SingleWriterFixedHashMap.h +322 -0
- package/external/folly/folly/concurrency/container/atomic_grow_array.h +564 -0
- package/external/folly/folly/concurrency/container/test/BUCK +75 -0
- package/external/folly/folly/concurrency/container/test/FlatCombiningPriorityQueueTest.cpp +570 -0
- package/external/folly/folly/concurrency/container/test/LockFreeRingBufferTest.cpp +276 -0
- package/external/folly/folly/concurrency/container/test/RelaxedConcurrentPriorityQueueTest.cpp +1570 -0
- package/external/folly/folly/concurrency/container/test/SingleWriterFixedHashMapTest.cpp +401 -0
- package/external/folly/folly/concurrency/container/test/atomic_grow_array_test.cpp +187 -0
- package/external/folly/folly/concurrency/detail/AtomicSharedPtr-detail.h +212 -0
- package/external/folly/folly/concurrency/detail/ConcurrentHashMap-detail.h +1911 -0
- package/external/folly/folly/concurrency/memory/AtomicReadMostlyMainPtr.cpp +43 -0
- package/external/folly/folly/concurrency/memory/AtomicReadMostlyMainPtr.h +190 -0
- package/external/folly/folly/concurrency/memory/BUCK +53 -0
- package/external/folly/folly/concurrency/memory/PrimaryPtr.h +338 -0
- package/external/folly/folly/concurrency/memory/ReadMostlySharedPtr.h +511 -0
- package/external/folly/folly/concurrency/memory/TLRefCount.h +228 -0
- package/external/folly/folly/concurrency/memory/test/AtomicReadMostlyMainPtrBenchmark.cpp +56 -0
- package/external/folly/folly/concurrency/memory/test/AtomicReadMostlyMainPtrTest.cpp +454 -0
- package/external/folly/folly/concurrency/memory/test/BUCK +95 -0
- package/external/folly/folly/concurrency/memory/test/PrimaryPtrTest.cpp +303 -0
- package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrBenchmark.cpp +138 -0
- package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrStressTest.cpp +75 -0
- package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrTest.cpp +378 -0
- package/external/folly/folly/concurrency/memory/test/RefCountBenchmark.cpp +90 -0
- package/external/folly/folly/concurrency/memory/test/RefCountTest.cpp +168 -0
- package/external/folly/folly/concurrency/test/AtomicSharedPtrCounted.h +156 -0
- package/external/folly/folly/concurrency/test/AtomicSharedPtrPerformance.cpp +255 -0
- package/external/folly/folly/concurrency/test/AtomicSharedPtrTest.cpp +257 -0
- package/external/folly/folly/concurrency/test/BUCK +229 -0
- package/external/folly/folly/concurrency/test/CacheLocalityBenchmark.cpp +392 -0
- package/external/folly/folly/concurrency/test/CacheLocalityTest.cpp +1229 -0
- package/external/folly/folly/concurrency/test/ConcurrentHashMapBench.cpp +260 -0
- package/external/folly/folly/concurrency/test/ConcurrentHashMapTest.cpp +1242 -0
- package/external/folly/folly/concurrency/test/CoreCachedSharedPtrTest.cpp +408 -0
- package/external/folly/folly/concurrency/test/DynamicBoundedQueueTest.cpp +984 -0
- package/external/folly/folly/concurrency/test/PriorityUnboundedQueueSetTest.cpp +73 -0
- package/external/folly/folly/concurrency/test/ProcessLocalUniqueIdTest.cpp +66 -0
- package/external/folly/folly/concurrency/test/SingletonRelaxedCounterBench.cpp +101 -0
- package/external/folly/folly/concurrency/test/SingletonRelaxedCounterTest.cpp +185 -0
- package/external/folly/folly/concurrency/test/ThreadCachedSynchronizedBench.cpp +76 -0
- package/external/folly/folly/concurrency/test/ThreadCachedSynchronizedTest.cpp +93 -0
- package/external/folly/folly/concurrency/test/UnboundedQueueTest.cpp +1302 -0
- package/external/folly/folly/container/Access.h +57 -0
- package/external/folly/folly/container/Array.h +87 -0
- package/external/folly/folly/container/BUCK +353 -0
- package/external/folly/folly/container/BitIterator.h +203 -0
- package/external/folly/folly/container/Enumerate.h +162 -0
- package/external/folly/folly/container/EvictingCacheMap.h +730 -0
- package/external/folly/folly/container/F14.md +300 -0
- package/external/folly/folly/container/F14Map-fwd.h +113 -0
- package/external/folly/folly/container/F14Map.h +2108 -0
- package/external/folly/folly/container/F14Set-fwd.h +95 -0
- package/external/folly/folly/container/F14Set.h +1603 -0
- package/external/folly/folly/container/FBVector.h +1711 -0
- package/external/folly/folly/container/Foreach-inl.h +316 -0
- package/external/folly/folly/container/Foreach.h +209 -0
- package/external/folly/folly/container/HeterogeneousAccess-fwd.h +33 -0
- package/external/folly/folly/container/HeterogeneousAccess.h +171 -0
- package/external/folly/folly/container/IntrusiveHeap.h +268 -0
- package/external/folly/folly/container/IntrusiveList.h +131 -0
- package/external/folly/folly/container/Iterator.h +843 -0
- package/external/folly/folly/container/MapUtil.h +376 -0
- package/external/folly/folly/container/Merge.h +90 -0
- package/external/folly/folly/container/RegexMatchCache.cpp +521 -0
- package/external/folly/folly/container/RegexMatchCache.h +699 -0
- package/external/folly/folly/container/Reserve.h +109 -0
- package/external/folly/folly/container/SparseByteSet.h +123 -0
- package/external/folly/folly/container/View.h +81 -0
- package/external/folly/folly/container/WeightedEvictingCacheMap.h +651 -0
- package/external/folly/folly/container/detail/BUCK +115 -0
- package/external/folly/folly/container/detail/BitIteratorDetail.h +87 -0
- package/external/folly/folly/container/detail/F14Defaults.h +34 -0
- package/external/folly/folly/container/detail/F14IntrinsicsAvailability.h +67 -0
- package/external/folly/folly/container/detail/F14MapFallback.h +717 -0
- package/external/folly/folly/container/detail/F14Mask.h +235 -0
- package/external/folly/folly/container/detail/F14Policy.h +1523 -0
- package/external/folly/folly/container/detail/F14SetFallback.h +528 -0
- package/external/folly/folly/container/detail/F14Table.cpp +71 -0
- package/external/folly/folly/container/detail/F14Table.h +2680 -0
- package/external/folly/folly/container/detail/Util.h +303 -0
- package/external/folly/folly/container/detail/tape_detail.h +135 -0
- package/external/folly/folly/container/detail/test/BUCK +14 -0
- package/external/folly/folly/container/detail/test/F14DetailTest.cpp +47 -0
- package/external/folly/folly/container/heap_vector_types.h +1683 -0
- package/external/folly/folly/container/range_traits.h +81 -0
- package/external/folly/folly/container/small_vector.h +1476 -0
- package/external/folly/folly/container/sorted_vector_types.h +1652 -0
- package/external/folly/folly/container/span.h +408 -0
- package/external/folly/folly/container/tape.h +608 -0
- package/external/folly/folly/container/test/.clang-tidy +12 -0
- package/external/folly/folly/container/test/AccessTest.cpp +138 -0
- package/external/folly/folly/container/test/ArrayTest.cpp +84 -0
- package/external/folly/folly/container/test/BUCK +568 -0
- package/external/folly/folly/container/test/BitIteratorBench.cpp +112 -0
- package/external/folly/folly/container/test/BitIteratorTest.cpp +109 -0
- package/external/folly/folly/container/test/EnumerateTest.cpp +294 -0
- package/external/folly/folly/container/test/EvictingCacheMapBench.cpp +80 -0
- package/external/folly/folly/container/test/EvictingCacheMapTest.cpp +842 -0
- package/external/folly/folly/container/test/F14AsanSupportTest.cpp +143 -0
- package/external/folly/folly/container/test/F14FwdTest.cpp +37 -0
- package/external/folly/folly/container/test/F14InterprocessTest.cpp +404 -0
- package/external/folly/folly/container/test/F14MapTest.cpp +2543 -0
- package/external/folly/folly/container/test/F14PolicyTest.cpp +49 -0
- package/external/folly/folly/container/test/F14SetTest.cpp +1738 -0
- package/external/folly/folly/container/test/F14SmallOverheads.cpp +215 -0
- package/external/folly/folly/container/test/F14TestUtil.h +117 -0
- package/external/folly/folly/container/test/FBVectorBenchmark.cpp +380 -0
- package/external/folly/folly/container/test/FBVectorBenchmarks.cpp.h +100 -0
- package/external/folly/folly/container/test/FBVectorTest.cpp +326 -0
- package/external/folly/folly/container/test/FBVectorTests.cpp.h +304 -0
- package/external/folly/folly/container/test/ForeachBenchmark.cpp +388 -0
- package/external/folly/folly/container/test/ForeachTest.cpp +338 -0
- package/external/folly/folly/container/test/HashMapsBench.cpp +458 -0
- package/external/folly/folly/container/test/HeterogeneousAccessTest.cpp +242 -0
- package/external/folly/folly/container/test/IntrusiveHeapTest.cpp +262 -0
- package/external/folly/folly/container/test/IteratorTest.cpp +989 -0
- package/external/folly/folly/container/test/MapUtilTest.cpp +365 -0
- package/external/folly/folly/container/test/MergeTest.cpp +66 -0
- package/external/folly/folly/container/test/RegexMatchCacheTest.cpp +634 -0
- package/external/folly/folly/container/test/ReserveTest.cpp +173 -0
- package/external/folly/folly/container/test/SparseByteSetBenchmark.cpp +153 -0
- package/external/folly/folly/container/test/SparseByteSetTest.cpp +117 -0
- package/external/folly/folly/container/test/TrackingTypes.h +584 -0
- package/external/folly/folly/container/test/UtilTest.cpp +609 -0
- package/external/folly/folly/container/test/WeightedEvictingCacheMapTest.cpp +800 -0
- package/external/folly/folly/container/test/heap_vector_types_test.cpp +1774 -0
- package/external/folly/folly/container/test/range_traits_test.cpp +59 -0
- package/external/folly/folly/container/test/small_vector_test.cpp +1571 -0
- package/external/folly/folly/container/test/sorted_vector_test.cpp +1589 -0
- package/external/folly/folly/container/test/span_test.cpp +520 -0
- package/external/folly/folly/container/test/tape_bench.cpp +200 -0
- package/external/folly/folly/container/test/tape_test.cpp +590 -0
- package/external/folly/folly/defs.bzl +238 -0
- package/external/folly/folly/detail/AsyncTrace.cpp +36 -0
- package/external/folly/folly/detail/AsyncTrace.h +44 -0
- package/external/folly/folly/detail/AtomicHashUtils.h +42 -0
- package/external/folly/folly/detail/AtomicUnorderedMapUtils.h +80 -0
- package/external/folly/folly/detail/BUCK +406 -0
- package/external/folly/folly/detail/DiscriminatedPtrDetail.h +172 -0
- package/external/folly/folly/detail/FileUtilDetail.cpp +63 -0
- package/external/folly/folly/detail/FileUtilDetail.h +85 -0
- package/external/folly/folly/detail/FileUtilVectorDetail.h +81 -0
- package/external/folly/folly/detail/FingerprintPolynomial.h +132 -0
- package/external/folly/folly/detail/Futex-inl.h +123 -0
- package/external/folly/folly/detail/Futex.cpp +273 -0
- package/external/folly/folly/detail/Futex.h +109 -0
- package/external/folly/folly/detail/GroupVarintDetail.h +101 -0
- package/external/folly/folly/detail/IPAddress.cpp +37 -0
- package/external/folly/folly/detail/IPAddress.h +57 -0
- package/external/folly/folly/detail/IPAddressSource.h +278 -0
- package/external/folly/folly/detail/Iterators.h +156 -0
- package/external/folly/folly/detail/MPMCPipelineDetail.h +122 -0
- package/external/folly/folly/detail/MemoryIdler.cpp +233 -0
- package/external/folly/folly/detail/MemoryIdler.h +216 -0
- package/external/folly/folly/detail/PerfScoped.cpp +112 -0
- package/external/folly/folly/detail/PerfScoped.h +70 -0
- package/external/folly/folly/detail/PolyDetail.h +921 -0
- package/external/folly/folly/detail/RangeCommon.cpp +55 -0
- package/external/folly/folly/detail/RangeCommon.h +93 -0
- package/external/folly/folly/detail/RangeSse42.cpp +198 -0
- package/external/folly/folly/detail/RangeSse42.h +30 -0
- package/external/folly/folly/detail/SimpleSimdStringUtils.cpp +31 -0
- package/external/folly/folly/detail/SimpleSimdStringUtils.h +27 -0
- package/external/folly/folly/detail/SimpleSimdStringUtilsImpl.h +63 -0
- package/external/folly/folly/detail/Singleton.h +34 -0
- package/external/folly/folly/detail/SlowFingerprint.h +90 -0
- package/external/folly/folly/detail/SocketFastOpen.cpp +175 -0
- package/external/folly/folly/detail/SocketFastOpen.h +89 -0
- package/external/folly/folly/detail/SplitStringSimd.cpp +84 -0
- package/external/folly/folly/detail/SplitStringSimd.h +151 -0
- package/external/folly/folly/detail/SplitStringSimdImpl.h +149 -0
- package/external/folly/folly/detail/Sse.cpp +35 -0
- package/external/folly/folly/detail/Sse.h +45 -0
- package/external/folly/folly/detail/StaticSingletonManager.cpp +119 -0
- package/external/folly/folly/detail/StaticSingletonManager.h +298 -0
- package/external/folly/folly/detail/ThreadLocalDetail.cpp +492 -0
- package/external/folly/folly/detail/ThreadLocalDetail.h +800 -0
- package/external/folly/folly/detail/TrapOnAvx512.cpp +41 -0
- package/external/folly/folly/detail/TrapOnAvx512.h +21 -0
- package/external/folly/folly/detail/TurnSequencer.h +295 -0
- package/external/folly/folly/detail/TypeList.h +551 -0
- package/external/folly/folly/detail/UniqueInstance.cpp +136 -0
- package/external/folly/folly/detail/UniqueInstance.h +68 -0
- package/external/folly/folly/detail/base64_detail/BUCK +102 -0
- package/external/folly/folly/detail/base64_detail/Base64Api.cpp +40 -0
- package/external/folly/folly/detail/base64_detail/Base64Api.h +101 -0
- package/external/folly/folly/detail/base64_detail/Base64Common.h +80 -0
- package/external/folly/folly/detail/base64_detail/Base64Constants.h +79 -0
- package/external/folly/folly/detail/base64_detail/Base64HiddenConstants.h +129 -0
- package/external/folly/folly/detail/base64_detail/Base64SWAR.cpp +161 -0
- package/external/folly/folly/detail/base64_detail/Base64SWAR.h +32 -0
- package/external/folly/folly/detail/base64_detail/Base64Scalar.h +262 -0
- package/external/folly/folly/detail/base64_detail/Base64Simd.h +102 -0
- package/external/folly/folly/detail/base64_detail/Base64_SSE4_2.cpp +42 -0
- package/external/folly/folly/detail/base64_detail/Base64_SSE4_2.h +33 -0
- package/external/folly/folly/detail/base64_detail/Base64_SSE4_2_Platform.h +167 -0
- package/external/folly/folly/detail/base64_detail/README.md +392 -0
- package/external/folly/folly/detail/base64_detail/tests/BUCK +36 -0
- package/external/folly/folly/detail/base64_detail/tests/Base64AgainstScalarTest.cpp +141 -0
- package/external/folly/folly/detail/base64_detail/tests/Base64PlatformTest.cpp +273 -0
- package/external/folly/folly/detail/base64_detail/tests/Base64SpecialCasesTest.cpp +555 -0
- package/external/folly/folly/detail/test/AsyncTraceTest.cpp +43 -0
- package/external/folly/folly/detail/test/BUCK +118 -0
- package/external/folly/folly/detail/test/FileUtilDetailTest.cpp +56 -0
- package/external/folly/folly/detail/test/PerfScopedTest.cpp +107 -0
- package/external/folly/folly/detail/test/SimpleSimdStringUtilsTest.cpp +92 -0
- package/external/folly/folly/detail/test/SplitStringSimdTest.cpp +242 -0
- package/external/folly/folly/detail/test/StaticSingletonManagerTest.cpp +121 -0
- package/external/folly/folly/detail/test/ThreadLocalBenchmark.cpp +116 -0
- package/external/folly/folly/detail/test/ThreadLocalDetailTest.cpp +194 -0
- package/external/folly/folly/detail/test/TrapOnAvx512TestNegative.cpp +29 -0
- package/external/folly/folly/detail/test/UniqueInstanceTest.cpp +60 -0
- package/external/folly/folly/detail/thread_local_globals.cpp +69 -0
- package/external/folly/folly/detail/thread_local_globals.h +36 -0
- package/external/folly/folly/docs/AtomicHashMap.md +134 -0
- package/external/folly/folly/docs/Benchmark.md +310 -0
- package/external/folly/folly/docs/Conv.md +291 -0
- package/external/folly/folly/docs/Dynamic.md +220 -0
- package/external/folly/folly/docs/DynamicConverter.md +71 -0
- package/external/folly/folly/docs/Executors.md +63 -0
- package/external/folly/folly/docs/FBString.md +46 -0
- package/external/folly/folly/docs/FBVector.md +200 -0
- package/external/folly/folly/docs/Fbvector--graphical_solutions.png +0 -0
- package/external/folly/folly/docs/Format.md +177 -0
- package/external/folly/folly/docs/Function.md +92 -0
- package/external/folly/folly/docs/Futures.md +263 -0
- package/external/folly/folly/docs/GroupVarint.md +46 -0
- package/external/folly/folly/docs/Histogram.md +104 -0
- package/external/folly/folly/docs/MapUtils.md +80 -0
- package/external/folly/folly/docs/Overview.md +263 -0
- package/external/folly/folly/docs/PackedSyncPtr.md +77 -0
- package/external/folly/folly/docs/Poly.md +500 -0
- package/external/folly/folly/docs/ProducerConsumerQueue.md +82 -0
- package/external/folly/folly/docs/Rcu.md +218 -0
- package/external/folly/folly/docs/SmallLocks.md +24 -0
- package/external/folly/folly/docs/Synchronized.md +793 -0
- package/external/folly/folly/docs/ThreadCachedInt.md +98 -0
- package/external/folly/folly/docs/ThreadLocal.md +105 -0
- package/external/folly/folly/docs/Traits.md +161 -0
- package/external/folly/folly/docs/small_vector.md +64 -0
- package/external/folly/folly/docs/style.css +23 -0
- package/external/folly/folly/dynamic-inl.h +17 -0
- package/external/folly/folly/dynamic.h +17 -0
- package/external/folly/folly/folly_extended_library.bzl +28 -0
- package/external/folly/folly/functional/ApplyTuple.h +204 -0
- package/external/folly/folly/functional/BUCK +57 -0
- package/external/folly/folly/functional/Invoke.h +880 -0
- package/external/folly/folly/functional/Partial.h +130 -0
- package/external/folly/folly/functional/protocol.h +203 -0
- package/external/folly/folly/functional/test/ApplyTupleTest.cpp +549 -0
- package/external/folly/folly/functional/test/BUCK +57 -0
- package/external/folly/folly/functional/test/InvokeTest.cpp +483 -0
- package/external/folly/folly/functional/test/PartialTest.cpp +141 -0
- package/external/folly/folly/functional/test/protocol_test.cpp +177 -0
- package/external/folly/folly/functional/test/traits_test.cpp +551 -0
- package/external/folly/folly/functional/traits.h +675 -0
- package/external/folly/folly/hash/BUCK +86 -0
- package/external/folly/folly/hash/Checksum.cpp +275 -0
- package/external/folly/folly/hash/Checksum.h +94 -0
- package/external/folly/folly/hash/FarmHash.h +46 -0
- package/external/folly/folly/hash/Hash.h +1045 -0
- package/external/folly/folly/hash/MurmurHash.h +86 -0
- package/external/folly/folly/hash/SpookyHashV1.cpp +391 -0
- package/external/folly/folly/hash/SpookyHashV1.h +307 -0
- package/external/folly/folly/hash/SpookyHashV2.cpp +392 -0
- package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/hash/SpookyHashV2.h +6 -1
- package/external/folly/folly/hash/detail/BUCK +26 -0
- package/external/folly/folly/hash/detail/ChecksumDetail.cpp +296 -0
- package/external/folly/folly/hash/detail/ChecksumDetail.h +137 -0
- package/external/folly/folly/hash/detail/Crc32CombineDetail.cpp +191 -0
- package/external/folly/folly/hash/detail/Crc32cDetail.cpp +303 -0
- package/external/folly/folly/hash/test/BUCK +132 -0
- package/external/folly/folly/hash/test/ChecksumBenchmark.cpp +91 -0
- package/external/folly/folly/hash/test/ChecksumTest.cpp +587 -0
- package/external/folly/folly/hash/test/FarmHashTest.cpp +41 -0
- package/external/folly/folly/hash/test/HashBenchmark.cpp +238 -0
- package/external/folly/folly/hash/test/HashTest.cpp +997 -0
- package/external/folly/folly/hash/test/MurmurHashTest.cpp +76 -0
- package/external/folly/folly/hash/test/SpookyHashV1Test.cpp +559 -0
- package/external/folly/folly/hash/test/SpookyHashV2Test.cpp +549 -0
- package/external/folly/folly/hash/test/traits_test.cpp +69 -0
- package/external/folly/folly/hash/traits.h +115 -0
- package/external/folly/folly/json/BUCK +155 -0
- package/external/folly/folly/json/DynamicConverter.h +464 -0
- package/external/folly/folly/json/DynamicParser-inl.h +316 -0
- package/external/folly/folly/json/DynamicParser.cpp +198 -0
- package/external/folly/folly/json/DynamicParser.h +394 -0
- package/external/folly/folly/json/JSONSchema.cpp +1030 -0
- package/external/folly/folly/json/JSONSchema.h +73 -0
- package/external/folly/folly/json/JsonMockUtil.h +73 -0
- package/external/folly/folly/json/JsonTestUtil.cpp +167 -0
- package/external/folly/folly/json/JsonTestUtil.h +88 -0
- package/external/folly/folly/json/bser/BUCK +24 -0
- package/external/folly/folly/json/bser/Bser.h +107 -0
- package/external/folly/folly/json/bser/Dump.cpp +253 -0
- package/external/folly/folly/json/bser/Load.cpp +246 -0
- package/external/folly/folly/json/bser/test/BUCK +14 -0
- package/external/folly/folly/json/bser/test/BserTest.cpp +149 -0
- package/external/folly/folly/json/dynamic.cpp +552 -0
- package/external/folly/folly/json/dynamic.h +1346 -0
- package/external/folly/folly/json/json.h +238 -0
- package/external/folly/folly/json/json_patch.cpp +325 -0
- package/external/folly/folly/json/json_patch.h +126 -0
- package/external/folly/folly/json/json_pointer.cpp +114 -0
- package/external/folly/folly/json/json_pointer.h +87 -0
- package/external/folly/folly/json/test/BUCK +147 -0
- package/external/folly/folly/json/test/DynamicBenchmark.cpp +146 -0
- package/external/folly/folly/json/test/DynamicConverterTest.cpp +518 -0
- package/external/folly/folly/json/test/DynamicOtherTest.cpp +344 -0
- package/external/folly/folly/json/test/DynamicParserTest.cpp +443 -0
- package/external/folly/folly/json/test/DynamicTest.cpp +1647 -0
- package/external/folly/folly/json/test/JSONSchemaTest.cpp +450 -0
- package/external/folly/folly/json/test/JsonBenchmark.cpp +264 -0
- package/external/folly/folly/json/test/JsonOtherTest.cpp +51 -0
- package/external/folly/folly/json/test/JsonTest.cpp +1153 -0
- package/external/folly/folly/json/test/JsonTestUtilTest.cpp +97 -0
- package/external/folly/folly/json/test/json_patch_test.cpp +361 -0
- package/external/folly/folly/json/test/json_pointer_test.cpp +58 -0
- package/external/folly/folly/json/tool/BUCK +13 -0
- package/external/folly/folly/json/tool/JSONSchemaTester.cpp +58 -0
- package/external/folly/folly/json.h +17 -0
- package/external/folly/folly/json_patch.h +17 -0
- package/external/folly/folly/json_pointer.h +17 -0
- package/external/folly/folly/lang/Access.h +29 -0
- package/external/folly/folly/lang/Align.h +240 -0
- package/external/folly/folly/lang/Aligned.h +92 -0
- package/external/folly/folly/lang/Assume.h +82 -0
- package/external/folly/folly/lang/BUCK +287 -0
- package/external/folly/folly/lang/Badge.h +108 -0
- package/external/folly/folly/lang/Bits.h +570 -0
- package/external/folly/folly/lang/BitsClass.h +312 -0
- package/external/folly/folly/lang/Builtin.h +74 -0
- package/external/folly/folly/lang/CArray.h +34 -0
- package/external/folly/folly/lang/CString.cpp +86 -0
- package/external/folly/folly/lang/CString.h +55 -0
- package/external/folly/folly/lang/Cast.h +51 -0
- package/external/folly/folly/lang/CheckedMath.h +253 -0
- package/external/folly/folly/lang/CustomizationPoint.h +58 -0
- package/external/folly/folly/lang/Exception.cpp +822 -0
- package/external/folly/folly/lang/Exception.h +716 -0
- package/external/folly/folly/lang/Extern.h +55 -0
- package/external/folly/folly/lang/Hint-inl.h +144 -0
- package/external/folly/folly/lang/Hint.h +238 -0
- package/external/folly/folly/lang/Keep.h +98 -0
- package/external/folly/folly/lang/New.h +124 -0
- package/external/folly/folly/lang/Ordering.h +140 -0
- package/external/folly/folly/lang/Pretty.h +159 -0
- package/external/folly/folly/lang/PropagateConst.h +413 -0
- package/external/folly/folly/lang/RValueReferenceWrapper.h +152 -0
- package/external/folly/folly/lang/SafeAssert.cpp +589 -0
- package/external/folly/folly/lang/StaticConst.h +33 -0
- package/external/folly/folly/lang/Thunk.h +100 -0
- package/external/folly/folly/lang/TypeInfo.h +58 -0
- package/external/folly/folly/lang/UncaughtExceptions.cpp +17 -0
- package/external/folly/folly/lang/UncaughtExceptions.h +19 -0
- package/external/folly/folly/lang/test/AlignTest.cpp +87 -0
- package/external/folly/folly/lang/test/AlignedTest.cpp +130 -0
- package/external/folly/folly/lang/test/BUCK +258 -0
- package/external/folly/folly/lang/test/BadgeTest.cpp +89 -0
- package/external/folly/folly/lang/test/BitsBenchmark.cpp +164 -0
- package/external/folly/folly/lang/test/BitsClassBenchmark.cpp +122 -0
- package/external/folly/folly/lang/test/BitsClassTest.cpp +379 -0
- package/external/folly/folly/lang/test/BitsTest.cpp +577 -0
- package/external/folly/folly/lang/test/CStringTest.cpp +60 -0
- package/external/folly/folly/lang/test/CastTest.cpp +47 -0
- package/external/folly/folly/lang/test/CheckedMathTest.cpp +394 -0
- package/external/folly/folly/lang/test/ExceptionBench.cpp +427 -0
- package/external/folly/folly/lang/test/ExceptionTest.cpp +413 -0
- package/external/folly/folly/lang/test/ExternTest.cpp +39 -0
- package/external/folly/folly/lang/test/HintTest.cpp +100 -0
- package/external/folly/folly/lang/test/NewTest.cpp +38 -0
- package/external/folly/folly/lang/test/OrderingTest.cpp +105 -0
- package/external/folly/folly/lang/test/PrettyTest.cpp +44 -0
- package/external/folly/folly/lang/test/PropagateConstTest.cpp +356 -0
- package/external/folly/folly/lang/test/RValueReferenceWrapperTest.cpp +85 -0
- package/external/folly/folly/lang/test/SafeAssertTest.cpp +75 -0
- package/external/folly/folly/lang/test/ThunkTest.cpp +105 -0
- package/external/folly/folly/lang/test/ToAsciiBench.cpp +466 -0
- package/external/folly/folly/lang/test/ToAsciiTest.cpp +266 -0
- package/external/folly/folly/lang/test/TypeInfoTest.cpp +56 -0
- package/external/folly/folly/memcpy.S +292 -0
- package/external/folly/folly/memcpy_select_aarch64.cpp +145 -0
- package/external/folly/folly/memory/Arena-inl.h +83 -0
- package/external/folly/folly/memory/Arena.h +325 -0
- package/external/folly/folly/memory/BUCK +191 -0
- package/external/folly/folly/memory/JemallocHugePageAllocator.cpp +449 -0
- package/external/folly/folly/memory/JemallocHugePageAllocator.h +105 -0
- package/external/folly/folly/memory/JemallocHugePageAllocatorTest.cpp +341 -0
- package/external/folly/folly/memory/JemallocNodumpAllocator.cpp +176 -0
- package/external/folly/folly/memory/JemallocNodumpAllocator.h +119 -0
- package/external/folly/folly/memory/JemallocNodumpAllocatorTest.cpp +61 -0
- package/external/folly/folly/memory/MallctlHelper.cpp +37 -0
- package/external/folly/folly/memory/MallctlHelper.h +167 -0
- package/external/folly/folly/memory/Malloc.h +551 -0
- package/external/folly/folly/memory/MemoryResource.h +57 -0
- package/external/folly/folly/memory/ReentrantAllocator.cpp +162 -0
- package/external/folly/folly/memory/ReentrantAllocator.h +261 -0
- package/external/folly/folly/memory/SanitizeAddress.cpp +75 -0
- package/external/folly/folly/memory/SanitizeAddress.h +117 -0
- package/external/folly/folly/memory/SanitizeLeak.cpp +119 -0
- package/external/folly/folly/memory/SanitizeLeak.h +108 -0
- package/external/folly/folly/memory/ThreadCachedArena.cpp +53 -0
- package/external/folly/folly/memory/ThreadCachedArena.h +90 -0
- package/external/folly/folly/memory/UninitializedMemoryHacks.h +426 -0
- package/external/folly/folly/memory/detail/BUCK +10 -0
- package/external/folly/folly/memory/detail/MallocImpl.cpp +52 -0
- package/external/folly/folly/memory/detail/MallocImpl.h +97 -0
- package/external/folly/folly/memory/not_null-inl.h +522 -0
- package/external/folly/folly/memory/not_null.h +449 -0
- package/external/folly/folly/memory/test/ArenaTest.cpp +354 -0
- package/external/folly/folly/memory/test/BUCK +146 -0
- package/external/folly/folly/memory/test/MallctlHelperTest.cpp +169 -0
- package/external/folly/folly/memory/test/MallocBenchmark.cpp +91 -0
- package/external/folly/folly/memory/test/MallocTest.cpp +78 -0
- package/external/folly/folly/memory/test/MemoryResourceTest.cpp +31 -0
- package/external/folly/folly/memory/test/ReentrantAllocatorTest.cpp +144 -0
- package/external/folly/folly/memory/test/SanitizeAddressTest.cpp +67 -0
- package/external/folly/folly/memory/test/SanitizeLeakTest.cpp +139 -0
- package/external/folly/folly/memory/test/ThreadCachedArenaTest.cpp +276 -0
- package/external/folly/folly/memory/test/UninitializedMemoryHacksODR.cpp +21 -0
- package/external/folly/folly/memory/test/UninitializedMemoryHacksTest.cpp +327 -0
- package/external/folly/folly/memory/test/not_null_test.cpp +608 -0
- package/external/folly/folly/memset.S +245 -0
- package/external/folly/folly/memset_select_aarch64.cpp +72 -0
- package/external/folly/folly/portability/Asm.h +50 -0
- package/external/folly/folly/portability/Atomic.h +31 -0
- package/external/folly/folly/portability/BUCK +456 -0
- package/external/folly/folly/portability/Builtins.cpp +31 -0
- package/external/folly/folly/portability/Builtins.h +161 -0
- package/external/folly/folly/portability/Config.h +43 -0
- package/external/folly/folly/portability/Constexpr.h +145 -0
- package/external/folly/folly/portability/Dirent.cpp +140 -0
- package/external/folly/folly/portability/Dirent.h +41 -0
- package/external/folly/folly/portability/Event.h +44 -0
- package/external/folly/folly/portability/Fcntl.cpp +120 -0
- package/external/folly/folly/portability/Fcntl.h +67 -0
- package/external/folly/folly/portability/Filesystem.cpp +67 -0
- package/external/folly/folly/portability/Filesystem.h +114 -0
- package/external/folly/folly/portability/FmtCompile.h +40 -0
- package/external/folly/folly/portability/GFlags.h +139 -0
- package/external/folly/folly/portability/GMock.h +35 -0
- package/external/folly/folly/portability/GTest.h +35 -0
- package/external/folly/folly/portability/IOVec.h +34 -0
- package/external/folly/folly/portability/Libgen.cpp +59 -0
- package/external/folly/folly/portability/Libgen.h +29 -0
- package/external/folly/folly/portability/Libunwind.h +21 -0
- package/external/folly/folly/portability/Malloc.cpp +31 -0
- package/external/folly/folly/portability/Malloc.h +53 -0
- package/external/folly/folly/portability/Math.h +90 -0
- package/external/folly/folly/portability/Memory.h +26 -0
- package/external/folly/folly/portability/OpenSSL.cpp +17 -0
- package/external/folly/folly/portability/OpenSSL.h +102 -0
- package/external/folly/folly/portability/PThread.cpp +697 -0
- package/external/folly/folly/portability/PThread.h +148 -0
- package/external/folly/folly/portability/README.md +21 -0
- package/external/folly/folly/portability/Sched.cpp +41 -0
- package/external/folly/folly/portability/Sched.h +45 -0
- package/external/folly/folly/portability/Sockets.cpp +245 -0
- package/external/folly/folly/portability/Sockets.h +155 -0
- package/external/folly/folly/portability/SourceLocation.h +49 -0
- package/external/folly/folly/portability/Stdio.cpp +77 -0
- package/external/folly/folly/portability/Stdio.h +32 -0
- package/external/folly/folly/portability/Stdlib.cpp +172 -0
- package/external/folly/folly/portability/Stdlib.h +64 -0
- package/external/folly/folly/portability/String.cpp +53 -0
- package/external/folly/folly/portability/String.h +39 -0
- package/external/folly/folly/portability/SysFile.cpp +46 -0
- package/external/folly/folly/portability/SysFile.h +27 -0
- package/external/folly/folly/portability/SysMembarrier.cpp +104 -0
- package/external/folly/folly/portability/SysMembarrier.h +26 -0
- package/external/folly/folly/portability/SysMman.cpp +242 -0
- package/external/folly/folly/portability/SysMman.h +68 -0
- package/external/folly/folly/portability/SysResource.cpp +108 -0
- package/external/folly/folly/portability/SysResource.h +71 -0
- package/external/folly/folly/portability/SysStat.cpp +66 -0
- package/external/folly/folly/portability/SysStat.h +52 -0
- package/external/folly/folly/portability/SysSyscall.h +73 -0
- package/external/folly/folly/portability/SysTime.cpp +62 -0
- package/external/folly/folly/portability/SysTime.h +50 -0
- package/external/folly/folly/portability/SysTypes.h +44 -0
- package/external/folly/folly/portability/SysUio.cpp +179 -0
- package/external/folly/folly/portability/SysUio.h +51 -0
- package/external/folly/folly/portability/Syslog.h +39 -0
- package/external/folly/folly/portability/Time.cpp +357 -0
- package/external/folly/folly/portability/Time.h +74 -0
- package/external/folly/folly/portability/Unistd.h +111 -0
- package/external/folly/folly/portability/Windows.h +108 -0
- package/external/folly/folly/portability/openat2.c +30 -0
- package/external/folly/folly/portability/openat2.h +39 -0
- package/external/folly/folly/portability/test/BUCK +59 -0
- package/external/folly/folly/portability/test/ConstexprTest.cpp +102 -0
- package/external/folly/folly/portability/test/FilesystemTest.cpp +35 -0
- package/external/folly/folly/portability/test/LibgenTest.cpp +35 -0
- package/external/folly/folly/portability/test/OpenSSLPortabilityTest.cpp +108 -0
- package/external/folly/folly/portability/test/PThreadTest.cpp +80 -0
- package/external/folly/folly/portability/test/TimeTest.cpp +90 -0
- package/external/folly/folly/small_vector.h +17 -0
- package/external/folly/folly/somerge_defs.bzl +399 -0
- package/external/folly/folly/sorted_vector_types.h +17 -0
- package/external/folly/folly/stop_watch.h +317 -0
- package/external/folly/folly/synchronization/AsymmetricThreadFence.cpp +91 -0
- package/external/folly/folly/synchronization/AsymmetricThreadFence.h +60 -0
- package/external/folly/folly/synchronization/AtomicNotification-inl.h +146 -0
- package/external/folly/folly/synchronization/AtomicNotification.cpp +34 -0
- package/external/folly/folly/synchronization/AtomicNotification.h +117 -0
- package/external/folly/folly/synchronization/AtomicRef.h +181 -0
- package/external/folly/folly/synchronization/AtomicStruct.h +150 -0
- package/external/folly/folly/synchronization/AtomicUtil-inl.h +482 -0
- package/external/folly/folly/synchronization/AtomicUtil.h +179 -0
- package/external/folly/folly/synchronization/BUCK +418 -0
- package/external/folly/folly/synchronization/Baton.h +419 -0
- package/external/folly/folly/synchronization/CallOnce.h +263 -0
- package/external/folly/folly/synchronization/DelayedInit.h +179 -0
- package/external/folly/folly/synchronization/DistributedMutex-inl.h +1744 -0
- package/external/folly/folly/synchronization/DistributedMutex.cpp +27 -0
- package/external/folly/folly/synchronization/DistributedMutex.h +342 -0
- package/external/folly/folly/synchronization/EventCount.h +200 -0
- package/external/folly/folly/synchronization/FlatCombining.h +629 -0
- package/external/folly/folly/synchronization/Hazptr-fwd.h +217 -0
- package/external/folly/folly/synchronization/Hazptr.cpp +36 -0
- package/external/folly/folly/synchronization/Hazptr.h +209 -0
- package/external/folly/folly/synchronization/HazptrDomain.cpp +68 -0
- package/external/folly/folly/synchronization/HazptrDomain.h +832 -0
- package/external/folly/folly/synchronization/HazptrHolder.h +431 -0
- package/external/folly/folly/synchronization/HazptrObj.h +533 -0
- package/external/folly/folly/synchronization/HazptrObjLinked.h +315 -0
- package/external/folly/folly/synchronization/HazptrRec.h +68 -0
- package/external/folly/folly/synchronization/HazptrThrLocal.h +180 -0
- package/external/folly/folly/synchronization/HazptrThreadPoolExecutor.cpp +46 -0
- package/external/folly/folly/synchronization/HazptrThreadPoolExecutor.h +25 -0
- package/external/folly/folly/synchronization/Latch.h +160 -0
- package/external/folly/folly/synchronization/LifoSem.h +767 -0
- package/external/folly/folly/synchronization/Lock.h +887 -0
- package/external/folly/folly/synchronization/MicroSpinLock.h +154 -0
- package/external/folly/folly/synchronization/NativeSemaphore.h +187 -0
- package/external/folly/folly/synchronization/ParkingLot.cpp +37 -0
- package/external/folly/folly/synchronization/ParkingLot.h +330 -0
- package/external/folly/folly/synchronization/PicoSpinLock.h +167 -0
- package/external/folly/folly/synchronization/RWSpinLock.h +549 -0
- package/external/folly/folly/synchronization/Rcu.cpp +26 -0
- package/external/folly/folly/synchronization/Rcu.h +553 -0
- package/external/folly/folly/synchronization/RelaxedAtomic.h +336 -0
- package/external/folly/folly/synchronization/SanitizeThread.cpp +141 -0
- package/external/folly/folly/synchronization/SanitizeThread.h +166 -0
- package/external/folly/folly/synchronization/SaturatingSemaphore.h +324 -0
- package/external/folly/folly/synchronization/SmallLocks.h +36 -0
- package/external/folly/folly/synchronization/ThrottledLifoSem.h +362 -0
- package/external/folly/folly/synchronization/WaitOptions.cpp +25 -0
- package/external/folly/folly/synchronization/WaitOptions.h +75 -0
- package/external/folly/folly/synchronization/detail/AtomicUtils.h +59 -0
- package/external/folly/folly/synchronization/detail/BUCK +104 -0
- package/external/folly/folly/synchronization/detail/Hardware.cpp +192 -0
- package/external/folly/folly/synchronization/detail/Hardware.h +75 -0
- package/external/folly/folly/synchronization/detail/HazptrUtils.h +339 -0
- package/external/folly/folly/synchronization/detail/InlineFunctionRef.h +229 -0
- package/external/folly/folly/synchronization/detail/Sleeper.cpp +27 -0
- package/external/folly/folly/synchronization/detail/Sleeper.h +62 -0
- package/external/folly/folly/synchronization/detail/Spin.h +96 -0
- package/external/folly/folly/synchronization/detail/ThreadCachedLists.h +174 -0
- package/external/folly/folly/synchronization/detail/ThreadCachedReaders.h +189 -0
- package/external/folly/folly/synchronization/detail/ThreadCachedTag.h +26 -0
- package/external/folly/folly/synchronization/detail/test/BUCK +28 -0
- package/external/folly/folly/synchronization/detail/test/HardwareTest.cpp +74 -0
- package/external/folly/folly/synchronization/detail/test/InlineFunctionRefTest.cpp +286 -0
- package/external/folly/folly/synchronization/example/BUCK +27 -0
- package/external/folly/folly/synchronization/example/HazptrLockFreeLIFO.h +88 -0
- package/external/folly/folly/synchronization/example/HazptrSWMRSet.h +133 -0
- package/external/folly/folly/synchronization/example/HazptrWideCAS.h +62 -0
- package/external/folly/folly/synchronization/test/AtomicNotificationTest.cpp +236 -0
- package/external/folly/folly/synchronization/test/AtomicRefTest.cpp +170 -0
- package/external/folly/folly/synchronization/test/AtomicStructTest.cpp +65 -0
- package/external/folly/folly/synchronization/test/AtomicUtilBench.cpp +457 -0
- package/external/folly/folly/synchronization/test/AtomicUtilTest.cpp +650 -0
- package/external/folly/folly/synchronization/test/BUCK +495 -0
- package/external/folly/folly/synchronization/test/Barrier.h +52 -0
- package/external/folly/folly/synchronization/test/BarrierTest.cpp +56 -0
- package/external/folly/folly/synchronization/test/BatonBenchmark.cpp +77 -0
- package/external/folly/folly/synchronization/test/BatonTest.cpp +164 -0
- package/external/folly/folly/synchronization/test/BatonTestHelpers.h +118 -0
- package/external/folly/folly/synchronization/test/CallOnceBenchmark.cpp +72 -0
- package/external/folly/folly/synchronization/test/CallOnceTest.cpp +153 -0
- package/external/folly/folly/synchronization/test/DelayedInitTest.cpp +281 -0
- package/external/folly/folly/synchronization/test/DistributedMutexTest.cpp +2074 -0
- package/external/folly/folly/synchronization/test/EventCountTest.cpp +124 -0
- package/external/folly/folly/synchronization/test/FlatCombiningBenchmark.cpp +1789 -0
- package/external/folly/folly/synchronization/test/FlatCombiningExamples.h +222 -0
- package/external/folly/folly/synchronization/test/FlatCombiningTest.cpp +121 -0
- package/external/folly/folly/synchronization/test/FlatCombiningTestHelpers.h +227 -0
- package/external/folly/folly/synchronization/test/HazptrTest.cpp +1689 -0
- package/external/folly/folly/synchronization/test/LatchTest.cpp +224 -0
- package/external/folly/folly/synchronization/test/LifoSemBench.cpp +185 -0
- package/external/folly/folly/synchronization/test/LifoSemTests.cpp +353 -0
- package/external/folly/folly/synchronization/test/LockTest.cpp +1239 -0
- package/external/folly/folly/synchronization/test/NativeSemaphoreTest.cpp +37 -0
- package/external/folly/folly/synchronization/test/ParkingLotBenchmark.cpp +239 -0
- package/external/folly/folly/synchronization/test/ParkingLotTest.cpp +170 -0
- package/external/folly/folly/synchronization/test/RWSpinLockTest.cpp +235 -0
- package/external/folly/folly/synchronization/test/RcuBench.cpp +66 -0
- package/external/folly/folly/synchronization/test/RcuTest.cpp +330 -0
- package/external/folly/folly/synchronization/test/RelaxedAtomicTest.cpp +389 -0
- package/external/folly/folly/synchronization/test/SaturatingSemaphoreTest.cpp +166 -0
- package/external/folly/folly/synchronization/test/Semaphore.h +242 -0
- package/external/folly/folly/synchronization/test/SemaphoreTest.cpp +271 -0
- package/external/folly/folly/synchronization/test/SmallLocksBenchmark.cpp +1296 -0
- package/external/folly/folly/synchronization/test/SmallLocksTest.cpp +510 -0
- package/external/folly/folly/synchronization/test/ThreadCachedEpochBench.h +67 -0
- package/external/folly/folly/synchronization/test/ThreadCachedReadersBench.cpp +42 -0
- package/external/folly/folly/synchronization/test/ThreadCachedReadersTest.cpp +52 -0
- package/external/folly/folly/synchronization/test/ThrottledLifoSemTest.cpp +243 -0
- package/external/folly/folly/system/AtFork.cpp +205 -0
- package/external/folly/folly/system/AtFork.h +116 -0
- package/external/folly/folly/system/AuxVector.h +198 -0
- package/external/folly/folly/system/BUCK +144 -0
- package/external/folly/folly/system/EnvUtil.cpp +93 -0
- package/external/folly/folly/system/EnvUtil.h +113 -0
- package/external/folly/folly/system/HardwareConcurrency.cpp +39 -0
- package/external/folly/folly/system/HardwareConcurrency.h +23 -0
- package/external/folly/folly/system/MemoryMapping.cpp +477 -0
- package/external/folly/folly/system/MemoryMapping.h +287 -0
- package/external/folly/folly/system/Pid.cpp +87 -0
- package/external/folly/folly/system/Pid.h +34 -0
- package/external/folly/folly/system/Shell.cpp +33 -0
- package/external/folly/folly/system/Shell.h +93 -0
- package/external/folly/folly/system/ThreadId.cpp +89 -0
- package/external/folly/folly/system/ThreadId.h +62 -0
- package/external/folly/folly/system/ThreadName.cpp +330 -0
- package/external/folly/folly/system/ThreadName.h +72 -0
- package/external/folly/folly/system/test/AtForkTest.cpp +309 -0
- package/external/folly/folly/system/test/AuxVectorTest.cpp +55 -0
- package/external/folly/folly/system/test/BUCK +120 -0
- package/external/folly/folly/system/test/EnvUtilSubprocess.cpp +26 -0
- package/external/folly/folly/system/test/EnvUtilTest.cpp +197 -0
- package/external/folly/folly/system/test/MemoryMappingTest.cpp +179 -0
- package/external/folly/folly/system/test/PidTest.cpp +46 -0
- package/external/folly/folly/system/test/ShellTest.cpp +66 -0
- package/external/folly/folly/system/test/ThreadIdTest.cpp +114 -0
- package/external/folly/folly/system/test/ThreadNameTest.cpp +85 -0
- package/external/folly/folly.vcxitems +164 -0
- package/external/folly/static/logo.svg +1 -0
- package/external/folly/sync-config.json +8 -0
- package/package.json +3 -3
- package/template/cpp-app/proj/MyApp.sln +0 -33
- package/template/cpp-lib/proj/MyLib.sln +0 -33
- package/template/cs-app/proj/MyApp.sln +0 -33
- package/template/cs-lib/proj/MyLib.sln +0 -33
- package/templates/cpp-app/windows/MyApp.sln +0 -33
- package/templates/cpp-lib/example/metro.config.js +31 -6
- package/templates/cpp-lib/windows/MyLib.sln +0 -33
- package/Folly/Folly.vcxproj +0 -383
- package/Folly/Folly.vcxproj.filters +0 -558
- package/Folly/Folly.win32.vcxproj +0 -11
- package/Folly/packages.lock.win32.json +0 -20
- package/Scripts/Warm-RnwFeedCache.ps1 +0 -413
- package/fmt/fmt.vcxproj +0 -163
- package/fmt/fmt.vcxproj.filters +0 -59
- package/fmt/fmt.win32.vcxproj +0 -10
- package/fmt/pch.cpp +0 -4
- package/fmt/pch.h +0 -2
- /package/{Folly → external/folly}/Folly.natvis +0 -0
- /package/{Folly → external/folly}/cgmanifest.json +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/ConstexprMath.h +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/Conv.cpp +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/chrono/Hardware.h +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/concurrency/CacheLocality.cpp +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/json/dynamic-inl.h +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/json/json.cpp +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/lang/SafeAssert.h +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/lang/ToAscii.cpp +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/lang/ToAscii.h +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/portability/Unistd.cpp +0 -0
|
@@ -0,0 +1,891 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
//
|
|
18
|
+
// Docs: https://fburl.com/fbcref_singleton
|
|
19
|
+
//
|
|
20
|
+
|
|
21
|
+
// SingletonVault - a library to manage the creation and destruction
|
|
22
|
+
// of interdependent singletons.
|
|
23
|
+
//
|
|
24
|
+
// Recommended usage of this class: suppose you have a class
|
|
25
|
+
// called MyExpensiveService, and you only want to construct one (ie,
|
|
26
|
+
// it's a singleton), but you only want to construct it if it is used.
|
|
27
|
+
//
|
|
28
|
+
// In your .h file:
|
|
29
|
+
// class MyExpensiveService {
|
|
30
|
+
// // Caution - may return a null ptr during startup and shutdown.
|
|
31
|
+
// static std::shared_ptr<MyExpensiveService> getInstance();
|
|
32
|
+
// ....
|
|
33
|
+
// };
|
|
34
|
+
//
|
|
35
|
+
// In your .cpp file:
|
|
36
|
+
// namespace { struct PrivateTag {}; }
|
|
37
|
+
// static folly::Singleton<MyExpensiveService, PrivateTag> the_singleton;
|
|
38
|
+
// std::shared_ptr<MyExpensiveService> MyExpensiveService::getInstance() {
|
|
39
|
+
// return the_singleton.try_get();
|
|
40
|
+
// }
|
|
41
|
+
//
|
|
42
|
+
// Code in other modules can access it via:
|
|
43
|
+
//
|
|
44
|
+
// auto instance = MyExpensiveService::getInstance();
|
|
45
|
+
//
|
|
46
|
+
// Advanced usage and notes:
|
|
47
|
+
//
|
|
48
|
+
// You can also access a singleton instance with
|
|
49
|
+
// `Singleton<ObjectType, TagType>::try_get()`. We recommend
|
|
50
|
+
// that you prefer the form `the_singleton.try_get()` because it ensures that
|
|
51
|
+
// `the_singleton` is used and cannot be garbage-collected during linking: this
|
|
52
|
+
// is necessary because the constructor of `the_singleton` is what registers it
|
|
53
|
+
// to the SingletonVault.
|
|
54
|
+
//
|
|
55
|
+
// The singleton will be created on demand. If the constructor for
|
|
56
|
+
// MyExpensiveService actually makes use of *another* Singleton, then
|
|
57
|
+
// the right thing will happen -- that other singleton will complete
|
|
58
|
+
// construction before get() returns. However, in the event of a
|
|
59
|
+
// circular dependency, a runtime error will occur.
|
|
60
|
+
//
|
|
61
|
+
// You can have multiple singletons of the same underlying type, but
|
|
62
|
+
// each must be given a unique tag. If no tag is specified a default tag is
|
|
63
|
+
// used. We recommend that you use a tag from an anonymous namespace private to
|
|
64
|
+
// your implementation file, as this ensures that the singleton is only
|
|
65
|
+
// available via your interface and not also through Singleton<T>::try_get()
|
|
66
|
+
//
|
|
67
|
+
// namespace {
|
|
68
|
+
// struct Tag1 {};
|
|
69
|
+
// struct Tag2 {};
|
|
70
|
+
// folly::Singleton<MyExpensiveService> s_default;
|
|
71
|
+
// folly::Singleton<MyExpensiveService, Tag1> s1;
|
|
72
|
+
// folly::Singleton<MyExpensiveService, Tag2> s2;
|
|
73
|
+
// }
|
|
74
|
+
// ...
|
|
75
|
+
// MyExpensiveService* svc_default = s_default.get();
|
|
76
|
+
// MyExpensiveService* svc1 = s1.get();
|
|
77
|
+
// MyExpensiveService* svc2 = s2.get();
|
|
78
|
+
//
|
|
79
|
+
// By default, the singleton instance is constructed via new and
|
|
80
|
+
// deleted via delete, but this is configurable:
|
|
81
|
+
//
|
|
82
|
+
// namespace { folly::Singleton<MyExpensiveService> the_singleton(create,
|
|
83
|
+
// destroy); }
|
|
84
|
+
//
|
|
85
|
+
// Where create and destroy are functions, Singleton<T>::CreateFunc
|
|
86
|
+
// Singleton<T>::TeardownFunc.
|
|
87
|
+
//
|
|
88
|
+
// For example, if you need to pass arguments to your class's constructor:
|
|
89
|
+
// class X {
|
|
90
|
+
// public:
|
|
91
|
+
// X(int a1, std::string a2);
|
|
92
|
+
// // ...
|
|
93
|
+
// }
|
|
94
|
+
// Make your singleton like this:
|
|
95
|
+
// folly::Singleton<X> singleton_x([]() { return new X(42, "foo"); });
|
|
96
|
+
//
|
|
97
|
+
// The above examples detail a situation where an expensive singleton is loaded
|
|
98
|
+
// on-demand (thus only if needed). However if there is an expensive singleton
|
|
99
|
+
// that will likely be needed, and initialization takes a potentially long time,
|
|
100
|
+
// e.g. while initializing, parsing some files, talking to remote services,
|
|
101
|
+
// making uses of other singletons, and so on, the initialization of those can
|
|
102
|
+
// be scheduled up front, or "eagerly".
|
|
103
|
+
//
|
|
104
|
+
// In that case the singleton can be declared this way:
|
|
105
|
+
//
|
|
106
|
+
// namespace {
|
|
107
|
+
// auto the_singleton =
|
|
108
|
+
// folly::Singleton<MyExpensiveService>(/* optional create, destroy args */)
|
|
109
|
+
// .shouldEagerInit();
|
|
110
|
+
// }
|
|
111
|
+
//
|
|
112
|
+
// This way the singleton's instance is built at program initialization,
|
|
113
|
+
// if the program opted-in to that feature by calling "doEagerInit" or
|
|
114
|
+
// "doEagerInitVia" during its startup.
|
|
115
|
+
//
|
|
116
|
+
// What if you need to destroy all of your singletons? Say, some of
|
|
117
|
+
// your singletons manage threads, but you need to fork? Or your unit
|
|
118
|
+
// test wants to clean up all global state? Then you can call
|
|
119
|
+
// SingletonVault::singleton()->destroyInstances(), which invokes the
|
|
120
|
+
// TeardownFunc for each singleton, in the reverse order they were
|
|
121
|
+
// created. It is your responsibility to ensure your singletons can
|
|
122
|
+
// handle cases where the singletons they depend on go away, however.
|
|
123
|
+
// Singletons won't be recreated after destroyInstances call. If you
|
|
124
|
+
// want to re-enable singleton creation (say after fork was called) you
|
|
125
|
+
// should call reenableInstances.
|
|
126
|
+
|
|
127
|
+
#pragma once
|
|
128
|
+
|
|
129
|
+
#include <folly/CancellationToken.h>
|
|
130
|
+
#include <folly/Exception.h>
|
|
131
|
+
#include <folly/Executor.h>
|
|
132
|
+
#include <folly/Memory.h>
|
|
133
|
+
#include <folly/Synchronized.h>
|
|
134
|
+
#include <folly/concurrency/CoreCachedSharedPtr.h>
|
|
135
|
+
#include <folly/concurrency/memory/ReadMostlySharedPtr.h>
|
|
136
|
+
#include <folly/detail/Singleton.h>
|
|
137
|
+
#include <folly/detail/StaticSingletonManager.h>
|
|
138
|
+
#include <folly/hash/Hash.h>
|
|
139
|
+
#include <folly/lang/Exception.h>
|
|
140
|
+
#include <folly/memory/SanitizeLeak.h>
|
|
141
|
+
#include <folly/synchronization/Baton.h>
|
|
142
|
+
|
|
143
|
+
#include <algorithm>
|
|
144
|
+
#include <atomic>
|
|
145
|
+
#include <condition_variable>
|
|
146
|
+
#include <functional>
|
|
147
|
+
#include <list>
|
|
148
|
+
#include <memory>
|
|
149
|
+
#include <mutex>
|
|
150
|
+
#include <string>
|
|
151
|
+
#include <thread>
|
|
152
|
+
#include <typeindex>
|
|
153
|
+
#include <typeinfo>
|
|
154
|
+
#include <unordered_map>
|
|
155
|
+
#include <unordered_set>
|
|
156
|
+
#include <vector>
|
|
157
|
+
|
|
158
|
+
#include <glog/logging.h>
|
|
159
|
+
|
|
160
|
+
namespace folly {
|
|
161
|
+
|
|
162
|
+
// For actual usage, please see the Singleton<T> class at the bottom
|
|
163
|
+
// of this file; that is what you will actually interact with.
|
|
164
|
+
|
|
165
|
+
// SingletonVault is the class that manages singleton instances. It
|
|
166
|
+
// is unaware of the underlying types of singletons, and simply
|
|
167
|
+
// manages lifecycles and invokes CreateFunc and TeardownFunc when
|
|
168
|
+
// appropriate. In general, you won't need to interact with the
|
|
169
|
+
// SingletonVault itself.
|
|
170
|
+
//
|
|
171
|
+
// A vault goes through a few stages of life:
|
|
172
|
+
//
|
|
173
|
+
// 1. Registration phase; singletons can be registered:
|
|
174
|
+
// a) Strict: no singleton can be created in this stage.
|
|
175
|
+
// b) Relaxed: singleton can be created (the default vault is Relaxed).
|
|
176
|
+
// 2. registrationComplete() has been called; singletons can no
|
|
177
|
+
// longer be registered, but they can be created.
|
|
178
|
+
// 3. A vault can return to stage 1 when destroyInstances is called.
|
|
179
|
+
//
|
|
180
|
+
// In general, you don't need to worry about any of the above; just
|
|
181
|
+
// ensure registrationComplete() is called near the top of your main()
|
|
182
|
+
// function, otherwise no singletons can be instantiated.
|
|
183
|
+
|
|
184
|
+
class SingletonVault;
|
|
185
|
+
|
|
186
|
+
namespace detail {
|
|
187
|
+
|
|
188
|
+
// A TypeDescriptor is the unique handle for a given singleton. It is
|
|
189
|
+
// a combination of the type and of the optional name, and is used as
|
|
190
|
+
// a key in unordered_maps.
|
|
191
|
+
class TypeDescriptor {
|
|
192
|
+
public:
|
|
193
|
+
TypeDescriptor(const std::type_info& ti, const std::type_info& tag_ti)
|
|
194
|
+
: ti_(ti), tag_ti_(tag_ti) {}
|
|
195
|
+
|
|
196
|
+
TypeDescriptor(const TypeDescriptor& other)
|
|
197
|
+
: ti_(other.ti_), tag_ti_(other.tag_ti_) {}
|
|
198
|
+
|
|
199
|
+
TypeDescriptor& operator=(const TypeDescriptor& other) {
|
|
200
|
+
if (this != &other) {
|
|
201
|
+
ti_ = other.ti_;
|
|
202
|
+
tag_ti_ = other.tag_ti_;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
return *this;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
std::string name() const;
|
|
209
|
+
|
|
210
|
+
friend class TypeDescriptorHasher;
|
|
211
|
+
|
|
212
|
+
bool operator==(const TypeDescriptor& other) const {
|
|
213
|
+
return ti_ == other.ti_ && tag_ti_ == other.tag_ti_;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
private:
|
|
217
|
+
std::type_index ti_;
|
|
218
|
+
std::type_index tag_ti_;
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
class TypeDescriptorHasher {
|
|
222
|
+
public:
|
|
223
|
+
size_t operator()(const TypeDescriptor& ti) const {
|
|
224
|
+
return folly::hash::hash_combine(ti.ti_, ti.tag_ti_);
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
[[noreturn]] void singletonWarnLeakyDoubleRegistrationAndAbort(
|
|
229
|
+
const TypeDescriptor& type);
|
|
230
|
+
|
|
231
|
+
[[noreturn]] void singletonWarnLeakyInstantiatingNotRegisteredAndAbort(
|
|
232
|
+
const TypeDescriptor& type);
|
|
233
|
+
|
|
234
|
+
[[noreturn]] void singletonWarnRegisterMockEarlyAndAbort(
|
|
235
|
+
const TypeDescriptor& type);
|
|
236
|
+
|
|
237
|
+
void singletonWarnDestroyInstanceLeak(
|
|
238
|
+
const TypeDescriptor& type, const void* ptr);
|
|
239
|
+
|
|
240
|
+
[[noreturn]] void singletonWarnCreateCircularDependencyAndAbort(
|
|
241
|
+
const TypeDescriptor& type);
|
|
242
|
+
|
|
243
|
+
[[noreturn]] void singletonWarnCreateUnregisteredAndAbort(
|
|
244
|
+
const TypeDescriptor& type);
|
|
245
|
+
|
|
246
|
+
[[noreturn]] void singletonWarnCreateBeforeRegistrationCompleteAndAbort(
|
|
247
|
+
const TypeDescriptor& type);
|
|
248
|
+
|
|
249
|
+
void singletonPrintDestructionStackTrace(const TypeDescriptor& type);
|
|
250
|
+
|
|
251
|
+
[[noreturn]] void singletonThrowNullCreator(const std::type_info& type);
|
|
252
|
+
|
|
253
|
+
[[noreturn]] void singletonThrowGetInvokedAfterDestruction(
|
|
254
|
+
const TypeDescriptor& type);
|
|
255
|
+
|
|
256
|
+
struct SingletonVaultState {
|
|
257
|
+
// The two stages of life for a vault, as mentioned in the class comment.
|
|
258
|
+
enum class Type {
|
|
259
|
+
Running,
|
|
260
|
+
Quiescing,
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
Type state{Type::Running};
|
|
264
|
+
bool registrationComplete{false};
|
|
265
|
+
|
|
266
|
+
// Each singleton in the vault can be in two states: dead
|
|
267
|
+
// (registered but never created), living (CreateFunc returned an instance).
|
|
268
|
+
|
|
269
|
+
void check(
|
|
270
|
+
Type expected,
|
|
271
|
+
const char* msg = "Unexpected singleton state change") const {
|
|
272
|
+
if (expected != state) {
|
|
273
|
+
throw_exception<std::logic_error>(msg);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
bool isDisabled() const { return state == Type::Quiescing; }
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
// This interface is used by SingletonVault to interact with SingletonHolders.
|
|
281
|
+
// Having a non-template interface allows SingletonVault to keep a list of all
|
|
282
|
+
// SingletonHolders.
|
|
283
|
+
class SingletonHolderBase {
|
|
284
|
+
public:
|
|
285
|
+
explicit SingletonHolderBase(TypeDescriptor typeDesc) noexcept
|
|
286
|
+
: type_(typeDesc) {}
|
|
287
|
+
virtual ~SingletonHolderBase() = default;
|
|
288
|
+
|
|
289
|
+
TypeDescriptor type() const { return type_; }
|
|
290
|
+
virtual bool hasLiveInstance() = 0;
|
|
291
|
+
virtual void createInstance() = 0;
|
|
292
|
+
virtual bool creationStarted() = 0;
|
|
293
|
+
virtual void preDestroyInstance(ReadMostlyMainPtrDeleter<>&) = 0;
|
|
294
|
+
virtual void destroyInstance() = 0;
|
|
295
|
+
virtual void inChildAfterFork() = 0;
|
|
296
|
+
|
|
297
|
+
private:
|
|
298
|
+
TypeDescriptor type_;
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
// An actual instance of a singleton, tracking the instance itself,
|
|
302
|
+
// its state as described above, and the create and teardown
|
|
303
|
+
// functions.
|
|
304
|
+
template <typename T>
|
|
305
|
+
struct SingletonHolder : public SingletonHolderBase {
|
|
306
|
+
public:
|
|
307
|
+
typedef std::function<void(T*)> TeardownFunc;
|
|
308
|
+
typedef std::function<T*(void)> CreateFunc;
|
|
309
|
+
|
|
310
|
+
template <typename Tag, typename VaultTag>
|
|
311
|
+
inline static SingletonHolder<T>& singleton();
|
|
312
|
+
|
|
313
|
+
inline T* get();
|
|
314
|
+
inline std::weak_ptr<T> get_weak();
|
|
315
|
+
inline std::shared_ptr<T> try_get();
|
|
316
|
+
inline folly::ReadMostlySharedPtr<T> try_get_fast();
|
|
317
|
+
template <typename Func>
|
|
318
|
+
inline invoke_result_t<Func, T*> apply(Func f);
|
|
319
|
+
inline void vivify();
|
|
320
|
+
|
|
321
|
+
void registerSingleton(CreateFunc c, TeardownFunc t);
|
|
322
|
+
void registerSingletonMock(CreateFunc c, TeardownFunc t);
|
|
323
|
+
bool hasLiveInstance() override;
|
|
324
|
+
void createInstance() override;
|
|
325
|
+
bool creationStarted() override;
|
|
326
|
+
void preDestroyInstance(ReadMostlyMainPtrDeleter<>&) override;
|
|
327
|
+
void destroyInstance() override;
|
|
328
|
+
void inChildAfterFork() override;
|
|
329
|
+
|
|
330
|
+
private:
|
|
331
|
+
template <typename Tag, typename VaultTag>
|
|
332
|
+
struct Impl;
|
|
333
|
+
|
|
334
|
+
SingletonHolder(TypeDescriptor type, SingletonVault& vault) noexcept;
|
|
335
|
+
|
|
336
|
+
enum class SingletonHolderState {
|
|
337
|
+
NotRegistered,
|
|
338
|
+
Dead,
|
|
339
|
+
Living,
|
|
340
|
+
LivingInChildAfterFork,
|
|
341
|
+
};
|
|
342
|
+
|
|
343
|
+
SingletonVault& vault_;
|
|
344
|
+
|
|
345
|
+
// mutex protects the entire entry during construction/destruction
|
|
346
|
+
std::mutex mutex_;
|
|
347
|
+
|
|
348
|
+
// State of the singleton entry. If state is Living, instance_ptr and
|
|
349
|
+
// instance_weak can be safely accessed w/o synchronization.
|
|
350
|
+
std::atomic<SingletonHolderState> state_{SingletonHolderState::NotRegistered};
|
|
351
|
+
|
|
352
|
+
// the thread creating the singleton (only valid while creating an object)
|
|
353
|
+
std::atomic<std::thread::id> creating_thread_{};
|
|
354
|
+
|
|
355
|
+
// The singleton itself and related functions.
|
|
356
|
+
|
|
357
|
+
// holds a ReadMostlyMainPtr to singleton instance, set when state is changed
|
|
358
|
+
// from Dead to Living. Reset when state is changed from Living to Dead.
|
|
359
|
+
folly::ReadMostlyMainPtr<T> instance_;
|
|
360
|
+
// used to release all ReadMostlyMainPtrs at once
|
|
361
|
+
folly::ReadMostlySharedPtr<T> instance_copy_;
|
|
362
|
+
// per-core shared_ptrs that in turn hold the instance shared_ptr, to avoid
|
|
363
|
+
// contention in acquiring them.
|
|
364
|
+
folly::CoreCachedSharedPtr<T> instance_core_cached_;
|
|
365
|
+
// weak references to the previous pointers. These are never written to after
|
|
366
|
+
// initialization, so they're safe to read without synchronization once the
|
|
367
|
+
// state has transitioned to Living.
|
|
368
|
+
// instance_weak_ is a reference to the main instance, so it is authoritative
|
|
369
|
+
// on whether the instance is expired.
|
|
370
|
+
std::weak_ptr<T> instance_weak_;
|
|
371
|
+
folly::ReadMostlyWeakPtr<T> instance_weak_fast_;
|
|
372
|
+
folly::CoreCachedWeakPtr<T> instance_weak_core_cached_;
|
|
373
|
+
|
|
374
|
+
// Time we wait on destroy_baton after releasing Singleton shared_ptr.
|
|
375
|
+
std::shared_ptr<folly::Baton<>> destroy_baton_;
|
|
376
|
+
T* instance_ptr_ = nullptr;
|
|
377
|
+
CreateFunc create_ = nullptr;
|
|
378
|
+
TeardownFunc teardown_ = nullptr;
|
|
379
|
+
|
|
380
|
+
std::shared_ptr<std::atomic<bool>> print_destructor_stack_trace_;
|
|
381
|
+
|
|
382
|
+
SingletonHolder(const SingletonHolder&) = delete;
|
|
383
|
+
SingletonHolder& operator=(const SingletonHolder&) = delete;
|
|
384
|
+
SingletonHolder& operator=(SingletonHolder&&) = delete;
|
|
385
|
+
SingletonHolder(SingletonHolder&&) = delete;
|
|
386
|
+
};
|
|
387
|
+
|
|
388
|
+
} // namespace detail
|
|
389
|
+
|
|
390
|
+
class SingletonVault {
|
|
391
|
+
public:
|
|
392
|
+
enum class Type {
|
|
393
|
+
Strict, // Singletons can't be created before registrationComplete()
|
|
394
|
+
Relaxed, // Singletons can be created before registrationComplete()
|
|
395
|
+
};
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* Clears all singletons in the given vault at ctor and dtor times.
|
|
399
|
+
* Useful for unit-tests that need to clear the world.
|
|
400
|
+
*
|
|
401
|
+
* This need can arise when a unit-test needs to swap out an object used by a
|
|
402
|
+
* singleton for a test-double, but the singleton needing its dependency to be
|
|
403
|
+
* swapped has a type or a tag local to some other translation unit and
|
|
404
|
+
* unavailable in the current translation unit.
|
|
405
|
+
*
|
|
406
|
+
* Other, better approaches to this need are "plz 2 refactor" ....
|
|
407
|
+
*/
|
|
408
|
+
struct ScopedExpunger {
|
|
409
|
+
SingletonVault* vault;
|
|
410
|
+
explicit ScopedExpunger(SingletonVault* v) : vault(v) { expunge(); }
|
|
411
|
+
~ScopedExpunger() { expunge(); }
|
|
412
|
+
void expunge() {
|
|
413
|
+
vault->destroyInstances();
|
|
414
|
+
vault->reenableInstances();
|
|
415
|
+
}
|
|
416
|
+
};
|
|
417
|
+
|
|
418
|
+
static Type defaultVaultType();
|
|
419
|
+
|
|
420
|
+
explicit SingletonVault(Type type = defaultVaultType()) noexcept;
|
|
421
|
+
|
|
422
|
+
// Destructor is only called by unit tests to check destroyInstances.
|
|
423
|
+
~SingletonVault();
|
|
424
|
+
|
|
425
|
+
typedef std::function<void(void*)> TeardownFunc;
|
|
426
|
+
typedef std::function<void*(void)> CreateFunc;
|
|
427
|
+
|
|
428
|
+
// Ensure that Singleton has not been registered previously and that
|
|
429
|
+
// registration is not complete. If validations succeeds,
|
|
430
|
+
// register a singleton of a given type with the create and teardown
|
|
431
|
+
// functions.
|
|
432
|
+
void registerSingleton(detail::SingletonHolderBase* entry);
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* Called by `Singleton<T>.shouldEagerInit()` to ensure the instance
|
|
436
|
+
* is built when `doEagerInit[Via]` is called; see those methods
|
|
437
|
+
* for more info.
|
|
438
|
+
*/
|
|
439
|
+
void addEagerInitSingleton(detail::SingletonHolderBase* entry);
|
|
440
|
+
|
|
441
|
+
void addEagerInitOnReenableSingleton(detail::SingletonHolderBase* entry);
|
|
442
|
+
|
|
443
|
+
// Mark registration is complete; no more singletons can be
|
|
444
|
+
// registered at this point.
|
|
445
|
+
void registrationComplete();
|
|
446
|
+
|
|
447
|
+
/**
|
|
448
|
+
* Initialize all singletons which were marked as eager-initialized
|
|
449
|
+
* (using `shouldEagerInit()`). No return value. Propagates exceptions
|
|
450
|
+
* from constructors / create functions, as is the usual case when calling
|
|
451
|
+
* for example `Singleton<Foo>::get_weak()`.
|
|
452
|
+
*/
|
|
453
|
+
void doEagerInit();
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* Schedule eager singletons' initializations through the given executor.
|
|
457
|
+
* If baton ptr is not null, its `post` method is called after all
|
|
458
|
+
* early initialization has completed.
|
|
459
|
+
*
|
|
460
|
+
* If exceptions are thrown during initialization, this method will still
|
|
461
|
+
* `post` the baton to indicate completion. The exception will not propagate
|
|
462
|
+
* and future attempts to `try_get` or `get_weak` the failed singleton will
|
|
463
|
+
* retry initialization.
|
|
464
|
+
*
|
|
465
|
+
* Sample usage:
|
|
466
|
+
*
|
|
467
|
+
* folly::IOThreadPoolExecutor executor(max_concurrency_level);
|
|
468
|
+
* folly::Baton<> done;
|
|
469
|
+
* doEagerInitVia(executor, &done);
|
|
470
|
+
* done.wait(); // or 'try_wait_for', etc.
|
|
471
|
+
*
|
|
472
|
+
*/
|
|
473
|
+
void doEagerInitVia(Executor& exe, folly::Baton<>* done = nullptr);
|
|
474
|
+
|
|
475
|
+
// Destroy all singletons; when complete, the vault can't create
|
|
476
|
+
// singletons once again until reenableInstances() is called.
|
|
477
|
+
// If reenableInstances() will not be called, destroyInstancesFinal()
|
|
478
|
+
// should be used instead.
|
|
479
|
+
void destroyInstances();
|
|
480
|
+
|
|
481
|
+
// Enable re-creating singletons after destroyInstances() was called.
|
|
482
|
+
void reenableInstances();
|
|
483
|
+
|
|
484
|
+
// Same as destroyInstances() but reenableInstances() should not be called
|
|
485
|
+
// after it. Starts a shutdown timer.
|
|
486
|
+
void destroyInstancesFinal();
|
|
487
|
+
|
|
488
|
+
// For testing; how many registered and living singletons we have.
|
|
489
|
+
size_t registeredSingletonCount() const {
|
|
490
|
+
return singletons_.rlock()->size();
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
/**
|
|
494
|
+
* Flips to true if eager initialization was used, and has completed.
|
|
495
|
+
* Never set to true if "doEagerInit()" or "doEagerInitVia" never called.
|
|
496
|
+
*/
|
|
497
|
+
bool eagerInitComplete() const;
|
|
498
|
+
|
|
499
|
+
size_t livingSingletonCount() const {
|
|
500
|
+
auto state = state_.rlock();
|
|
501
|
+
auto singletons = singletons_.rlock();
|
|
502
|
+
|
|
503
|
+
size_t ret = 0;
|
|
504
|
+
for (const auto& p : *singletons) {
|
|
505
|
+
if (p.second->hasLiveInstance()) {
|
|
506
|
+
++ret;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
return ret;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
// A well-known vault; you can actually have others, but this is the
|
|
514
|
+
// default.
|
|
515
|
+
static SingletonVault* singleton() { return singleton<>(); }
|
|
516
|
+
|
|
517
|
+
// Gets singleton vault for any Tag. Non-default tag should be used in unit
|
|
518
|
+
// tests only.
|
|
519
|
+
template <typename VaultTag = detail::DefaultTag>
|
|
520
|
+
static SingletonVault* singleton() {
|
|
521
|
+
return &detail::createGlobal<SingletonVault, VaultTag>();
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
// Get a cancellation token that gets triggered when singleton destruction
|
|
525
|
+
// starts.
|
|
526
|
+
//
|
|
527
|
+
// The underlying cancellation source gets reset when reenableInstances() is
|
|
528
|
+
// called.
|
|
529
|
+
folly::CancellationToken getDestructionCancellationToken() {
|
|
530
|
+
return cancellationSource_.wlock()->getToken();
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
void setType(Type type) { type_.store(type, std::memory_order_relaxed); }
|
|
534
|
+
|
|
535
|
+
void setShutdownTimeout(std::chrono::milliseconds shutdownTimeout) {
|
|
536
|
+
shutdownTimeout_ = shutdownTimeout;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
void disableShutdownTimeout() {
|
|
540
|
+
shutdownTimeout_ = std::chrono::milliseconds::zero();
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
void addToShutdownLog(std::string message);
|
|
544
|
+
|
|
545
|
+
[[noreturn]] void fireShutdownTimer();
|
|
546
|
+
|
|
547
|
+
void setFailOnUseAfterFork(bool failOnUseAfterFork) {
|
|
548
|
+
failOnUseAfterFork_ = failOnUseAfterFork;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
bool isDisabled() const { return state_.rlock()->isDisabled(); }
|
|
552
|
+
|
|
553
|
+
private:
|
|
554
|
+
template <typename T>
|
|
555
|
+
friend struct detail::SingletonHolder;
|
|
556
|
+
|
|
557
|
+
// This method only matters if registrationComplete() is never called.
|
|
558
|
+
// Otherwise destroyInstances is scheduled to be executed atexit.
|
|
559
|
+
//
|
|
560
|
+
// Initializes static object, which calls destroyInstances on destruction.
|
|
561
|
+
// Used to have better deletion ordering with singleton not managed by
|
|
562
|
+
// folly::Singleton. The desruction will happen in the following order:
|
|
563
|
+
// 1. Singletons, not managed by folly::Singleton, which were created after
|
|
564
|
+
// any of the singletons managed by folly::Singleton was requested.
|
|
565
|
+
// 2. All singletons managed by folly::Singleton
|
|
566
|
+
// 3. Singletons, not managed by folly::Singleton, which were created before
|
|
567
|
+
// any of the singletons managed by folly::Singleton was requested.
|
|
568
|
+
static void scheduleDestroyInstances();
|
|
569
|
+
|
|
570
|
+
void startShutdownTimer();
|
|
571
|
+
|
|
572
|
+
typedef std::unordered_map<
|
|
573
|
+
detail::TypeDescriptor,
|
|
574
|
+
detail::SingletonHolderBase*,
|
|
575
|
+
detail::TypeDescriptorHasher>
|
|
576
|
+
SingletonMap;
|
|
577
|
+
|
|
578
|
+
// Use SharedMutexSuppressTSAN to suppress noisy lock inversions when building
|
|
579
|
+
// with TSAN. If TSAN is not enabled, SharedMutexSuppressTSAN is equivalent
|
|
580
|
+
// to a normal SharedMutex.
|
|
581
|
+
Synchronized<SingletonMap, SharedMutexSuppressTSAN> singletons_;
|
|
582
|
+
Synchronized<
|
|
583
|
+
std::unordered_set<detail::SingletonHolderBase*>,
|
|
584
|
+
SharedMutexSuppressTSAN>
|
|
585
|
+
eagerInitSingletons_;
|
|
586
|
+
Synchronized<
|
|
587
|
+
std::unordered_set<detail::SingletonHolderBase*>,
|
|
588
|
+
SharedMutexSuppressTSAN>
|
|
589
|
+
eagerInitOnReenableSingletons_;
|
|
590
|
+
Synchronized<std::vector<detail::TypeDescriptor>, SharedMutexSuppressTSAN>
|
|
591
|
+
creationOrder_;
|
|
592
|
+
Synchronized<
|
|
593
|
+
std::unordered_set<detail::TypeDescriptor, detail::TypeDescriptorHasher>,
|
|
594
|
+
SharedMutexSuppressTSAN>
|
|
595
|
+
instantiatedAtLeastOnce_;
|
|
596
|
+
std::unordered_set<detail::SingletonHolderBase*> liveSingletonsPreFork_;
|
|
597
|
+
|
|
598
|
+
// Using SharedMutexReadPriority is important here, because we want to make
|
|
599
|
+
// sure we don't block nested singleton creation happening concurrently with
|
|
600
|
+
// destroyInstances().
|
|
601
|
+
Synchronized<detail::SingletonVaultState, SharedMutexReadPriority> state_;
|
|
602
|
+
|
|
603
|
+
std::atomic<Type> type_;
|
|
604
|
+
|
|
605
|
+
std::atomic<bool> shutdownTimerStarted_{false};
|
|
606
|
+
std::chrono::milliseconds shutdownTimeout_{std::chrono::minutes{5}};
|
|
607
|
+
Synchronized<std::vector<std::string>> shutdownLog_;
|
|
608
|
+
// We use a lock around CancellationSource to get the guarantee that all
|
|
609
|
+
// cancellation callbacks that got triggered on requestCancellation() are done
|
|
610
|
+
// executing by the time we start destruction. This prevents silent callbacks
|
|
611
|
+
// that take long to block destruction.
|
|
612
|
+
folly::Synchronized<CancellationSource> cancellationSource_;
|
|
613
|
+
bool failOnUseAfterFork_{true};
|
|
614
|
+
};
|
|
615
|
+
|
|
616
|
+
/**
|
|
617
|
+
* Singleton allows for simple access to registering and instantiating
|
|
618
|
+
* singletons. Create instances of this class in the global scope of
|
|
619
|
+
* type Singleton<T> to register your singleton for later access via
|
|
620
|
+
* Singleton<T>::try_get().
|
|
621
|
+
*
|
|
622
|
+
* There are many supporting libraries and classes for Singleton; this is the
|
|
623
|
+
* one that users typically interact with.
|
|
624
|
+
*/
|
|
625
|
+
template <
|
|
626
|
+
typename T,
|
|
627
|
+
typename Tag = detail::DefaultTag,
|
|
628
|
+
typename VaultTag = detail::DefaultTag /* for testing */>
|
|
629
|
+
class Singleton {
|
|
630
|
+
public:
|
|
631
|
+
typedef std::function<T*(void)> CreateFunc;
|
|
632
|
+
typedef std::function<void(T*)> TeardownFunc;
|
|
633
|
+
|
|
634
|
+
/**
|
|
635
|
+
* Get a pointer to the singleton.
|
|
636
|
+
*
|
|
637
|
+
* It is preferable to call get() repeatedly than to store the returned
|
|
638
|
+
* pointer. Accessing the returned pointer often fails during shutdown.
|
|
639
|
+
*
|
|
640
|
+
* Deprecated in favor of try_get().
|
|
641
|
+
*/
|
|
642
|
+
[[deprecated("Replaced by try_get")]] static T* get() {
|
|
643
|
+
return getEntry().get();
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
/**
|
|
647
|
+
* Get a weak_ptr to the singleton.
|
|
648
|
+
*
|
|
649
|
+
* If you cannot lock the weak_ptr, this usually means the vault has been
|
|
650
|
+
* destroyed.
|
|
651
|
+
*
|
|
652
|
+
* Deprecated in favor of try_get().
|
|
653
|
+
*/
|
|
654
|
+
[[deprecated("Replaced by try_get")]] static std::weak_ptr<T> get_weak() {
|
|
655
|
+
return getEntry().get_weak();
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
/**
|
|
659
|
+
* Get a shared_ptr to the singleton.
|
|
660
|
+
*
|
|
661
|
+
* It is recommended to call try_get() repeatedly, rather than storing the
|
|
662
|
+
* shared_ptr, because storing the shared_ptr prevents the singleton from
|
|
663
|
+
* being destroyed during shutdown.
|
|
664
|
+
*/
|
|
665
|
+
static std::shared_ptr<T> try_get() { return getEntry().try_get(); }
|
|
666
|
+
|
|
667
|
+
/**
|
|
668
|
+
* Get a ReadMostlySharedPtr to the singleton.
|
|
669
|
+
*
|
|
670
|
+
* It is recommended to call try_get_fast() repeatedly, rather than storing
|
|
671
|
+
* the ReadMostlySharedPtr, because storing the ReadMostlySharedPtr prevents
|
|
672
|
+
* the singleton from being destroyed during shutdown.
|
|
673
|
+
*/
|
|
674
|
+
static folly::ReadMostlySharedPtr<T> try_get_fast() {
|
|
675
|
+
return getEntry().try_get_fast();
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
/**
|
|
679
|
+
* Applies a callback to the possibly-nullptr singleton instance, returning
|
|
680
|
+
* the callback's result.
|
|
681
|
+
*
|
|
682
|
+
* That is, the following two are functionally equivalent:
|
|
683
|
+
* singleton.apply(std::ref(f));
|
|
684
|
+
* f(singleton.try_get().get());
|
|
685
|
+
*
|
|
686
|
+
* For example, the following returns the singleton
|
|
687
|
+
* instance directly without any extra operations on the instance:
|
|
688
|
+
* auto ret = Singleton<T>::apply([](auto* v) { return v; });
|
|
689
|
+
*/
|
|
690
|
+
template <typename Func>
|
|
691
|
+
static invoke_result_t<Func, T*> apply(Func f) {
|
|
692
|
+
return getEntry().apply(std::ref(f));
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
/// Ensure the instance exists.
|
|
696
|
+
static void vivify() { getEntry().vivify(); }
|
|
697
|
+
|
|
698
|
+
/**
|
|
699
|
+
* Create a singleton, which uses the default-constructor for its wrapped
|
|
700
|
+
* type.
|
|
701
|
+
*
|
|
702
|
+
* @param t The teardown function to use (in lieu of delete).
|
|
703
|
+
*/
|
|
704
|
+
explicit Singleton(
|
|
705
|
+
std::nullptr_t /* _ */ = nullptr,
|
|
706
|
+
typename Singleton::TeardownFunc t = nullptr)
|
|
707
|
+
: Singleton([]() { return new T; }, std::move(t)) {}
|
|
708
|
+
|
|
709
|
+
/**
|
|
710
|
+
* @param c The create function to use (in lieu of new).
|
|
711
|
+
* @param t The teardown function to use (in lieu of delete).
|
|
712
|
+
*/
|
|
713
|
+
explicit Singleton(
|
|
714
|
+
typename Singleton::CreateFunc c,
|
|
715
|
+
typename Singleton::TeardownFunc t = nullptr) {
|
|
716
|
+
if (c == nullptr) {
|
|
717
|
+
detail::singletonThrowNullCreator(typeid(T));
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
auto vault = SingletonVault::singleton<VaultTag>();
|
|
721
|
+
getEntry().registerSingleton(std::move(c), getTeardownFunc(std::move(t)));
|
|
722
|
+
vault->registerSingleton(&getEntry());
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
/**
|
|
726
|
+
* Specify that the singleton should be eagerly initialized.
|
|
727
|
+
*
|
|
728
|
+
* Should be instantiated as soon as "doEagerInit[Via]" is called.
|
|
729
|
+
* Singletons are usually lazy-loaded (built on-demand) but for those which
|
|
730
|
+
* are known to be needed, to avoid the potential lag for objects that take
|
|
731
|
+
* long to construct during runtime, there is an option to make sure these
|
|
732
|
+
* are built up-front.
|
|
733
|
+
*
|
|
734
|
+
* Use like:
|
|
735
|
+
* auto gFooInstance = Singleton<Foo>(...).shouldEagerInit();
|
|
736
|
+
*
|
|
737
|
+
* Or alternately, define the singleton as usual, and say
|
|
738
|
+
* gFooInstance.shouldEagerInit();
|
|
739
|
+
*
|
|
740
|
+
* at some point prior to calling registrationComplete().
|
|
741
|
+
* Then doEagerInit() or doEagerInitVia(Executor*) can be called.
|
|
742
|
+
*/
|
|
743
|
+
Singleton& shouldEagerInit() {
|
|
744
|
+
auto vault = SingletonVault::singleton<VaultTag>();
|
|
745
|
+
vault->addEagerInitSingleton(&getEntry());
|
|
746
|
+
return *this;
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
/**
|
|
750
|
+
* Specify that the singleton should be eagerly initialized when singletons
|
|
751
|
+
* reenable.
|
|
752
|
+
*
|
|
753
|
+
* Should be re-instantiated as soon as reenableInstances() is called.
|
|
754
|
+
* Note that it will be re-instantiated only if it was instantiated before
|
|
755
|
+
* destroyInstances() call.
|
|
756
|
+
*
|
|
757
|
+
* Use like:
|
|
758
|
+
* auto gFooInstance = Singleton<Foo>(...).shouldEagerInitOnReenable();
|
|
759
|
+
*/
|
|
760
|
+
Singleton& shouldEagerInitOnReenable() {
|
|
761
|
+
auto vault = SingletonVault::singleton<VaultTag>();
|
|
762
|
+
vault->addEagerInitOnReenableSingleton(&getEntry());
|
|
763
|
+
return *this;
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
/**
|
|
767
|
+
* Inject a mock singleton, for testing.
|
|
768
|
+
*
|
|
769
|
+
* Construct and inject a mock singleton which should be used only from tests.
|
|
770
|
+
* Unlike regular singletons which are initialized once per process lifetime,
|
|
771
|
+
* mock singletons live for the duration of a test. This means that one
|
|
772
|
+
* process running multiple tests can initialize and register the same
|
|
773
|
+
* singleton multiple times. This functionality should be used only from tests
|
|
774
|
+
* since it relaxes validation and performance in order to be able to perform
|
|
775
|
+
* the injection. The returned mock singleton is functionality identical to
|
|
776
|
+
* regular singletons.
|
|
777
|
+
*/
|
|
778
|
+
static void make_mock(
|
|
779
|
+
std::nullptr_t /* c */ = nullptr,
|
|
780
|
+
typename Singleton<T>::TeardownFunc t = nullptr) {
|
|
781
|
+
make_mock([]() { return new T; }, t);
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
static void make_mock(
|
|
785
|
+
CreateFunc c, typename Singleton<T>::TeardownFunc t = nullptr) {
|
|
786
|
+
if (c == nullptr) {
|
|
787
|
+
detail::singletonThrowNullCreator(typeid(T));
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
auto& entry = getEntry();
|
|
791
|
+
|
|
792
|
+
entry.registerSingletonMock(c, getTeardownFunc(t));
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
private:
|
|
796
|
+
inline static detail::SingletonHolder<T>& getEntry() {
|
|
797
|
+
return detail::SingletonHolder<T>::template singleton<Tag, VaultTag>();
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
// Construct TeardownFunc.
|
|
801
|
+
static typename detail::SingletonHolder<T>::TeardownFunc getTeardownFunc(
|
|
802
|
+
TeardownFunc t) {
|
|
803
|
+
if (t == nullptr) {
|
|
804
|
+
return [](T* v) { delete v; };
|
|
805
|
+
} else {
|
|
806
|
+
return t;
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
};
|
|
810
|
+
|
|
811
|
+
template <typename T, typename Tag = detail::DefaultTag>
|
|
812
|
+
class LeakySingleton {
|
|
813
|
+
public:
|
|
814
|
+
using CreateFunc = std::function<T*()>;
|
|
815
|
+
|
|
816
|
+
LeakySingleton() : LeakySingleton([] { return new T(); }) {}
|
|
817
|
+
|
|
818
|
+
explicit LeakySingleton(CreateFunc createFunc) {
|
|
819
|
+
auto& entry = entryInstance();
|
|
820
|
+
if (entry.state != State::NotRegistered) {
|
|
821
|
+
detail::singletonWarnLeakyDoubleRegistrationAndAbort(entry.type_);
|
|
822
|
+
}
|
|
823
|
+
entry.createFunc = createFunc;
|
|
824
|
+
entry.state = State::Dead;
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
static T& get() { return instance(); }
|
|
828
|
+
|
|
829
|
+
static void make_mock(std::nullptr_t /* c */ = nullptr) {
|
|
830
|
+
make_mock([]() { return new T; });
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
static void make_mock(CreateFunc createFunc) {
|
|
834
|
+
if (createFunc == nullptr) {
|
|
835
|
+
detail::singletonThrowNullCreator(typeid(T));
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
auto& entry = entryInstance();
|
|
839
|
+
std::lock_guard<std::mutex> lg(entry.mutex);
|
|
840
|
+
if (entry.ptr) {
|
|
841
|
+
lsan_ignore_object(std::atomic_exchange(&entry.ptr, (T*)nullptr));
|
|
842
|
+
}
|
|
843
|
+
entry.createFunc = createFunc;
|
|
844
|
+
entry.state = State::Dead;
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
private:
|
|
848
|
+
enum class State { NotRegistered, Dead, Living };
|
|
849
|
+
|
|
850
|
+
struct Entry {
|
|
851
|
+
Entry() noexcept {}
|
|
852
|
+
Entry(const Entry&) = delete;
|
|
853
|
+
Entry& operator=(const Entry&) = delete;
|
|
854
|
+
|
|
855
|
+
std::atomic<State> state{State::NotRegistered};
|
|
856
|
+
std::atomic<T*> ptr{nullptr};
|
|
857
|
+
CreateFunc createFunc;
|
|
858
|
+
std::mutex mutex;
|
|
859
|
+
detail::TypeDescriptor type_{typeid(T), typeid(Tag)};
|
|
860
|
+
};
|
|
861
|
+
|
|
862
|
+
static Entry& entryInstance() { return detail::createGlobal<Entry, Tag>(); }
|
|
863
|
+
|
|
864
|
+
static T& instance() {
|
|
865
|
+
auto& entry = entryInstance();
|
|
866
|
+
if (FOLLY_UNLIKELY(entry.state != State::Living)) {
|
|
867
|
+
createInstance();
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
return *entry.ptr;
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
static void createInstance() {
|
|
874
|
+
auto& entry = entryInstance();
|
|
875
|
+
|
|
876
|
+
std::lock_guard<std::mutex> lg(entry.mutex);
|
|
877
|
+
if (entry.state == State::Living) {
|
|
878
|
+
return;
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
if (entry.state == State::NotRegistered) {
|
|
882
|
+
detail::singletonWarnLeakyInstantiatingNotRegisteredAndAbort(entry.type_);
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
entry.ptr = entry.createFunc();
|
|
886
|
+
entry.state = State::Living;
|
|
887
|
+
}
|
|
888
|
+
};
|
|
889
|
+
} // namespace folly
|
|
890
|
+
|
|
891
|
+
#include <folly/Singleton-inl.h>
|