react-native-windows 0.84.0 → 0.84.2
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 +2 -17
- package/Folly/ThreadNameStub.cpp +4 -6
- package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp +1 -1
- package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj +1 -7
- package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj.filters +0 -3
- package/PropertySheets/CIBuildOptimizations.props +2 -2
- package/PropertySheets/Generated/PackageVersion.g.props +3 -3
- package/PropertySheets/JSEngine.props +1 -1
- package/PropertySheets/NuGet.LockFile.props +10 -1
- package/PropertySheets/React.Cpp.props +3 -3
- package/PropertySheets/WinUI.props +2 -1
- package/ReactCommon/ReactCommon.vcxproj +0 -5
- package/Scripts/EnableInternalWinAppSDKFeed.ps1 +12 -5
- package/Scripts/NuGetRestoreForceEvaluateAllSolutions.ps1 +61 -6
- package/Scripts/Tfs/Layout-Desktop-Headers.ps1 +4 -37
- package/Scripts/UpdateNightlyDependencies.ps1 +47 -0
- package/Scripts/creaternwapp.cmd +5 -8
- package/Scripts/creaternwlib.cmd +10 -23
- 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/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/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/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.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 +6 -6
- package/template/cpp-lib/proj/MyLib.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 +30 -4
- package/templates/cpp-lib/windows/MyLib.sln +0 -33
- package/Folly/Folly.vcxproj +0 -378
- package/Folly/Folly.vcxproj.filters +0 -558
- package/fmt/fmt.vcxproj +0 -153
- package/fmt/fmt.vcxproj.filters +0 -59
- package/fmt/pch.cpp +0 -4
- package/fmt/pch.h +0 -2
- /package/{fmt → external/fmt}/cgmanifest.json +0 -0
- /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,27 @@
|
|
|
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
|
+
#include <folly/synchronization/DistributedMutex.h>
|
|
18
|
+
|
|
19
|
+
namespace folly {
|
|
20
|
+
namespace detail {
|
|
21
|
+
namespace distributed_mutex {
|
|
22
|
+
|
|
23
|
+
template class DistributedMutex<std::atomic, true>;
|
|
24
|
+
|
|
25
|
+
} // namespace distributed_mutex
|
|
26
|
+
} // namespace detail
|
|
27
|
+
} // namespace folly
|
|
@@ -0,0 +1,342 @@
|
|
|
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
|
+
#pragma once
|
|
18
|
+
|
|
19
|
+
#include <atomic>
|
|
20
|
+
#include <chrono>
|
|
21
|
+
#include <cstdint>
|
|
22
|
+
|
|
23
|
+
#include <folly/Optional.h>
|
|
24
|
+
#include <folly/functional/Invoke.h>
|
|
25
|
+
|
|
26
|
+
namespace folly {
|
|
27
|
+
namespace detail {
|
|
28
|
+
namespace distributed_mutex {
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* DistributedMutex is a small, exclusive-only mutex that distributes the
|
|
32
|
+
* bookkeeping required for mutual exclusion in the stacks of threads that are
|
|
33
|
+
* contending for it. It has a mode that can combine critical sections when
|
|
34
|
+
* the mutex experiences contention; this allows the implementation to elide
|
|
35
|
+
* several expensive coherence and synchronization operations to boost
|
|
36
|
+
* throughput, surpassing even atomic instructions in some cases. It has a
|
|
37
|
+
* smaller memory footprint than std::mutex, a similar level of fairness
|
|
38
|
+
* (better in some cases) and no dependencies on heap allocation. It is the
|
|
39
|
+
* same width as a single pointer (8 bytes on most platforms), where on the
|
|
40
|
+
* other hand, std::mutex and pthread_mutex_t are both 40 bytes. It is larger
|
|
41
|
+
* than some of the other smaller locks, but the wide majority of cases using
|
|
42
|
+
* the small locks are wasting the difference in alignment padding anyway
|
|
43
|
+
*
|
|
44
|
+
* Benchmark results are good - at the time of writing, in the contended case,
|
|
45
|
+
* for lock/unlock based critical sections, it is about 4-5x faster than the
|
|
46
|
+
* smaller locks and about ~2x faster than std::mutex. When used in
|
|
47
|
+
* combinable mode, it is much faster than the alternatives, going more than
|
|
48
|
+
* 10x faster than the small locks, about 6x faster than std::mutex, 2-3x
|
|
49
|
+
* faster than flat combining and even faster than std::atomic<> in some
|
|
50
|
+
* cases, allowing more work with higher throughput. In the uncontended case,
|
|
51
|
+
* it is a few cycles faster than folly::MicroLock but a bit slower than
|
|
52
|
+
* std::mutex. DistributedMutex is also resistent to tail latency pathalogies
|
|
53
|
+
* unlike many of the other mutexes in use, which sleep for large time
|
|
54
|
+
* quantums to reduce spin churn, this causes elevated latencies for threads
|
|
55
|
+
* that enter the sleep cycle. The tail latency of lock acquisition can go up
|
|
56
|
+
* to 10x lower because of a more deterministic scheduling algorithm that is
|
|
57
|
+
* managed almost entirely in userspace. Detailed results comparing the
|
|
58
|
+
* throughput and latencies of different mutex implementations and atomics are
|
|
59
|
+
* at the bottom of folly/synchronization/test/SmallLocksBenchmark.cpp
|
|
60
|
+
*
|
|
61
|
+
* Theoretically, write locks promote concurrency when the critical sections
|
|
62
|
+
* are small as most of the work is done outside the lock. And indeed,
|
|
63
|
+
* performant concurrent applications go through several pains to limit the
|
|
64
|
+
* amount of work they do while holding a lock. However, most times, the
|
|
65
|
+
* synchronization and scheduling overhead of a write lock in the critical
|
|
66
|
+
* path is so high, that after a certain point, making critical sections
|
|
67
|
+
* smaller does not actually increase the concurrency of the application and
|
|
68
|
+
* throughput plateaus. DistributedMutex moves this breaking point to the
|
|
69
|
+
* level of hardware atomic instructions, so applications keep getting
|
|
70
|
+
* concurrency even under very high contention. It does this by reducing
|
|
71
|
+
* cache misses and contention in userspace and in the kernel by making each
|
|
72
|
+
* thread wait on a thread local node and futex. When combined critical
|
|
73
|
+
* sections are used DistributedMutex leverages template metaprogramming to
|
|
74
|
+
* allow the mutex to make better synchronization decisions based on the
|
|
75
|
+
* layout of the input and output data. This allows threads to keep working
|
|
76
|
+
* only on their own cache lines without requiring cache coherence operations
|
|
77
|
+
* when a mutex experiences heavy contention
|
|
78
|
+
*
|
|
79
|
+
* Non-timed mutex acquisitions are scheduled through intrusive LIFO
|
|
80
|
+
* contention chains. Each thread starts by spinning for a short quantum and
|
|
81
|
+
* falls back to two phased sleeping. Enqueue operations are lock free and
|
|
82
|
+
* are piggybacked off mutex acquisition attempts. The LIFO behavior of a
|
|
83
|
+
* contention chain is good in the case where the mutex is held for a short
|
|
84
|
+
* amount of time, as the head of the chain is likely to not have slept on
|
|
85
|
+
* futex() after exhausting its spin quantum. This allow us to avoid
|
|
86
|
+
* unnecessary traversal and syscalls in the fast path with a higher
|
|
87
|
+
* probability. Even though the contention chains are LIFO, the mutex itself
|
|
88
|
+
* does not adhere to that scheduling policy globally. During contention,
|
|
89
|
+
* threads that fail to lock the mutex form a LIFO chain on the central mutex
|
|
90
|
+
* state, this chain is broken when a wakeup is scheduled, and future enqueue
|
|
91
|
+
* operations form a new chain. This makes the chains themselves LIFO, but
|
|
92
|
+
* preserves global fairness through a constant factor which is limited to the
|
|
93
|
+
* number of concurrent failed mutex acquisition attempts. This binds the
|
|
94
|
+
* last in first out behavior to the number of contending threads and helps
|
|
95
|
+
* prevent starvation and latency outliers
|
|
96
|
+
*
|
|
97
|
+
* This strategy of waking up wakers one by one in a queue does not scale well
|
|
98
|
+
* when the number of threads goes past the number of cores. At which point
|
|
99
|
+
* preemption causes elevated lock acquisition latencies. DistributedMutex
|
|
100
|
+
* implements a hardware timestamp publishing heuristic to detect and adapt to
|
|
101
|
+
* preemption.
|
|
102
|
+
*
|
|
103
|
+
* DistributedMutex does not have the typical mutex API - it does not satisfy
|
|
104
|
+
* the Lockable concept. It requires the user to maintain ephemeral bookkeeping
|
|
105
|
+
* and pass that bookkeeping around to unlock() calls. The API overhead,
|
|
106
|
+
* however, comes for free when you wrap this mutex for usage with
|
|
107
|
+
* std::unique_lock, which is the recommended usage (std::lock_guard, in
|
|
108
|
+
* optimized mode, has no performance benefit over std::unique_lock, so has been
|
|
109
|
+
* omitted). A benefit of this API is that it disallows incorrect usage where a
|
|
110
|
+
* thread unlocks a mutex that it does not own, thinking a mutex is functionally
|
|
111
|
+
* identical to a binary semaphore, which, unlike a mutex, is a suitable
|
|
112
|
+
* primitive for that usage
|
|
113
|
+
*
|
|
114
|
+
* Combined critical sections allow the implementation to elide several
|
|
115
|
+
* expensive operations during the lifetime of a critical section that cause
|
|
116
|
+
* slowdowns with regular lock/unlock based usage. DistributedMutex resolves
|
|
117
|
+
* contention through combining up to a constant factor of 2 contention chains
|
|
118
|
+
* to prevent issues with fairness and latency outliers, so we retain the
|
|
119
|
+
* fairness benefits of the lock/unlock implementation with no noticeable
|
|
120
|
+
* regression when switching between the lock methods. Despite the efficiency
|
|
121
|
+
* benefits, combined critical sections can only be used when the critical
|
|
122
|
+
* section does not depend on thread local state and does not introduce new
|
|
123
|
+
* dependencies between threads when the critical section gets combined. For
|
|
124
|
+
* example, locking or unlocking an unrelated mutex in a combined critical
|
|
125
|
+
* section might lead to unexpected results or even undefined behavior. This
|
|
126
|
+
* can happen if, for example, a different thread unlocks a mutex locked by
|
|
127
|
+
* the calling thread, leading to undefined behavior as the mutex might not
|
|
128
|
+
* allow locking and unlocking from unrelated threads (the posix and C++
|
|
129
|
+
* standard disallow this usage for their mutexes)
|
|
130
|
+
*
|
|
131
|
+
* Timed locking through DistributedMutex is implemented through a centralized
|
|
132
|
+
* algorithm. The underlying contention-chains framework used in
|
|
133
|
+
* DistributedMutex is not abortable so we build abortability on the side.
|
|
134
|
+
* All waiters wait on the central mutex state, by setting and resetting bits
|
|
135
|
+
* within the pointer-length word. Since pointer length atomic integers are
|
|
136
|
+
* incompatible with futex(FUTEX_WAIT) on most systems, a non-standard
|
|
137
|
+
* implementation of futex() is used, where wait queues are managed in
|
|
138
|
+
* user-space (see p1135r0 and folly::ParkingLot for more)
|
|
139
|
+
*/
|
|
140
|
+
template <
|
|
141
|
+
template <typename> class Atomic = std::atomic,
|
|
142
|
+
bool TimePublishing = true>
|
|
143
|
+
class DistributedMutex {
|
|
144
|
+
public:
|
|
145
|
+
class DistributedMutexStateProxy;
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* DistributedMutex is only default constructible, it can neither be moved
|
|
149
|
+
* nor copied
|
|
150
|
+
*/
|
|
151
|
+
DistributedMutex();
|
|
152
|
+
DistributedMutex(DistributedMutex&&) = delete;
|
|
153
|
+
DistributedMutex(const DistributedMutex&) = delete;
|
|
154
|
+
DistributedMutex& operator=(DistributedMutex&&) = delete;
|
|
155
|
+
DistributedMutex& operator=(const DistributedMutex&) = delete;
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Acquires the mutex in exclusive mode
|
|
159
|
+
*
|
|
160
|
+
* This returns an ephemeral proxy that contains internal mutex state. This
|
|
161
|
+
* must be kept around for the duration of the critical section and passed
|
|
162
|
+
* subsequently to unlock() as an rvalue
|
|
163
|
+
*
|
|
164
|
+
* The proxy has no public API and is intended to be for internal usage only
|
|
165
|
+
*
|
|
166
|
+
* There are three notable cases where this method causes undefined
|
|
167
|
+
* behavior:
|
|
168
|
+
*
|
|
169
|
+
* - This is not a recursive mutex. Trying to acquire the mutex twice from
|
|
170
|
+
* the same thread without unlocking it results in undefined behavior
|
|
171
|
+
* - Thread, coroutine or fiber migrations from within a critical section
|
|
172
|
+
* are disallowed. This is because the implementation requires owning the
|
|
173
|
+
* stack frame through the execution of the critical section for both
|
|
174
|
+
* lock/unlock or combined critical sections. This also means that you
|
|
175
|
+
* cannot allow another thread, fiber or coroutine to unlock the mutex
|
|
176
|
+
* - This mutex cannot be used in a program compiled with segmented stacks,
|
|
177
|
+
* there is currently no way to detect the presence of segmented stacks
|
|
178
|
+
* at compile time or runtime, so we have no checks against this
|
|
179
|
+
*/
|
|
180
|
+
DistributedMutexStateProxy lock();
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Unlocks the mutex
|
|
184
|
+
*
|
|
185
|
+
* The proxy returned by lock must be passed to unlock as an rvalue. No
|
|
186
|
+
* other option is possible here, since the proxy is only movable and not
|
|
187
|
+
* copyable
|
|
188
|
+
*
|
|
189
|
+
* It is undefined behavior to unlock from a thread that did not lock the
|
|
190
|
+
* mutex
|
|
191
|
+
*/
|
|
192
|
+
void unlock(DistributedMutexStateProxy const&);
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Try to acquire the mutex
|
|
196
|
+
*
|
|
197
|
+
* A non blocking version of the lock() function. The returned object is
|
|
198
|
+
* contextually convertible to bool. And has the value true when the mutex
|
|
199
|
+
* was successfully acquired, false otherwise
|
|
200
|
+
*
|
|
201
|
+
* This is allowed to return false spuriously, i.e. this is not guaranteed
|
|
202
|
+
* to return true even when the mutex is currently unlocked. In the event
|
|
203
|
+
* of a failed acquisition, this does not impose any memory ordering
|
|
204
|
+
* constraints for other threads
|
|
205
|
+
*/
|
|
206
|
+
DistributedMutexStateProxy try_lock();
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Try to acquire the mutex, blocking for the given time
|
|
210
|
+
*
|
|
211
|
+
* Like try_lock(), this is allowed to fail spuriously and is not guaranteed
|
|
212
|
+
* to return false even when the mutex is currently unlocked. But only
|
|
213
|
+
* after the given time has elapsed
|
|
214
|
+
*
|
|
215
|
+
* try_lock_for() accepts a duration to block for, and try_lock_until()
|
|
216
|
+
* accepts an absolute wall clock time point
|
|
217
|
+
*/
|
|
218
|
+
template <typename Rep, typename Period>
|
|
219
|
+
DistributedMutexStateProxy try_lock_for(
|
|
220
|
+
const std::chrono::duration<Rep, Period>& duration);
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Try to acquire the lock, blocking until the given deadline
|
|
224
|
+
*
|
|
225
|
+
* Other than the difference in the meaning of the second argument, the
|
|
226
|
+
* semantics of this function are identical to try_lock_for()
|
|
227
|
+
*/
|
|
228
|
+
template <typename Clock, typename Duration>
|
|
229
|
+
DistributedMutexStateProxy try_lock_until(
|
|
230
|
+
const std::chrono::time_point<Clock, Duration>& deadline);
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Execute a task as a combined critical section
|
|
234
|
+
*
|
|
235
|
+
* Unlike traditional lock and unlock methods, lock_combine() enqueues the
|
|
236
|
+
* passed task for execution on any arbitrary thread. This allows the
|
|
237
|
+
* implementation to prevent cache line invalidations originating from
|
|
238
|
+
* expensive synchronization operations. The thread holding the lock is
|
|
239
|
+
* allowed to execute the task before unlocking, thereby forming a "combined
|
|
240
|
+
* critical section".
|
|
241
|
+
*
|
|
242
|
+
* This idea is inspired by Flat Combining. Flat Combining was introduced
|
|
243
|
+
* in the SPAA 2010 paper titled "Flat Combining and the
|
|
244
|
+
* Synchronization-Parallelism Tradeoff", by Danny Hendler, Itai Incze, Nir
|
|
245
|
+
* Shavit, and Moran Tzafrir -
|
|
246
|
+
* https://www.cs.bgu.ac.il/~hendlerd/papers/flat-combining.pdf. The
|
|
247
|
+
* implementation used here is significantly different from that described
|
|
248
|
+
* in the paper. The high-level goal of reducing the overhead of
|
|
249
|
+
* synchronization, however, is the same.
|
|
250
|
+
*
|
|
251
|
+
* Combined critical sections work best when kept simple. Since the
|
|
252
|
+
* critical section might be executed on any arbitrary thread, relying on
|
|
253
|
+
* things like thread local state or mutex locking and unlocking might cause
|
|
254
|
+
* incorrectness. Associativity is important. For example
|
|
255
|
+
*
|
|
256
|
+
* auto one = std::unique_lock{one_};
|
|
257
|
+
* two_.lock_combine([&]() {
|
|
258
|
+
* if (bar()) {
|
|
259
|
+
* one.unlock();
|
|
260
|
+
* }
|
|
261
|
+
* });
|
|
262
|
+
*
|
|
263
|
+
* This has the potential to cause undefined behavior because mutexes are
|
|
264
|
+
* only meant to be acquired and released from the owning thread. Similar
|
|
265
|
+
* errors can arise from a combined critical section introducing implicit
|
|
266
|
+
* dependencies based on the state of the combining thread. For example
|
|
267
|
+
*
|
|
268
|
+
* // thread 1
|
|
269
|
+
* auto one = std::unique_lock{one_};
|
|
270
|
+
* auto two = std::unique_lock{two_};
|
|
271
|
+
*
|
|
272
|
+
* // thread 2
|
|
273
|
+
* two_.lock_combine([&]() {
|
|
274
|
+
* auto three = std::unique_lock{three_};
|
|
275
|
+
* });
|
|
276
|
+
*
|
|
277
|
+
* Here, because we used a combined critical section, we have introduced a
|
|
278
|
+
* dependency from one -> three that might not obvious to the reader
|
|
279
|
+
*
|
|
280
|
+
* This function is exception-safe. If the passed task throws an exception,
|
|
281
|
+
* it will be propagated to the caller, even if the task is running on
|
|
282
|
+
* another thread
|
|
283
|
+
*
|
|
284
|
+
* There are three notable cases where this method causes undefined
|
|
285
|
+
* behavior:
|
|
286
|
+
*
|
|
287
|
+
* - This is not a recursive mutex. Trying to acquire the mutex twice from
|
|
288
|
+
* the same thread without unlocking it results in undefined behavior
|
|
289
|
+
* - Thread, coroutine or fiber migrations from within a critical section
|
|
290
|
+
* are disallowed. This is because the implementation requires owning the
|
|
291
|
+
* stack frame through the execution of the critical section for both
|
|
292
|
+
* lock/unlock or combined critical sections. This also means that you
|
|
293
|
+
* cannot allow another thread, fiber or coroutine to unlock the mutex
|
|
294
|
+
* - This mutex cannot be used in a program compiled with segmented stacks,
|
|
295
|
+
* there is currently no way to detect the presence of segmented stacks
|
|
296
|
+
* at compile time or runtime, so we have no checks against this
|
|
297
|
+
*/
|
|
298
|
+
template <typename Task>
|
|
299
|
+
auto lock_combine(Task task) -> folly::invoke_result_t<const Task&>;
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Try to combine a task as a combined critical section untill the given time
|
|
303
|
+
*
|
|
304
|
+
* Like the other try_lock() mehtods, this is allowed to fail spuriously,
|
|
305
|
+
* and is not guaranteed to return true even when the mutex is currently
|
|
306
|
+
* unlocked.
|
|
307
|
+
*
|
|
308
|
+
* Note that this does not necessarily have the same performance
|
|
309
|
+
* characteristics as the non-timed version of the combine method. If
|
|
310
|
+
* performance is critical, use that one instead
|
|
311
|
+
*/
|
|
312
|
+
template <typename Rep, typename Period, typename Task>
|
|
313
|
+
folly::Optional<invoke_result_t<Task&>> try_lock_combine_for(
|
|
314
|
+
const std::chrono::duration<Rep, Period>& duration, Task task);
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Try to combine a task as a combined critical section untill the given time
|
|
318
|
+
*
|
|
319
|
+
* Other than the difference in the meaning of the second argument, the
|
|
320
|
+
* semantics of this function are identical to try_lock_combine_for()
|
|
321
|
+
*/
|
|
322
|
+
template <typename Clock, typename Duration, typename Task>
|
|
323
|
+
folly::Optional<invoke_result_t<Task&>> try_lock_combine_until(
|
|
324
|
+
const std::chrono::time_point<Clock, Duration>& deadline, Task task);
|
|
325
|
+
|
|
326
|
+
private:
|
|
327
|
+
Atomic<std::uintptr_t> state_{0};
|
|
328
|
+
};
|
|
329
|
+
|
|
330
|
+
} // namespace distributed_mutex
|
|
331
|
+
} // namespace detail
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Bring the default instantiation of DistributedMutex into the folly
|
|
335
|
+
* namespace without requiring any template arguments for public usage
|
|
336
|
+
*/
|
|
337
|
+
extern template class detail::distributed_mutex::DistributedMutex<>;
|
|
338
|
+
using DistributedMutex = detail::distributed_mutex::DistributedMutex<>;
|
|
339
|
+
|
|
340
|
+
} // namespace folly
|
|
341
|
+
|
|
342
|
+
#include <folly/synchronization/DistributedMutex-inl.h>
|
|
@@ -0,0 +1,200 @@
|
|
|
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
|
+
#pragma once
|
|
18
|
+
|
|
19
|
+
#include <atomic>
|
|
20
|
+
#include <climits>
|
|
21
|
+
#include <thread>
|
|
22
|
+
|
|
23
|
+
#include <glog/logging.h>
|
|
24
|
+
|
|
25
|
+
#include <folly/Likely.h>
|
|
26
|
+
#include <folly/detail/Futex.h>
|
|
27
|
+
#include <folly/lang/Bits.h>
|
|
28
|
+
#include <folly/portability/SysTime.h>
|
|
29
|
+
#include <folly/portability/Unistd.h>
|
|
30
|
+
|
|
31
|
+
namespace folly {
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Event count: a condition variable for lock free algorithms.
|
|
35
|
+
*
|
|
36
|
+
* See http://www.1024cores.net/home/lock-free-algorithms/eventcounts for
|
|
37
|
+
* details.
|
|
38
|
+
*
|
|
39
|
+
* Event counts allow you to convert a non-blocking lock-free / wait-free
|
|
40
|
+
* algorithm into a blocking one, by isolating the blocking logic. You call
|
|
41
|
+
* prepareWait() before checking your condition and then either cancelWait()
|
|
42
|
+
* or wait() depending on whether the condition was true. When another
|
|
43
|
+
* thread makes the condition true, it must call notify() / notifyAll() just
|
|
44
|
+
* like a regular condition variable.
|
|
45
|
+
*
|
|
46
|
+
* If "<" denotes the happens-before relationship, consider 2 threads (T1 and
|
|
47
|
+
* T2) and 3 events:
|
|
48
|
+
* - E1: T1 returns from prepareWait
|
|
49
|
+
* - E2: T1 calls wait
|
|
50
|
+
* (obviously E1 < E2, intra-thread)
|
|
51
|
+
* - E3: T2 calls notifyAll
|
|
52
|
+
*
|
|
53
|
+
* If E1 < E3, then E2's wait will complete (and T1 will either wake up,
|
|
54
|
+
* or not block at all)
|
|
55
|
+
*
|
|
56
|
+
* This means that you can use an EventCount in the following manner:
|
|
57
|
+
*
|
|
58
|
+
* Waiter:
|
|
59
|
+
* if (!condition()) { // handle fast path first
|
|
60
|
+
* for (;;) {
|
|
61
|
+
* auto key = eventCount.prepareWait();
|
|
62
|
+
* if (condition()) {
|
|
63
|
+
* eventCount.cancelWait();
|
|
64
|
+
* break;
|
|
65
|
+
* } else {
|
|
66
|
+
* eventCount.wait(key);
|
|
67
|
+
* }
|
|
68
|
+
* }
|
|
69
|
+
* }
|
|
70
|
+
*
|
|
71
|
+
* (This pattern is encapsulated in await())
|
|
72
|
+
*
|
|
73
|
+
* Poster:
|
|
74
|
+
* make_condition_true();
|
|
75
|
+
* eventCount.notifyAll();
|
|
76
|
+
*
|
|
77
|
+
* Note that, just like with regular condition variables, the waiter needs to
|
|
78
|
+
* be tolerant of spurious wakeups and needs to recheck the condition after
|
|
79
|
+
* being woken up. Also, as there is no mutual exclusion implied, "checking"
|
|
80
|
+
* the condition likely means attempting an operation on an underlying
|
|
81
|
+
* data structure (push into a lock-free queue, etc) and returning true on
|
|
82
|
+
* success and false on failure.
|
|
83
|
+
*/
|
|
84
|
+
class EventCount {
|
|
85
|
+
public:
|
|
86
|
+
EventCount() noexcept : val_(0) {}
|
|
87
|
+
|
|
88
|
+
class Key {
|
|
89
|
+
friend class EventCount;
|
|
90
|
+
explicit Key(uint32_t e) noexcept : epoch_(e) {}
|
|
91
|
+
uint32_t epoch_;
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
void notify() noexcept;
|
|
95
|
+
void notifyAll() noexcept;
|
|
96
|
+
Key prepareWait() noexcept;
|
|
97
|
+
void cancelWait() noexcept;
|
|
98
|
+
void wait(Key key) noexcept;
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Wait for condition() to become true. Will clean up appropriately if
|
|
102
|
+
* condition() throws, and then rethrow.
|
|
103
|
+
*/
|
|
104
|
+
template <class Condition>
|
|
105
|
+
void await(Condition condition);
|
|
106
|
+
|
|
107
|
+
private:
|
|
108
|
+
void doNotify(int n) noexcept;
|
|
109
|
+
EventCount(const EventCount&) = delete;
|
|
110
|
+
EventCount(EventCount&&) = delete;
|
|
111
|
+
EventCount& operator=(const EventCount&) = delete;
|
|
112
|
+
EventCount& operator=(EventCount&&) = delete;
|
|
113
|
+
|
|
114
|
+
// This requires 64-bit
|
|
115
|
+
static_assert(sizeof(int) == 4, "bad platform");
|
|
116
|
+
static_assert(sizeof(uint32_t) == 4, "bad platform");
|
|
117
|
+
static_assert(sizeof(uint64_t) == 8, "bad platform");
|
|
118
|
+
static_assert(sizeof(std::atomic<uint64_t>) == 8, "bad platform");
|
|
119
|
+
static_assert(sizeof(detail::Futex<std::atomic>) == 4, "bad platform");
|
|
120
|
+
|
|
121
|
+
static constexpr size_t kEpochOffset = kIsLittleEndian ? 1 : 0;
|
|
122
|
+
|
|
123
|
+
// val_ stores the epoch in the most significant 32 bits and the
|
|
124
|
+
// waiter count in the least significant 32 bits.
|
|
125
|
+
std::atomic<uint64_t> val_;
|
|
126
|
+
|
|
127
|
+
static constexpr uint64_t kAddWaiter = uint64_t(1);
|
|
128
|
+
static constexpr uint64_t kSubWaiter = uint64_t(-1);
|
|
129
|
+
static constexpr size_t kEpochShift = 32;
|
|
130
|
+
static constexpr uint64_t kAddEpoch = uint64_t(1) << kEpochShift;
|
|
131
|
+
static constexpr uint64_t kWaiterMask = kAddEpoch - 1;
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
inline void EventCount::notify() noexcept {
|
|
135
|
+
doNotify(1);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
inline void EventCount::notifyAll() noexcept {
|
|
139
|
+
doNotify(INT_MAX);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
inline void EventCount::doNotify(int n) noexcept {
|
|
143
|
+
uint64_t prev = val_.fetch_add(kAddEpoch, std::memory_order_acq_rel);
|
|
144
|
+
if (FOLLY_UNLIKELY(prev & kWaiterMask)) {
|
|
145
|
+
detail::futexWake(
|
|
146
|
+
reinterpret_cast<detail::Futex<std::atomic>*>(&val_) + kEpochOffset, n);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
inline EventCount::Key EventCount::prepareWait() noexcept {
|
|
151
|
+
uint64_t prev = val_.fetch_add(kAddWaiter, std::memory_order_acq_rel);
|
|
152
|
+
return Key(prev >> kEpochShift);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
inline void EventCount::cancelWait() noexcept {
|
|
156
|
+
// memory_order_relaxed would suffice for correctness, but the faster
|
|
157
|
+
// #waiters gets to 0, the less likely it is that we'll do spurious wakeups
|
|
158
|
+
// (and thus system calls).
|
|
159
|
+
uint64_t prev = val_.fetch_add(kSubWaiter, std::memory_order_seq_cst);
|
|
160
|
+
DCHECK_NE((prev & kWaiterMask), 0);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
inline void EventCount::wait(Key key) noexcept {
|
|
164
|
+
while ((val_.load(std::memory_order_acquire) >> kEpochShift) == key.epoch_) {
|
|
165
|
+
detail::futexWait(
|
|
166
|
+
reinterpret_cast<detail::Futex<std::atomic>*>(&val_) + kEpochOffset,
|
|
167
|
+
key.epoch_);
|
|
168
|
+
}
|
|
169
|
+
// memory_order_relaxed would suffice for correctness, but the faster
|
|
170
|
+
// #waiters gets to 0, the less likely it is that we'll do spurious wakeups
|
|
171
|
+
// (and thus system calls)
|
|
172
|
+
uint64_t prev = val_.fetch_add(kSubWaiter, std::memory_order_seq_cst);
|
|
173
|
+
DCHECK_NE((prev & kWaiterMask), 0);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
template <class Condition>
|
|
177
|
+
void EventCount::await(Condition condition) {
|
|
178
|
+
if (condition()) {
|
|
179
|
+
return; // fast path
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// condition() is the only thing that may throw, everything else is
|
|
183
|
+
// noexcept, so we can hoist the try/catch block outside of the loop
|
|
184
|
+
try {
|
|
185
|
+
for (;;) {
|
|
186
|
+
auto key = prepareWait();
|
|
187
|
+
if (condition()) {
|
|
188
|
+
cancelWait();
|
|
189
|
+
break;
|
|
190
|
+
} else {
|
|
191
|
+
wait(key);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
} catch (...) {
|
|
195
|
+
cancelWait();
|
|
196
|
+
throw;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
} // namespace folly
|