react-native-windows 0.85.0-preview.1 → 0.85.0
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 -1
- package/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.cpp +28 -46
- package/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.h +0 -3
- package/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.cpp +19 -13
- package/Microsoft.ReactNative/Fabric/Composition/Modal/WindowsModalHostViewComponentView.cpp +107 -0
- package/Microsoft.ReactNative/Fabric/Composition/SelectionItemAutomationEvent.h +73 -0
- package/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.cpp +105 -32
- package/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.h +7 -2
- package/PropertySheets/CIBuildOptimizations.props +2 -2
- package/PropertySheets/Generated/PackageVersion.g.props +2 -2
- package/PropertySheets/JSEngine.props +1 -1
- package/PropertySheets/NuGet.LockFile.props +2 -9
- package/Scripts/NuGetRestoreForceEvaluateAllSolutions.ps1 +54 -5
- package/Scripts/UpdateNightlyDependencies.ps1 +47 -0
- package/Scripts/creaternwapp.cmd +29 -9
- package/Scripts/creaternwlib.cmd +31 -15
- package/external/.clang-format +1 -0
- 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/external/fmt/cgmanifest.json +15 -0
- 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/external/fmt/include/fmt/base.h +3077 -0
- 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/Folly.natvis +25 -0
- package/external/folly/LICENSE +200 -0
- package/external/folly/README.md +263 -0
- package/external/folly/cgmanifest.json +25 -0
- package/external/folly/folly/.clang-format +1 -0
- 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/ConstexprMath.h +978 -0
- package/external/folly/folly/ConstructorCallbackList.h +158 -0
- package/external/folly/folly/Conv.cpp +1205 -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/Hardware.h +155 -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.cpp +633 -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/external/folly/folly/hash/SpookyHashV2.h +339 -0
- 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-inl.h +1438 -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.cpp +1118 -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/SafeAssert.h +188 -0
- package/external/folly/folly/lang/StaticConst.h +33 -0
- package/external/folly/folly/lang/Thunk.h +100 -0
- package/external/folly/folly/lang/ToAscii.cpp +348 -0
- package/external/folly/folly/lang/ToAscii.h +182 -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.cpp +33 -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 +8 -8
- package/templates/cpp-lib/example/metro.config.js +18 -2
|
@@ -0,0 +1,419 @@
|
|
|
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_baton
|
|
19
|
+
//
|
|
20
|
+
|
|
21
|
+
#pragma once
|
|
22
|
+
|
|
23
|
+
#include <assert.h>
|
|
24
|
+
#include <errno.h>
|
|
25
|
+
#include <stdint.h>
|
|
26
|
+
|
|
27
|
+
#include <atomic>
|
|
28
|
+
#include <thread>
|
|
29
|
+
|
|
30
|
+
#include <folly/Likely.h>
|
|
31
|
+
#include <folly/detail/AsyncTrace.h>
|
|
32
|
+
#include <folly/detail/Futex.h>
|
|
33
|
+
#include <folly/detail/MemoryIdler.h>
|
|
34
|
+
#include <folly/portability/Asm.h>
|
|
35
|
+
#include <folly/synchronization/AtomicUtil.h>
|
|
36
|
+
#include <folly/synchronization/WaitOptions.h>
|
|
37
|
+
#include <folly/synchronization/detail/Spin.h>
|
|
38
|
+
|
|
39
|
+
namespace folly {
|
|
40
|
+
|
|
41
|
+
/// A Baton allows a thread to block once and be awoken. Captures a
|
|
42
|
+
/// single handoff, and during its lifecycle (from construction/reset
|
|
43
|
+
/// to destruction/reset) a baton must either be post()ed and wait()ed
|
|
44
|
+
/// exactly once each, or not at all.
|
|
45
|
+
///
|
|
46
|
+
/// Baton includes no internal padding, and is only 4 bytes in size.
|
|
47
|
+
/// Any alignment or padding to avoid false sharing is up to the user.
|
|
48
|
+
///
|
|
49
|
+
/// This is basically a stripped-down semaphore that supports only a
|
|
50
|
+
/// single call to sem_post and a single call to sem_wait.
|
|
51
|
+
///
|
|
52
|
+
/// The non-blocking version (MayBlock == false) provides more speed
|
|
53
|
+
/// by using only load acquire and store release operations in the
|
|
54
|
+
/// critical path, at the cost of disallowing blocking.
|
|
55
|
+
///
|
|
56
|
+
/// The current posix semaphore sem_t isn't too bad, but this provides
|
|
57
|
+
/// a bit more speed, inlining, smaller size, a guarantee that
|
|
58
|
+
/// the implementation won't change, and compatibility with
|
|
59
|
+
/// DeterministicSchedule. A much more restrictive lifecycle allows for adding
|
|
60
|
+
/// a bunch of assertions that can help to catch race conditions ahead of time.
|
|
61
|
+
///
|
|
62
|
+
/// Baton post with MayBlock == false is async-signal-safe.
|
|
63
|
+
/// When MayBlock == true, Baton post is async-signal-safe if
|
|
64
|
+
/// Futex wake is so.
|
|
65
|
+
///
|
|
66
|
+
/// @refcode folly/docs/examples/folly/synchronization/Baton.cpp
|
|
67
|
+
///
|
|
68
|
+
template <bool MayBlock = true, template <typename> class Atom = std::atomic>
|
|
69
|
+
class Baton {
|
|
70
|
+
public:
|
|
71
|
+
/// @methodset Settings
|
|
72
|
+
///
|
|
73
|
+
/// Gets default wait options for controlling wait behaviour
|
|
74
|
+
FOLLY_ALWAYS_INLINE static constexpr WaitOptions wait_options() { return {}; }
|
|
75
|
+
|
|
76
|
+
constexpr Baton() noexcept : state_(INIT) {}
|
|
77
|
+
|
|
78
|
+
Baton(Baton const&) = delete;
|
|
79
|
+
Baton& operator=(Baton const&) = delete;
|
|
80
|
+
|
|
81
|
+
/// It is an error to destroy a Baton on which a thread is currently
|
|
82
|
+
/// wait()ing. In practice this means that the waiter usually takes
|
|
83
|
+
/// responsibility for destroying the Baton.
|
|
84
|
+
~Baton() noexcept {
|
|
85
|
+
// The docblock for this function says that it can't be called when
|
|
86
|
+
// there is a concurrent waiter. We assume a strong version of this
|
|
87
|
+
// requirement in which the caller must _know_ that this is true, they
|
|
88
|
+
// are not allowed to be merely lucky. If two threads are involved,
|
|
89
|
+
// the destroying thread must actually have synchronized with the
|
|
90
|
+
// waiting thread after wait() returned. To convey causality the
|
|
91
|
+
// waiting thread must have used release semantics and the destroying
|
|
92
|
+
// thread must have used acquire semantics for that communication,
|
|
93
|
+
// so we are guaranteed to see the post-wait() value of state_,
|
|
94
|
+
// which cannot be WAITING.
|
|
95
|
+
//
|
|
96
|
+
// Note that since we only care about a single memory location,
|
|
97
|
+
// the only two plausible memory orders here are relaxed and seq_cst.
|
|
98
|
+
assert(state_.load(std::memory_order_relaxed) != WAITING);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/// @methodset Operations
|
|
102
|
+
///
|
|
103
|
+
/// Non blocking check whether a baton has been posted.
|
|
104
|
+
//
|
|
105
|
+
/// Okay to call before or after any call to try_wait, try_wait_for,
|
|
106
|
+
/// try_wait_until, or wait.
|
|
107
|
+
///
|
|
108
|
+
/// @return True if baton has been posted, false otherwise
|
|
109
|
+
FOLLY_ALWAYS_INLINE bool ready() const noexcept {
|
|
110
|
+
auto s = state_.load(std::memory_order_acquire);
|
|
111
|
+
return FOLLY_LIKELY(s == EARLY_DELIVERY || s == LATE_DELIVERY);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/// @methodset Operations
|
|
115
|
+
///
|
|
116
|
+
/// Equivalent to destroying the Baton and creating a new one. It is
|
|
117
|
+
/// a bug to call this while there is a waiting thread, so in practice
|
|
118
|
+
/// the waiter will be the one that resets the baton.
|
|
119
|
+
void reset() noexcept {
|
|
120
|
+
// See ~Baton for a discussion about why relaxed is okay here
|
|
121
|
+
assert(state_.load(std::memory_order_relaxed) != WAITING);
|
|
122
|
+
|
|
123
|
+
// We use a similar argument to justify the use of a relaxed store
|
|
124
|
+
// here. Since both wait() and post() are required to be called
|
|
125
|
+
// only once per lifetime, no thread can actually call those methods
|
|
126
|
+
// correctly after a reset() unless it synchronizes with the thread
|
|
127
|
+
// that performed the reset(). If a post() or wait() on another thread
|
|
128
|
+
// didn't synchronize, then regardless of what operation we performed
|
|
129
|
+
// here there would be a race on proper use of the Baton's spec
|
|
130
|
+
// (although not on any particular load and store). Put another way,
|
|
131
|
+
// we don't need to synchronize here because anybody that might rely
|
|
132
|
+
// on such synchronization is required by the baton rules to perform
|
|
133
|
+
// an additional synchronization that has the desired effect anyway.
|
|
134
|
+
//
|
|
135
|
+
// There is actually a similar argument to be made about the
|
|
136
|
+
// constructor, in which the fenceless constructor initialization
|
|
137
|
+
// of state_ is piggybacked on whatever synchronization mechanism
|
|
138
|
+
// distributes knowledge of the Baton's existence
|
|
139
|
+
state_.store(INIT, std::memory_order_relaxed);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/// @methodset Operations
|
|
143
|
+
///
|
|
144
|
+
/// Causes wait() to wake up. For each lifetime of a Baton (where a
|
|
145
|
+
/// lifetime starts at construction or reset() and ends at
|
|
146
|
+
/// destruction or reset()) there can be at most one call to post(),
|
|
147
|
+
/// in the single poster version. Any thread may call post().
|
|
148
|
+
void post() noexcept {
|
|
149
|
+
if (!MayBlock) {
|
|
150
|
+
/// Spin-only version
|
|
151
|
+
///
|
|
152
|
+
assert(
|
|
153
|
+
((1 << state_.load(std::memory_order_relaxed)) &
|
|
154
|
+
((1 << INIT) | (1 << EARLY_DELIVERY))) != 0);
|
|
155
|
+
state_.store(EARLY_DELIVERY, std::memory_order_release);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/// May-block versions
|
|
160
|
+
///
|
|
161
|
+
uint32_t before = state_.load(std::memory_order_acquire);
|
|
162
|
+
|
|
163
|
+
assert(before == INIT || before == WAITING || before == TIMED_OUT);
|
|
164
|
+
|
|
165
|
+
if (before == INIT &&
|
|
166
|
+
state_.compare_exchange_strong(
|
|
167
|
+
before,
|
|
168
|
+
EARLY_DELIVERY,
|
|
169
|
+
std::memory_order_release,
|
|
170
|
+
std::memory_order_relaxed)) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
assert(before == WAITING || before == TIMED_OUT);
|
|
175
|
+
|
|
176
|
+
if (before == TIMED_OUT) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
assert(before == WAITING);
|
|
181
|
+
state_.store(LATE_DELIVERY, std::memory_order_release);
|
|
182
|
+
detail::futexWake(&state_, 1);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/// @methodset Operations
|
|
186
|
+
///
|
|
187
|
+
/// Waits until post() has been called in the current Baton lifetime.
|
|
188
|
+
/// May be called at most once during a Baton lifetime (construction
|
|
189
|
+
/// |reset until destruction|reset). If post is called before wait in
|
|
190
|
+
/// the current lifetime then this method returns immediately.
|
|
191
|
+
///
|
|
192
|
+
/// The restriction that there can be at most one wait() per lifetime
|
|
193
|
+
/// could be relaxed somewhat without any perf or size regressions,
|
|
194
|
+
/// but making this condition very restrictive can provide better checking in
|
|
195
|
+
/// debug builds.
|
|
196
|
+
///
|
|
197
|
+
/// @param opt Options for controlling wait behaviour
|
|
198
|
+
FOLLY_ALWAYS_INLINE
|
|
199
|
+
void wait(const WaitOptions& opt = wait_options()) noexcept {
|
|
200
|
+
if (try_wait()) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
auto const deadline = std::chrono::steady_clock::time_point::max();
|
|
205
|
+
tryWaitSlow(deadline, opt);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/// @methodset Operations
|
|
209
|
+
///
|
|
210
|
+
/// Similar to wait, but doesn't block the thread if it hasn't been posted.
|
|
211
|
+
///
|
|
212
|
+
/// try_wait has the following semantics:
|
|
213
|
+
/// - It is ok to call try_wait any number times on the same baton until
|
|
214
|
+
/// try_wait reports that the baton has been posted.
|
|
215
|
+
/// - It is ok to call timed_wait or wait on the same baton if try_wait
|
|
216
|
+
/// reports that baton hasn't been posted.
|
|
217
|
+
/// - If try_wait indicates that the baton has been posted, it is invalid to
|
|
218
|
+
/// call wait, try_wait or timed_wait on the same baton without resetting
|
|
219
|
+
///
|
|
220
|
+
/// @return True if baton has been posted, false othewise
|
|
221
|
+
FOLLY_ALWAYS_INLINE bool try_wait() noexcept {
|
|
222
|
+
auto s = state_.load(std::memory_order_acquire);
|
|
223
|
+
assert(s == INIT || s == EARLY_DELIVERY);
|
|
224
|
+
return FOLLY_LIKELY(s == EARLY_DELIVERY);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/// @methodset Operations
|
|
228
|
+
///
|
|
229
|
+
/// Similar to wait, but with a timeout. The thread is unblocked if the
|
|
230
|
+
/// timeout expires.
|
|
231
|
+
/// Note: Only a single call to wait/try_wait_for/try_wait_until is allowed
|
|
232
|
+
/// during a baton's life-cycle (from ctor/reset to dtor/reset). In other
|
|
233
|
+
/// words, after try_wait_for the caller can't invoke
|
|
234
|
+
/// wait/try_wait/try_wait_for/try_wait_until
|
|
235
|
+
/// again on the same baton without resetting it.
|
|
236
|
+
///
|
|
237
|
+
/// @param timeout Time until which the thread can block
|
|
238
|
+
/// @param opt Options for controlling wait behaviour
|
|
239
|
+
/// @return True if the baton was posted to before timeout,
|
|
240
|
+
/// False otherwise
|
|
241
|
+
template <typename Rep, typename Period>
|
|
242
|
+
FOLLY_ALWAYS_INLINE bool try_wait_for(
|
|
243
|
+
const std::chrono::duration<Rep, Period>& timeout,
|
|
244
|
+
const WaitOptions& opt = wait_options()) noexcept {
|
|
245
|
+
if (try_wait()) {
|
|
246
|
+
return true;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
auto const deadline = std::chrono::steady_clock::now() + timeout;
|
|
250
|
+
return tryWaitSlow(deadline, opt);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/// @methodset Operations
|
|
254
|
+
///
|
|
255
|
+
/// Similar to wait, but with a deadline. The thread is unblocked if the
|
|
256
|
+
/// deadline expires.
|
|
257
|
+
/// Note: Only a single call to wait/try_wait_for/try_wait_until is allowed
|
|
258
|
+
/// during a baton's life-cycle (from ctor/reset to dtor/reset). In other
|
|
259
|
+
/// words, after try_wait_until the caller can't invoke
|
|
260
|
+
/// wait/try_wait/try_wait_for/try_wait_until
|
|
261
|
+
/// again on the same baton without resetting it.
|
|
262
|
+
///
|
|
263
|
+
/// @param deadline Time until which the thread can block
|
|
264
|
+
/// @param opt Options for controlling wait behaviour
|
|
265
|
+
/// @return True if the baton was posted to before deadline,
|
|
266
|
+
/// False otherwise
|
|
267
|
+
template <typename Clock, typename Duration>
|
|
268
|
+
FOLLY_ALWAYS_INLINE bool try_wait_until(
|
|
269
|
+
const std::chrono::time_point<Clock, Duration>& deadline,
|
|
270
|
+
const WaitOptions& opt = wait_options()) noexcept {
|
|
271
|
+
if (try_wait()) {
|
|
272
|
+
return true;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
return tryWaitSlow(deadline, opt);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/// @methodset Deprecated
|
|
279
|
+
///
|
|
280
|
+
/// @overloadbrief Aliases to try_wait_for and try_wait_until
|
|
281
|
+
///
|
|
282
|
+
/// Alias to try_wait_for. Deprecated.
|
|
283
|
+
template <typename Rep, typename Period>
|
|
284
|
+
FOLLY_ALWAYS_INLINE bool timed_wait(
|
|
285
|
+
const std::chrono::duration<Rep, Period>& timeout) noexcept {
|
|
286
|
+
return try_wait_for(timeout);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/// @methodset Deprecated
|
|
290
|
+
///
|
|
291
|
+
/// Alias to try_wait_until. Deprecated.
|
|
292
|
+
template <typename Clock, typename Duration>
|
|
293
|
+
FOLLY_ALWAYS_INLINE bool timed_wait(
|
|
294
|
+
const std::chrono::time_point<Clock, Duration>& deadline) noexcept {
|
|
295
|
+
return try_wait_until(deadline);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
private:
|
|
299
|
+
enum State : uint32_t {
|
|
300
|
+
INIT = 0,
|
|
301
|
+
EARLY_DELIVERY = 1,
|
|
302
|
+
WAITING = 2,
|
|
303
|
+
LATE_DELIVERY = 3,
|
|
304
|
+
TIMED_OUT = 4,
|
|
305
|
+
};
|
|
306
|
+
|
|
307
|
+
template <typename Clock, typename Duration>
|
|
308
|
+
FOLLY_NOINLINE bool tryWaitSlow(
|
|
309
|
+
const std::chrono::time_point<Clock, Duration>& deadline,
|
|
310
|
+
const WaitOptions& opt) noexcept {
|
|
311
|
+
if (opt.logging_enabled()) {
|
|
312
|
+
folly::async_tracing::logBlockingOperation(
|
|
313
|
+
std::chrono::duration_cast<std::chrono::milliseconds>(
|
|
314
|
+
deadline - Clock::now()));
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
switch (
|
|
318
|
+
detail::spin_pause_until(deadline, opt, [this] { return ready(); })) {
|
|
319
|
+
case detail::spin_result::success:
|
|
320
|
+
return true;
|
|
321
|
+
case detail::spin_result::timeout:
|
|
322
|
+
return false;
|
|
323
|
+
case detail::spin_result::advance:
|
|
324
|
+
break;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
if (!MayBlock) {
|
|
328
|
+
switch (detail::spin_yield_until(deadline, [this] { return ready(); })) {
|
|
329
|
+
case detail::spin_result::success:
|
|
330
|
+
return true;
|
|
331
|
+
case detail::spin_result::timeout:
|
|
332
|
+
return false;
|
|
333
|
+
case detail::spin_result::advance:
|
|
334
|
+
break;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// Try transitioning from the spinning phase to the blocking phase via a CAS
|
|
339
|
+
// on state_.
|
|
340
|
+
//
|
|
341
|
+
// The transition may conceptually be interrupted by a post, i.e., race with
|
|
342
|
+
// a post and lose, in which case the wait operation succeeds and so returns
|
|
343
|
+
// true.
|
|
344
|
+
//
|
|
345
|
+
// The memory orders in this CAS seem backwards but are correct: CAS failure
|
|
346
|
+
// immediately precedes return-true and return-true requires an immediately-
|
|
347
|
+
// preceding load-acquire on state_ to protect the caller, which is about to
|
|
348
|
+
// use whatever memory this baton guards. Therefore, CAS failure must have a
|
|
349
|
+
// load-acquire attached to it.
|
|
350
|
+
//
|
|
351
|
+
// CAS success means that the transition from spinning to blocking finished.
|
|
352
|
+
// After blocking, there is a load-acquire immediately preceding return-true
|
|
353
|
+
// corresponding to the store-release in post, so no success load-acquire is
|
|
354
|
+
// needed here.
|
|
355
|
+
//
|
|
356
|
+
// No success store-release is needed either since only the same thread will
|
|
357
|
+
// load the state, which happens later in wait during and after blocking.
|
|
358
|
+
uint32_t expected = INIT;
|
|
359
|
+
if (!folly::atomic_compare_exchange_strong_explicit<Atom>(
|
|
360
|
+
&state_,
|
|
361
|
+
&expected,
|
|
362
|
+
WAITING,
|
|
363
|
+
std::memory_order_relaxed,
|
|
364
|
+
std::memory_order_acquire)) {
|
|
365
|
+
// CAS failed. The baton must have been posted between the last spin and
|
|
366
|
+
// the CAS, so it is not necessary to transition from the spinning phase
|
|
367
|
+
// to the blocking phase. Therefore the wait succeeds.
|
|
368
|
+
//
|
|
369
|
+
// Match the post store-release with the CAS failure load-acquire above.
|
|
370
|
+
assert(expected == EARLY_DELIVERY);
|
|
371
|
+
return true;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
while (true) {
|
|
375
|
+
auto rv = detail::MemoryIdler::futexWaitUntil(state_, WAITING, deadline);
|
|
376
|
+
|
|
377
|
+
// Awoken by the deadline passing.
|
|
378
|
+
if (rv == detail::FutexResult::TIMEDOUT) {
|
|
379
|
+
assert(deadline != (std::chrono::time_point<Clock, Duration>::max()));
|
|
380
|
+
state_.store(TIMED_OUT, std::memory_order_relaxed);
|
|
381
|
+
return false;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// Probably awoken by a matching wake event, but could also by awoken
|
|
385
|
+
// by an asynchronous signal or by a spurious wakeup.
|
|
386
|
+
//
|
|
387
|
+
// state_ is the truth even if FUTEX_WAIT reported a matching
|
|
388
|
+
// FUTEX_WAKE, since we aren't using type-stable storage and we
|
|
389
|
+
// don't guarantee reuse. The scenario goes like this: thread
|
|
390
|
+
// A's last touch of a Baton is a call to post(), which stores
|
|
391
|
+
// LATE_DELIVERY and gets an unlucky context switch before delivering
|
|
392
|
+
// the corresponding futexWake. Thread B sees LATE_DELIVERY
|
|
393
|
+
// without consuming a futex event, because it calls futexWait
|
|
394
|
+
// with an expected value of WAITING and hence doesn't go to sleep.
|
|
395
|
+
// B returns, so the Baton's memory is reused and becomes another
|
|
396
|
+
// Baton (or a reuse of this one). B calls futexWait on the new
|
|
397
|
+
// Baton lifetime, then A wakes up and delivers a spurious futexWake
|
|
398
|
+
// to the same memory location. B's futexWait will then report a
|
|
399
|
+
// consumed wake event even though state_ is still WAITING.
|
|
400
|
+
//
|
|
401
|
+
// It would be possible to add an extra state_ dance to communicate
|
|
402
|
+
// that the futexWake has been sent so that we can be sure to consume
|
|
403
|
+
// it before returning, but that would be a perf and complexity hit.
|
|
404
|
+
uint32_t s = state_.load(std::memory_order_acquire);
|
|
405
|
+
assert(s == WAITING || s == LATE_DELIVERY);
|
|
406
|
+
if (s == LATE_DELIVERY) {
|
|
407
|
+
// The baton was posted and this is not just a spurious wakeup.
|
|
408
|
+
// Therefore the wait succeeds.
|
|
409
|
+
//
|
|
410
|
+
// Match the post store-release with the simple load-acquire above.
|
|
411
|
+
return true;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
detail::Futex<Atom> state_;
|
|
417
|
+
};
|
|
418
|
+
|
|
419
|
+
} // namespace folly
|
|
@@ -0,0 +1,263 @@
|
|
|
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_callonce
|
|
19
|
+
//
|
|
20
|
+
|
|
21
|
+
#pragma once
|
|
22
|
+
|
|
23
|
+
#include <atomic>
|
|
24
|
+
#include <utility>
|
|
25
|
+
|
|
26
|
+
#include <folly/Likely.h>
|
|
27
|
+
#include <folly/MicroLock.h>
|
|
28
|
+
#include <folly/Portability.h>
|
|
29
|
+
#include <folly/SharedMutex.h>
|
|
30
|
+
#include <folly/functional/Invoke.h>
|
|
31
|
+
|
|
32
|
+
namespace folly {
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* The flag template to be used with call_once. Parameterizable by the mutex
|
|
36
|
+
* type and atomic template. The mutex type is required to mimic std::mutex and
|
|
37
|
+
* the atomic type is required to mimic std::atomic.
|
|
38
|
+
*/
|
|
39
|
+
template <typename Mutex, template <typename> class Atom = std::atomic>
|
|
40
|
+
class basic_once_flag;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* An alternative flag template that can be used with call_once that uses only
|
|
44
|
+
* 1 byte. Internally, compact_once_flag uses folly::MicroLock and its data
|
|
45
|
+
* storage API.
|
|
46
|
+
*/
|
|
47
|
+
class compact_once_flag;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Drop-in replacement for std::call_once.
|
|
51
|
+
*
|
|
52
|
+
* The libstdc++ implementation has two flaws:
|
|
53
|
+
* * it lacks a fast path, and
|
|
54
|
+
* * it deadlocks (in explicit violation of the standard) when invoked twice
|
|
55
|
+
* with a given flag, and the callable passed to the first invocation throws.
|
|
56
|
+
*
|
|
57
|
+
* This implementation corrects both flaws.
|
|
58
|
+
*
|
|
59
|
+
* The tradeoff is a slightly larger once_flag struct at 8 bytes, vs 4 bytes
|
|
60
|
+
* with libstdc++ on Linux/x64. However, you may use folly::compact_once_flag
|
|
61
|
+
* which is 1 byte.
|
|
62
|
+
*
|
|
63
|
+
* Does not work with std::once_flag.
|
|
64
|
+
*
|
|
65
|
+
* mimic: std::call_once
|
|
66
|
+
*/
|
|
67
|
+
template <typename OnceFlag, typename F, typename... Args>
|
|
68
|
+
FOLLY_ALWAYS_INLINE void call_once(OnceFlag& flag, F&& f, Args&&... args) {
|
|
69
|
+
if (FOLLY_LIKELY(flag.test_once())) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
flag.call_once_slow(std::forward<F>(f), std::forward<Args>(args)...);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Like call_once, but using a boolean return type to signal pass/fail rather
|
|
77
|
+
* than throwing exceptions.
|
|
78
|
+
*
|
|
79
|
+
* Returns true if any previous call to try_call_once with the same once_flag
|
|
80
|
+
* has returned true or if any previous call to call_once with the same
|
|
81
|
+
* once_flag has completed without throwing an exception or if the function
|
|
82
|
+
* passed as an argument returns true; otherwise returns false.
|
|
83
|
+
*
|
|
84
|
+
* Note: This has no parallel in the std::once_flag interface.
|
|
85
|
+
*/
|
|
86
|
+
template <typename OnceFlag, typename F, typename... Args>
|
|
87
|
+
FOLLY_NODISCARD FOLLY_ALWAYS_INLINE bool try_call_once(
|
|
88
|
+
OnceFlag& flag, F&& f, Args&&... args) noexcept {
|
|
89
|
+
static_assert(is_nothrow_invocable_v<F, Args...>, "must be noexcept");
|
|
90
|
+
if (FOLLY_LIKELY(flag.test_once())) {
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
return flag.try_call_once_slow(
|
|
94
|
+
std::forward<F>(f), std::forward<Args>(args)...);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Tests whether any invocation to call_once with the given flag has succeeded.
|
|
99
|
+
*
|
|
100
|
+
* May help with space usage in certain esoteric scenarios compared with caller
|
|
101
|
+
* code tracking a separate and possibly-padded bool.
|
|
102
|
+
*
|
|
103
|
+
* Note: This has no parallel in the std::once_flag interface.
|
|
104
|
+
*/
|
|
105
|
+
template <typename OnceFlag>
|
|
106
|
+
FOLLY_ALWAYS_INLINE bool test_once(OnceFlag const& flag) noexcept {
|
|
107
|
+
return flag.test_once();
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Resets a flag.
|
|
112
|
+
*
|
|
113
|
+
* Warning: unsafe to call concurrently with any other flag operations.
|
|
114
|
+
*/
|
|
115
|
+
template <typename OnceFlag>
|
|
116
|
+
FOLLY_ALWAYS_INLINE void reset_once(OnceFlag& flag) noexcept {
|
|
117
|
+
return flag.reset_once();
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Sets a flag, as if call_once(flag, [] {}) was called.
|
|
122
|
+
*
|
|
123
|
+
* Warning: unsafe to call concurrently with any other flag operations.
|
|
124
|
+
*/
|
|
125
|
+
template <typename OnceFlag>
|
|
126
|
+
FOLLY_ALWAYS_INLINE void set_once(OnceFlag& flag) noexcept {
|
|
127
|
+
return flag.set_once();
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
template <typename Mutex, template <typename> class Atom>
|
|
131
|
+
class basic_once_flag {
|
|
132
|
+
public:
|
|
133
|
+
constexpr basic_once_flag() noexcept = default;
|
|
134
|
+
basic_once_flag(const basic_once_flag&) = delete;
|
|
135
|
+
basic_once_flag& operator=(const basic_once_flag&) = delete;
|
|
136
|
+
|
|
137
|
+
private:
|
|
138
|
+
template <typename OnceFlag, typename F, typename... Args>
|
|
139
|
+
friend void call_once(OnceFlag&, F&&, Args&&...);
|
|
140
|
+
|
|
141
|
+
template <typename OnceFlag>
|
|
142
|
+
friend bool test_once(OnceFlag const& flag) noexcept;
|
|
143
|
+
|
|
144
|
+
template <typename OnceFlag>
|
|
145
|
+
friend void reset_once(OnceFlag&) noexcept;
|
|
146
|
+
|
|
147
|
+
template <typename OnceFlag>
|
|
148
|
+
friend void set_once(OnceFlag&) noexcept;
|
|
149
|
+
|
|
150
|
+
template <typename F, typename... Args>
|
|
151
|
+
FOLLY_NOINLINE void call_once_slow(F&& f, Args&&... args) {
|
|
152
|
+
std::lock_guard<Mutex> lock(mutex_);
|
|
153
|
+
if (called_.load(std::memory_order_relaxed)) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
invoke(std::forward<F>(f), std::forward<Args>(args)...);
|
|
157
|
+
called_.store(true, std::memory_order_release);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
template <typename OnceFlag, typename F, typename... Args>
|
|
161
|
+
friend bool try_call_once(OnceFlag&, F&&, Args&&...) noexcept;
|
|
162
|
+
|
|
163
|
+
template <typename F, typename... Args>
|
|
164
|
+
FOLLY_NOINLINE bool try_call_once_slow(F&& f, Args&&... args) noexcept {
|
|
165
|
+
std::lock_guard<Mutex> lock(mutex_);
|
|
166
|
+
if (called_.load(std::memory_order_relaxed)) {
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
auto const pass = invoke(std::forward<F>(f), std::forward<Args>(args)...);
|
|
170
|
+
called_.store(pass, std::memory_order_release);
|
|
171
|
+
return pass;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
FOLLY_ALWAYS_INLINE bool test_once() const noexcept {
|
|
175
|
+
return called_.load(std::memory_order_acquire);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
FOLLY_ALWAYS_INLINE void reset_once() noexcept {
|
|
179
|
+
called_.store(false, std::memory_order_relaxed);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
FOLLY_ALWAYS_INLINE void set_once() noexcept {
|
|
183
|
+
called_.store(true, std::memory_order_relaxed);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
Atom<bool> called_{false};
|
|
187
|
+
Mutex mutex_;
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
class compact_once_flag {
|
|
191
|
+
public:
|
|
192
|
+
compact_once_flag() = default;
|
|
193
|
+
compact_once_flag(const compact_once_flag&) = delete;
|
|
194
|
+
compact_once_flag& operator=(const compact_once_flag&) = delete;
|
|
195
|
+
|
|
196
|
+
private:
|
|
197
|
+
template <typename OnceFlag, typename F, typename... Args>
|
|
198
|
+
friend void call_once(OnceFlag&, F&&, Args&&...);
|
|
199
|
+
|
|
200
|
+
template <typename OnceFlag>
|
|
201
|
+
friend bool test_once(OnceFlag const& flag) noexcept;
|
|
202
|
+
|
|
203
|
+
template <typename OnceFlag>
|
|
204
|
+
friend void reset_once(OnceFlag&) noexcept;
|
|
205
|
+
|
|
206
|
+
template <typename OnceFlag>
|
|
207
|
+
friend void set_once(OnceFlag&) noexcept;
|
|
208
|
+
|
|
209
|
+
template <typename F, typename... Args>
|
|
210
|
+
FOLLY_NOINLINE void call_once_slow(F&& f, Args&&... args) {
|
|
211
|
+
folly::MicroLock::LockGuardWithData guard(mutex_);
|
|
212
|
+
if (guard.loadedValue() != 0) {
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
invoke(std::forward<F>(f), std::forward<Args>(args)...);
|
|
216
|
+
guard.storeValue(1);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
template <typename OnceFlag, typename F, typename... Args>
|
|
220
|
+
friend bool try_call_once(OnceFlag&, F&&, Args&&...) noexcept;
|
|
221
|
+
|
|
222
|
+
template <typename F, typename... Args>
|
|
223
|
+
FOLLY_NOINLINE bool try_call_once_slow(F&& f, Args&&... args) noexcept {
|
|
224
|
+
folly::MicroLock::LockGuardWithData guard(mutex_);
|
|
225
|
+
if (guard.loadedValue() != 0) {
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
const auto pass = static_cast<bool>(
|
|
229
|
+
invoke(std::forward<F>(f), std::forward<Args>(args)...));
|
|
230
|
+
guard.storeValue(pass ? 1 : 0);
|
|
231
|
+
return pass;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
FOLLY_ALWAYS_INLINE bool test_once() const noexcept {
|
|
235
|
+
return mutex_.load(std::memory_order_acquire) != 0;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
FOLLY_ALWAYS_INLINE void reset_once() noexcept {
|
|
239
|
+
folly::MicroLock::LockGuardWithData guard(mutex_);
|
|
240
|
+
guard.storeValue(0);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
FOLLY_ALWAYS_INLINE void set_once() noexcept {
|
|
244
|
+
folly::MicroLock::LockGuardWithData guard(mutex_);
|
|
245
|
+
guard.storeValue(1);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
folly::MicroLock mutex_;
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
static_assert(
|
|
252
|
+
sizeof(compact_once_flag) == 1, "compact_once_flag should be 1 byte");
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* The flag type to be used with call_once. An instance of basic_once_flag.
|
|
256
|
+
*
|
|
257
|
+
* Does not work with std::call_once.
|
|
258
|
+
*
|
|
259
|
+
* mimic: std::once_flag
|
|
260
|
+
*/
|
|
261
|
+
using once_flag = basic_once_flag<SharedMutex>;
|
|
262
|
+
|
|
263
|
+
} // namespace folly
|