react-native-windows 0.84.0 → 0.84.1
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/ReactCommon/ReactCommon.vcxproj +0 -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,767 @@
|
|
|
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 <algorithm>
|
|
20
|
+
#include <atomic>
|
|
21
|
+
#include <cstdint>
|
|
22
|
+
#include <cstring>
|
|
23
|
+
#include <memory>
|
|
24
|
+
#include <system_error>
|
|
25
|
+
|
|
26
|
+
#include <folly/CPortability.h>
|
|
27
|
+
#include <folly/IndexedMemPool.h>
|
|
28
|
+
#include <folly/Likely.h>
|
|
29
|
+
#include <folly/Portability.h>
|
|
30
|
+
#include <folly/Traits.h>
|
|
31
|
+
#include <folly/detail/StaticSingletonManager.h>
|
|
32
|
+
#include <folly/lang/Aligned.h>
|
|
33
|
+
#include <folly/lang/SafeAssert.h>
|
|
34
|
+
#include <folly/synchronization/AtomicStruct.h>
|
|
35
|
+
#include <folly/synchronization/SaturatingSemaphore.h>
|
|
36
|
+
|
|
37
|
+
namespace folly {
|
|
38
|
+
|
|
39
|
+
template <
|
|
40
|
+
template <typename> class Atom = std::atomic,
|
|
41
|
+
class BatonType = SaturatingSemaphore<true, Atom>>
|
|
42
|
+
struct LifoSemImpl;
|
|
43
|
+
|
|
44
|
+
/// LifoSem is a semaphore that wakes its waiters in a manner intended to
|
|
45
|
+
/// maximize performance rather than fairness. It should be preferred
|
|
46
|
+
/// to a mutex+condvar or POSIX sem_t solution when all of the waiters
|
|
47
|
+
/// are equivalent. It is faster than a condvar or sem_t, and it has a
|
|
48
|
+
/// shutdown state that might save you a lot of complexity when it comes
|
|
49
|
+
/// time to shut down your work pipelines. LifoSem is larger than sem_t,
|
|
50
|
+
/// but that is only because it uses padding and alignment to avoid
|
|
51
|
+
/// false sharing.
|
|
52
|
+
///
|
|
53
|
+
/// LifoSem allows multi-post and multi-tryWait, and provides a shutdown
|
|
54
|
+
/// state that awakens all waiters. LifoSem is faster than sem_t because
|
|
55
|
+
/// it performs exact wakeups, so it often requires fewer system calls.
|
|
56
|
+
/// It provides all of the functionality of sem_t except for timed waiting.
|
|
57
|
+
/// It is called LifoSem because its wakeup policy is approximately LIFO,
|
|
58
|
+
/// rather than the usual FIFO.
|
|
59
|
+
///
|
|
60
|
+
/// The core semaphore operations provided are:
|
|
61
|
+
///
|
|
62
|
+
/// -- post() -- if there is a pending waiter, wake it up, otherwise
|
|
63
|
+
/// increment the value of the semaphore. If the value of the semaphore
|
|
64
|
+
/// is already 2^32-1, does nothing. Compare to sem_post().
|
|
65
|
+
///
|
|
66
|
+
/// -- post(n) -- equivalent to n calls to post(), but much more efficient.
|
|
67
|
+
/// sem_t has no equivalent to this method.
|
|
68
|
+
///
|
|
69
|
+
/// -- bool tryWait() -- if the semaphore's value is positive, decrements it
|
|
70
|
+
/// and returns true, otherwise returns false. Compare to sem_trywait().
|
|
71
|
+
///
|
|
72
|
+
/// -- uint32_t tryWait(uint32_t n) -- attempts to decrement the semaphore's
|
|
73
|
+
/// value by n, returning the amount by which it actually was decremented
|
|
74
|
+
/// (a value from 0 to n inclusive). Not atomic. Equivalent to n calls
|
|
75
|
+
/// to tryWait(). sem_t has no equivalent to this method.
|
|
76
|
+
///
|
|
77
|
+
/// -- wait() -- waits until tryWait() can succeed. Compare to sem_wait().
|
|
78
|
+
///
|
|
79
|
+
/// -- timed wait variants - will wait until timeout. Note when these
|
|
80
|
+
/// timeout, the current implementation takes a lock, blocking
|
|
81
|
+
/// concurrent pushes and pops. (If timed wait calls are
|
|
82
|
+
/// substantial, consider re-working this code to be lock-free).
|
|
83
|
+
///
|
|
84
|
+
/// LifoSem also has the notion of a shutdown state, in which any calls
|
|
85
|
+
/// that would block (or are already blocked) throw ShutdownSemError.
|
|
86
|
+
/// Note the difference between a call to wait() and a call to wait()
|
|
87
|
+
/// that might block. In the former case tryWait() would succeed, and no
|
|
88
|
+
/// isShutdown() check is performed. In the latter case an exception is
|
|
89
|
+
/// thrown. This behavior allows a LifoSem controlling work distribution
|
|
90
|
+
/// to drain. If you want to immediately stop all waiting on shutdown,
|
|
91
|
+
/// you can just check isShutdown() yourself (preferrably wrapped in
|
|
92
|
+
/// an UNLIKELY). This fast-stop behavior is easy to add, but difficult
|
|
93
|
+
/// to remove if you want the draining behavior, which is why we have
|
|
94
|
+
/// chosen the former.
|
|
95
|
+
///
|
|
96
|
+
/// All LifoSem operations except valueGuess() are guaranteed to be
|
|
97
|
+
/// linearizable.
|
|
98
|
+
typedef LifoSemImpl<> LifoSem;
|
|
99
|
+
|
|
100
|
+
/// The exception thrown when wait()ing on an isShutdown() LifoSem
|
|
101
|
+
class FOLLY_EXPORT ShutdownSemError : public std::runtime_error {
|
|
102
|
+
public:
|
|
103
|
+
using std::runtime_error::runtime_error;
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
namespace detail {
|
|
107
|
+
|
|
108
|
+
// Internally, a LifoSem is either a value or a linked list of wait nodes.
|
|
109
|
+
// This union is captured in the LifoSemHead type, which holds either a
|
|
110
|
+
// value or an indexed pointer to the list. LifoSemHead itself is a value
|
|
111
|
+
// type, the head is a mutable atomic box containing a LifoSemHead value.
|
|
112
|
+
// Each wait node corresponds to exactly one waiter. Values can flow
|
|
113
|
+
// through the semaphore either by going into and out of the head's value,
|
|
114
|
+
// or by direct communication from a poster to a waiter. The former path
|
|
115
|
+
// is taken when there are no pending waiters, the latter otherwise. The
|
|
116
|
+
// general flow of a post is to try to increment the value or pop-and-post
|
|
117
|
+
// a wait node. Either of those have the effect of conveying one semaphore
|
|
118
|
+
// unit. Waiting is the opposite, either a decrement of the value or
|
|
119
|
+
// push-and-wait of a wait node. The generic LifoSemBase abstracts the
|
|
120
|
+
// actual mechanism by which a wait node's post->wait communication is
|
|
121
|
+
// performed, which is why we have LifoSemRawNode and LifoSemNode.
|
|
122
|
+
|
|
123
|
+
/// LifoSemRawNode is the actual pooled storage that backs LifoSemNode
|
|
124
|
+
/// for user-specified Handoff types. This is done so that we can have
|
|
125
|
+
/// a large static IndexedMemPool of nodes, instead of per-type pools
|
|
126
|
+
template <template <typename> class Atom>
|
|
127
|
+
struct LifoSemRawNode {
|
|
128
|
+
aligned_storage_for_t<void*> raw;
|
|
129
|
+
|
|
130
|
+
/// The IndexedMemPool index of the next node in this chain, or 0
|
|
131
|
+
/// if none. This will be set to uint32_t(-1) if the node is being
|
|
132
|
+
/// posted due to a shutdown-induced wakeup
|
|
133
|
+
Atom<uint32_t> next{0};
|
|
134
|
+
|
|
135
|
+
bool isShutdownNotice() const {
|
|
136
|
+
return next.load(std::memory_order_relaxed) == uint32_t(-1);
|
|
137
|
+
}
|
|
138
|
+
void clearShutdownNotice() { next.store(0, std::memory_order_relaxed); }
|
|
139
|
+
void setShutdownNotice() {
|
|
140
|
+
next.store(uint32_t(-1), std::memory_order_relaxed);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
typedef folly::IndexedMemPool<
|
|
144
|
+
LifoSemRawNode<Atom>,
|
|
145
|
+
32,
|
|
146
|
+
200,
|
|
147
|
+
Atom,
|
|
148
|
+
IndexedMemPoolTraitsLazyRecycle<LifoSemRawNode<Atom>>>
|
|
149
|
+
Pool;
|
|
150
|
+
|
|
151
|
+
/// Storage for all of the waiter nodes for LifoSem-s that use Atom
|
|
152
|
+
static Pool& pool() { return detail::createGlobal<PoolImpl, void>(); }
|
|
153
|
+
|
|
154
|
+
private:
|
|
155
|
+
struct PoolImpl : Pool {
|
|
156
|
+
/// Raw node storage is preallocated in a contiguous memory segment,
|
|
157
|
+
/// but we use an anonymous mmap so the physical memory used (RSS) will
|
|
158
|
+
/// only reflect the maximum number of waiters that actually existed
|
|
159
|
+
/// concurrently. For blocked threads the max node count is limited by the
|
|
160
|
+
/// number of threads, so we can conservatively estimate that this will be
|
|
161
|
+
/// < 10k. For LifoEventSem, however, we could potentially have many more.
|
|
162
|
+
///
|
|
163
|
+
/// On a 64-bit architecture each LifoSemRawNode takes 16 bytes. We make
|
|
164
|
+
/// the pool 1 million entries.
|
|
165
|
+
static constexpr size_t capacity = 1 << 20;
|
|
166
|
+
|
|
167
|
+
PoolImpl() : Pool(static_cast<uint32_t>(capacity)) {}
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
/// Handoff is a type not bigger than a void* that knows how to perform a
|
|
172
|
+
/// single post() -> wait() communication. It must have a post() method.
|
|
173
|
+
/// If it has a wait() method then LifoSemBase's wait() implementation
|
|
174
|
+
/// will work out of the box, otherwise you will need to specialize
|
|
175
|
+
/// LifoSemBase::wait accordingly.
|
|
176
|
+
template <typename Handoff, template <typename> class Atom>
|
|
177
|
+
struct LifoSemNode : public LifoSemRawNode<Atom> {
|
|
178
|
+
static_assert(
|
|
179
|
+
sizeof(Handoff) <= sizeof(LifoSemRawNode<Atom>::raw),
|
|
180
|
+
"Handoff too big for small-object optimization, use indirection");
|
|
181
|
+
static_assert(
|
|
182
|
+
alignof(Handoff) <= alignof(decltype(LifoSemRawNode<Atom>::raw)),
|
|
183
|
+
"Handoff alignment constraint not satisfied");
|
|
184
|
+
|
|
185
|
+
template <typename... Args>
|
|
186
|
+
void init(Args&&... args) {
|
|
187
|
+
new (&this->raw) Handoff(std::forward<Args>(args)...);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
void destroy() {
|
|
191
|
+
handoff().~Handoff();
|
|
192
|
+
if (kIsDebug) {
|
|
193
|
+
memset(&this->raw, 'F', sizeof(this->raw));
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
Handoff& handoff() {
|
|
198
|
+
return *static_cast<Handoff*>(static_cast<void*>(&this->raw));
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
const Handoff& handoff() const {
|
|
202
|
+
return *static_cast<const Handoff*>(static_cast<const void*>(&this->raw));
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
template <typename Handoff, template <typename> class Atom>
|
|
207
|
+
struct LifoSemNodeRecycler {
|
|
208
|
+
void operator()(LifoSemNode<Handoff, Atom>* elem) const {
|
|
209
|
+
elem->destroy();
|
|
210
|
+
auto idx = LifoSemRawNode<Atom>::pool().locateElem(elem);
|
|
211
|
+
LifoSemRawNode<Atom>::pool().recycleIndex(idx);
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
|
|
215
|
+
/// LifoSemHead is a 64-bit struct that holds a 32-bit value, some state
|
|
216
|
+
/// bits, and a sequence number used to avoid ABA problems in the lock-free
|
|
217
|
+
/// management of the LifoSem's wait lists. The value can either hold
|
|
218
|
+
/// an integral semaphore value (if there are no waiters) or a node index
|
|
219
|
+
/// (see IndexedMemPool) for the head of a list of wait nodes
|
|
220
|
+
class LifoSemHead {
|
|
221
|
+
// What we really want are bitfields:
|
|
222
|
+
// uint64_t data : 32; uint64_t isNodeIdx : 1; uint64_t seq : 31;
|
|
223
|
+
// Unfortunately g++ generates pretty bad code for this sometimes (I saw
|
|
224
|
+
// -O3 code from gcc 4.7.1 copying the bitfields one at a time instead of
|
|
225
|
+
// in bulk, for example). We can generate better code anyway by assuming
|
|
226
|
+
// that setters won't be given values that cause under/overflow, and
|
|
227
|
+
// putting the sequence at the end where its planned overflow doesn't
|
|
228
|
+
// need any masking.
|
|
229
|
+
//
|
|
230
|
+
// data == 0 (empty list) with isNodeIdx is conceptually the same
|
|
231
|
+
// as data == 0 (no unclaimed increments) with !isNodeIdx, we always
|
|
232
|
+
// convert the former into the latter to make the logic simpler.
|
|
233
|
+
enum {
|
|
234
|
+
IsNodeIdxShift = 32,
|
|
235
|
+
IsShutdownShift = 33,
|
|
236
|
+
IsLockedShift = 34,
|
|
237
|
+
SeqShift = 35,
|
|
238
|
+
};
|
|
239
|
+
enum : uint64_t {
|
|
240
|
+
IsNodeIdxMask = uint64_t(1) << IsNodeIdxShift,
|
|
241
|
+
IsShutdownMask = uint64_t(1) << IsShutdownShift,
|
|
242
|
+
IsLockedMask = uint64_t(1) << IsLockedShift,
|
|
243
|
+
SeqIncr = uint64_t(1) << SeqShift,
|
|
244
|
+
SeqMask = ~(SeqIncr - 1),
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
public:
|
|
248
|
+
uint64_t bits;
|
|
249
|
+
|
|
250
|
+
//////// getters
|
|
251
|
+
|
|
252
|
+
inline uint32_t idx() const {
|
|
253
|
+
assert(isNodeIdx());
|
|
254
|
+
assert(uint32_t(bits) != 0);
|
|
255
|
+
return uint32_t(bits);
|
|
256
|
+
}
|
|
257
|
+
inline uint32_t value() const {
|
|
258
|
+
assert(!isNodeIdx());
|
|
259
|
+
return uint32_t(bits);
|
|
260
|
+
}
|
|
261
|
+
inline constexpr bool isNodeIdx() const {
|
|
262
|
+
return (bits & IsNodeIdxMask) != 0;
|
|
263
|
+
}
|
|
264
|
+
inline constexpr bool isShutdown() const {
|
|
265
|
+
return (bits & IsShutdownMask) != 0;
|
|
266
|
+
}
|
|
267
|
+
inline constexpr bool isLocked() const { return (bits & IsLockedMask) != 0; }
|
|
268
|
+
inline constexpr uint32_t seq() const { return uint32_t(bits >> SeqShift); }
|
|
269
|
+
|
|
270
|
+
//////// setter-like things return a new struct
|
|
271
|
+
|
|
272
|
+
/// This should only be used for initial construction, not for setting
|
|
273
|
+
/// the value, because it clears the sequence number
|
|
274
|
+
static inline constexpr LifoSemHead fresh(uint32_t value) {
|
|
275
|
+
return LifoSemHead{value};
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/// Returns the LifoSemHead that results from popping a waiter node,
|
|
279
|
+
/// given the current waiter node's next ptr
|
|
280
|
+
inline LifoSemHead withPop(uint32_t idxNext) const {
|
|
281
|
+
assert(!isLocked());
|
|
282
|
+
assert(isNodeIdx());
|
|
283
|
+
if (idxNext == 0) {
|
|
284
|
+
// no isNodeIdx bit or data bits. Wraparound of seq bits is okay
|
|
285
|
+
return LifoSemHead{(bits & (SeqMask | IsShutdownMask)) + SeqIncr};
|
|
286
|
+
} else {
|
|
287
|
+
// preserve sequence bits (incremented with wraparound okay) and
|
|
288
|
+
// isNodeIdx bit, replace all data bits
|
|
289
|
+
return LifoSemHead{
|
|
290
|
+
(bits & (SeqMask | IsShutdownMask | IsNodeIdxMask)) + SeqIncr +
|
|
291
|
+
idxNext};
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/// Returns the LifoSemHead that results from pushing a new waiter node
|
|
296
|
+
inline LifoSemHead withPush(uint32_t _idx) const {
|
|
297
|
+
assert(!isLocked());
|
|
298
|
+
assert(isNodeIdx() || value() == 0);
|
|
299
|
+
assert(!isShutdown());
|
|
300
|
+
assert(_idx != 0);
|
|
301
|
+
return LifoSemHead{(bits & SeqMask) | IsNodeIdxMask | _idx};
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/// Returns the LifoSemHead with value increased by delta, with
|
|
305
|
+
/// saturation if the maximum value is reached
|
|
306
|
+
inline LifoSemHead withValueIncr(uint32_t delta) const {
|
|
307
|
+
assert(!isLocked());
|
|
308
|
+
assert(!isNodeIdx());
|
|
309
|
+
auto rv = LifoSemHead{bits + SeqIncr + delta};
|
|
310
|
+
if (FOLLY_UNLIKELY(rv.isNodeIdx())) {
|
|
311
|
+
// value has overflowed into the isNodeIdx bit
|
|
312
|
+
rv = LifoSemHead{(rv.bits & ~IsNodeIdxMask) | (IsNodeIdxMask - 1)};
|
|
313
|
+
}
|
|
314
|
+
return rv;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/// Returns the LifoSemHead that results from decrementing the value
|
|
318
|
+
inline LifoSemHead withValueDecr(uint32_t delta) const {
|
|
319
|
+
assert(!isLocked());
|
|
320
|
+
assert(delta > 0 && delta <= value());
|
|
321
|
+
return LifoSemHead{bits + SeqIncr - delta};
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/// Returns the LifoSemHead with the same state as the current node,
|
|
325
|
+
/// but with the shutdown bit set
|
|
326
|
+
inline LifoSemHead withShutdown() const {
|
|
327
|
+
return LifoSemHead{bits | IsShutdownMask};
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// Returns LifoSemHead with lock bit set, but rest of bits unchanged.
|
|
331
|
+
inline LifoSemHead withLock() const {
|
|
332
|
+
assert(!isLocked());
|
|
333
|
+
return LifoSemHead{bits | IsLockedMask};
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// Returns LifoSemHead with lock bit unset, and updated seqno based
|
|
337
|
+
// on idx.
|
|
338
|
+
inline LifoSemHead withoutLock(uint32_t idxNext) const {
|
|
339
|
+
assert(isLocked());
|
|
340
|
+
// We need to treat this as a pop, as we may change the list head.
|
|
341
|
+
return LifoSemHead{bits & ~IsLockedMask}.withPop(idxNext);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
inline constexpr bool operator==(const LifoSemHead& rhs) const {
|
|
345
|
+
return bits == rhs.bits;
|
|
346
|
+
}
|
|
347
|
+
inline constexpr bool operator!=(const LifoSemHead& rhs) const {
|
|
348
|
+
return !(*this == rhs);
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
|
|
352
|
+
/// LifoSemBase is the engine for several different types of LIFO
|
|
353
|
+
/// semaphore. LifoSemBase handles storage of positive semaphore values
|
|
354
|
+
/// and wait nodes, but the actual waiting and notification mechanism is
|
|
355
|
+
/// up to the client.
|
|
356
|
+
///
|
|
357
|
+
/// The Handoff type is responsible for arranging one wakeup notification.
|
|
358
|
+
/// See LifoSemNode for more information on how to make your own.
|
|
359
|
+
template <typename Handoff, template <typename> class Atom = std::atomic>
|
|
360
|
+
struct LifoSemBase {
|
|
361
|
+
/// Currently unused, only for compatibility with ThrottledLifoSem.
|
|
362
|
+
struct Options {};
|
|
363
|
+
|
|
364
|
+
/// Constructor
|
|
365
|
+
constexpr explicit LifoSemBase(uint32_t initialValue = 0)
|
|
366
|
+
: LifoSemBase({}, initialValue) {}
|
|
367
|
+
constexpr explicit LifoSemBase(const Options&, uint32_t initialValue = 0)
|
|
368
|
+
: head_(std::in_place, LifoSemHead::fresh(initialValue)) {}
|
|
369
|
+
|
|
370
|
+
LifoSemBase(LifoSemBase const&) = delete;
|
|
371
|
+
LifoSemBase& operator=(LifoSemBase const&) = delete;
|
|
372
|
+
|
|
373
|
+
/// Returns true on a successful handoff, and return false without changing
|
|
374
|
+
/// the value of the semaphore if there are no waiters
|
|
375
|
+
bool tryPost() {
|
|
376
|
+
auto idx = incrOrPop(1, true);
|
|
377
|
+
if (idx != 0) {
|
|
378
|
+
idxToNode(idx).handoff().post();
|
|
379
|
+
return true;
|
|
380
|
+
}
|
|
381
|
+
return false;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/// Silently saturates if value is already 2^32-1
|
|
385
|
+
bool post() {
|
|
386
|
+
auto idx = incrOrPop(1);
|
|
387
|
+
if (idx != 0) {
|
|
388
|
+
idxToNode(idx).handoff().post();
|
|
389
|
+
return true;
|
|
390
|
+
}
|
|
391
|
+
return false;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/// Equivalent to n calls to post(), except may be much more efficient.
|
|
395
|
+
/// At any point in time at which the semaphore's value would exceed
|
|
396
|
+
/// 2^32-1 if tracked with infinite precision, it may be silently
|
|
397
|
+
/// truncated to 2^32-1. This saturation is not guaranteed to be exact,
|
|
398
|
+
/// although it is guaranteed that overflow won't result in wrap-around.
|
|
399
|
+
/// There would be a substantial performance and complexity cost in
|
|
400
|
+
/// guaranteeing exact saturation (similar to the cost of maintaining
|
|
401
|
+
/// linearizability near the zero value, but without as much of
|
|
402
|
+
/// a benefit).
|
|
403
|
+
void post(uint32_t n) {
|
|
404
|
+
uint32_t idx;
|
|
405
|
+
while (n > 0 && (idx = incrOrPop(n)) != 0) {
|
|
406
|
+
// pop accounts for only 1
|
|
407
|
+
idxToNode(idx).handoff().post();
|
|
408
|
+
--n;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/// Returns true iff shutdown() has been called
|
|
413
|
+
bool isShutdown() const {
|
|
414
|
+
return FOLLY_UNLIKELY(head_->load(std::memory_order_acquire).isShutdown());
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/// Prevents blocking on this semaphore, causing all blocking wait()
|
|
418
|
+
/// calls to throw ShutdownSemError. Both currently blocked wait() and
|
|
419
|
+
/// future calls to wait() for which tryWait() would return false will
|
|
420
|
+
/// cause an exception. Calls to wait() for which the matching post()
|
|
421
|
+
/// has already occurred will proceed normally.
|
|
422
|
+
void shutdown() {
|
|
423
|
+
// first set the shutdown bit
|
|
424
|
+
auto h = head_->load(std::memory_order_acquire);
|
|
425
|
+
while (!h.isShutdown()) {
|
|
426
|
+
if (h.isLocked()) {
|
|
427
|
+
std::this_thread::yield();
|
|
428
|
+
h = head_->load(std::memory_order_acquire);
|
|
429
|
+
continue;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
if (head_->compare_exchange_strong(h, h.withShutdown())) {
|
|
433
|
+
// success
|
|
434
|
+
h = h.withShutdown();
|
|
435
|
+
break;
|
|
436
|
+
}
|
|
437
|
+
// compare_exchange_strong rereads h, retry
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
// now wake up any waiters
|
|
441
|
+
while (h.isNodeIdx()) {
|
|
442
|
+
if (h.isLocked()) {
|
|
443
|
+
std::this_thread::yield();
|
|
444
|
+
h = head_->load(std::memory_order_acquire);
|
|
445
|
+
continue;
|
|
446
|
+
}
|
|
447
|
+
auto& node = idxToNode(h.idx());
|
|
448
|
+
auto repl = h.withPop(node.next.load(std::memory_order_relaxed));
|
|
449
|
+
if (head_->compare_exchange_strong(h, repl)) {
|
|
450
|
+
// successful pop, wake up the waiter and move on. The next
|
|
451
|
+
// field is used to convey that this wakeup didn't consume a value
|
|
452
|
+
node.setShutdownNotice();
|
|
453
|
+
node.handoff().post();
|
|
454
|
+
h = repl;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
/// Returns true iff value was decremented
|
|
460
|
+
bool tryWait() {
|
|
461
|
+
uint32_t n = 1;
|
|
462
|
+
auto rv = decrOrPush(n, 0);
|
|
463
|
+
assert(
|
|
464
|
+
(rv == WaitResult::DECR && n == 0) ||
|
|
465
|
+
(rv != WaitResult::DECR && n == 1));
|
|
466
|
+
// SHUTDOWN is okay here, since we don't actually wait
|
|
467
|
+
return rv == WaitResult::DECR;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/// Equivalent to (but may be much more efficient than) n calls to
|
|
471
|
+
/// tryWait(). Returns the total amount by which the semaphore's value
|
|
472
|
+
/// was decreased
|
|
473
|
+
uint32_t tryWait(uint32_t n) {
|
|
474
|
+
auto const orig = n;
|
|
475
|
+
while (n > 0) {
|
|
476
|
+
#ifndef NDEBUG
|
|
477
|
+
auto prev = n;
|
|
478
|
+
#endif
|
|
479
|
+
auto rv = decrOrPush(n, 0);
|
|
480
|
+
assert(
|
|
481
|
+
(rv == WaitResult::DECR && n < prev) ||
|
|
482
|
+
(rv != WaitResult::DECR && n == prev));
|
|
483
|
+
if (rv != WaitResult::DECR) {
|
|
484
|
+
break;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
return orig - n;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
/// Blocks the current thread until there is a matching post or the
|
|
491
|
+
/// semaphore is shut down. Throws ShutdownSemError if the semaphore
|
|
492
|
+
/// has been shut down and this method would otherwise be blocking.
|
|
493
|
+
/// Note that wait() doesn't throw during shutdown if tryWait() would
|
|
494
|
+
/// return true
|
|
495
|
+
void wait() {
|
|
496
|
+
auto const deadline = std::chrono::steady_clock::time_point::max();
|
|
497
|
+
auto res = try_wait_until(deadline);
|
|
498
|
+
FOLLY_SAFE_DCHECK(res, "infinity time has passed");
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
bool try_wait() { return tryWait(); }
|
|
502
|
+
|
|
503
|
+
template <typename Rep, typename Period>
|
|
504
|
+
bool try_wait_for(const std::chrono::duration<Rep, Period>& timeout) {
|
|
505
|
+
return try_wait_until(timeout + std::chrono::steady_clock::now());
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
template <typename Clock, typename Duration>
|
|
509
|
+
bool try_wait_until(
|
|
510
|
+
const std::chrono::time_point<Clock, Duration>& deadline) {
|
|
511
|
+
// early check isn't required for correctness, but is an important
|
|
512
|
+
// perf win if we can avoid allocating and deallocating a node
|
|
513
|
+
if (tryWait()) {
|
|
514
|
+
return true;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
// allocateNode() won't compile unless Handoff has a default
|
|
518
|
+
// constructor
|
|
519
|
+
UniquePtr node = allocateNode();
|
|
520
|
+
|
|
521
|
+
auto rv = tryWaitOrPush(*node);
|
|
522
|
+
if (FOLLY_UNLIKELY(rv == WaitResult::SHUTDOWN)) {
|
|
523
|
+
assert(isShutdown());
|
|
524
|
+
throw ShutdownSemError("wait() would block but semaphore is shut down");
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
if (rv == WaitResult::PUSH) {
|
|
528
|
+
if (!node->handoff().try_wait_until(deadline)) {
|
|
529
|
+
if (tryRemoveNode(*node)) {
|
|
530
|
+
return false;
|
|
531
|
+
} else {
|
|
532
|
+
// We could not remove our node. Return to waiting.
|
|
533
|
+
//
|
|
534
|
+
// This only happens if we lose a removal race with post(),
|
|
535
|
+
// so we are not likely to wait long. This is only
|
|
536
|
+
// necessary to ensure we don't return node's memory back to
|
|
537
|
+
// IndexedMemPool before post() has had a chance to post to
|
|
538
|
+
// handoff(). In a stronger memory reclamation scheme, such
|
|
539
|
+
// as hazptr or rcu, this would not be necessary.
|
|
540
|
+
node->handoff().wait();
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
if (FOLLY_UNLIKELY(node->isShutdownNotice())) {
|
|
544
|
+
// this wait() didn't consume a value, it was triggered by shutdown
|
|
545
|
+
throw ShutdownSemError(
|
|
546
|
+
"blocking wait() interrupted by semaphore shutdown");
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
// node->handoff().wait() can't return until after the node has
|
|
550
|
+
// been popped and post()ed, so it is okay for the UniquePtr to
|
|
551
|
+
// recycle the node now
|
|
552
|
+
}
|
|
553
|
+
// else node wasn't pushed, so it is safe to recycle
|
|
554
|
+
return true;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
/// Returns a guess at the current value, designed for debugging.
|
|
558
|
+
/// If there are no concurrent posters or waiters then this will
|
|
559
|
+
/// be correct
|
|
560
|
+
uint32_t valueGuess() const {
|
|
561
|
+
// this is actually linearizable, but we don't promise that because
|
|
562
|
+
// we may want to add striping in the future to help under heavy
|
|
563
|
+
// contention
|
|
564
|
+
auto h = head_->load(std::memory_order_acquire);
|
|
565
|
+
return h.isNodeIdx() ? 0 : h.value();
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
protected:
|
|
569
|
+
enum class WaitResult {
|
|
570
|
+
PUSH,
|
|
571
|
+
DECR,
|
|
572
|
+
SHUTDOWN,
|
|
573
|
+
};
|
|
574
|
+
|
|
575
|
+
/// The type of a std::unique_ptr that will automatically return a
|
|
576
|
+
/// LifoSemNode to the appropriate IndexedMemPool
|
|
577
|
+
typedef std::
|
|
578
|
+
unique_ptr<LifoSemNode<Handoff, Atom>, LifoSemNodeRecycler<Handoff, Atom>>
|
|
579
|
+
UniquePtr;
|
|
580
|
+
|
|
581
|
+
/// Returns a node that can be passed to decrOrLink
|
|
582
|
+
template <typename... Args>
|
|
583
|
+
UniquePtr allocateNode(Args&&... args) {
|
|
584
|
+
auto idx = LifoSemRawNode<Atom>::pool().allocIndex();
|
|
585
|
+
if (idx != 0) {
|
|
586
|
+
auto& node = idxToNode(idx);
|
|
587
|
+
node.clearShutdownNotice();
|
|
588
|
+
try {
|
|
589
|
+
node.init(std::forward<Args>(args)...);
|
|
590
|
+
} catch (...) {
|
|
591
|
+
LifoSemRawNode<Atom>::pool().recycleIndex(idx);
|
|
592
|
+
throw;
|
|
593
|
+
}
|
|
594
|
+
return UniquePtr(&node);
|
|
595
|
+
} else {
|
|
596
|
+
return UniquePtr();
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
/// Returns DECR if the semaphore value was decremented (and waiterNode
|
|
601
|
+
/// was untouched), PUSH if a reference to the wait node was pushed,
|
|
602
|
+
/// or SHUTDOWN if decrement was not possible and push wasn't allowed
|
|
603
|
+
/// because isShutdown(). Ownership of the wait node remains the
|
|
604
|
+
/// responsibility of the caller, who must not release it until after
|
|
605
|
+
/// the node's Handoff has been posted.
|
|
606
|
+
WaitResult tryWaitOrPush(LifoSemNode<Handoff, Atom>& waiterNode) {
|
|
607
|
+
uint32_t n = 1;
|
|
608
|
+
return decrOrPush(n, nodeToIdx(waiterNode));
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
// Locks the list head (blocking concurrent pushes and pops)
|
|
612
|
+
// and attempts to remove this node. Returns true if node was
|
|
613
|
+
// found and removed, false if not found.
|
|
614
|
+
bool tryRemoveNode(const LifoSemNode<Handoff, Atom>& removenode) {
|
|
615
|
+
auto removeidx = nodeToIdx(removenode);
|
|
616
|
+
auto head = head_->load(std::memory_order_acquire);
|
|
617
|
+
// Try to lock the head.
|
|
618
|
+
while (true) {
|
|
619
|
+
if (head.isLocked()) {
|
|
620
|
+
std::this_thread::yield();
|
|
621
|
+
head = head_->load(std::memory_order_acquire);
|
|
622
|
+
continue;
|
|
623
|
+
}
|
|
624
|
+
if (!head.isNodeIdx()) {
|
|
625
|
+
return false;
|
|
626
|
+
}
|
|
627
|
+
if (head_->compare_exchange_weak(
|
|
628
|
+
head,
|
|
629
|
+
head.withLock(),
|
|
630
|
+
std::memory_order_acquire,
|
|
631
|
+
std::memory_order_relaxed)) {
|
|
632
|
+
break;
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
// Update local var to what head_ is, for better assert() checking.
|
|
636
|
+
head = head.withLock();
|
|
637
|
+
bool result = false;
|
|
638
|
+
auto idx = head.idx();
|
|
639
|
+
if (idx == removeidx) {
|
|
640
|
+
// pop from head. Head seqno is updated.
|
|
641
|
+
head_->store(
|
|
642
|
+
head.withoutLock(removenode.next.load(std::memory_order_relaxed)),
|
|
643
|
+
std::memory_order_release);
|
|
644
|
+
return true;
|
|
645
|
+
}
|
|
646
|
+
auto node = &idxToNode(idx);
|
|
647
|
+
idx = node->next.load(std::memory_order_relaxed);
|
|
648
|
+
while (idx) {
|
|
649
|
+
if (idx == removeidx) {
|
|
650
|
+
// Pop from mid-list.
|
|
651
|
+
node->next.store(
|
|
652
|
+
removenode.next.load(std::memory_order_relaxed),
|
|
653
|
+
std::memory_order_relaxed);
|
|
654
|
+
result = true;
|
|
655
|
+
break;
|
|
656
|
+
}
|
|
657
|
+
node = &idxToNode(idx);
|
|
658
|
+
idx = node->next.load(std::memory_order_relaxed);
|
|
659
|
+
}
|
|
660
|
+
// Unlock and return result
|
|
661
|
+
head_->store(head.withoutLock(head.idx()), std::memory_order_release);
|
|
662
|
+
return result;
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
private:
|
|
666
|
+
cacheline_aligned<folly::AtomicStruct<LifoSemHead, Atom>> head_;
|
|
667
|
+
|
|
668
|
+
static LifoSemNode<Handoff, Atom>& idxToNode(uint32_t idx) {
|
|
669
|
+
auto raw = &LifoSemRawNode<Atom>::pool()[idx];
|
|
670
|
+
return *static_cast<LifoSemNode<Handoff, Atom>*>(raw);
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
static uint32_t nodeToIdx(const LifoSemNode<Handoff, Atom>& node) {
|
|
674
|
+
return LifoSemRawNode<Atom>::pool().locateElem(&node);
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
/// Either increments by n and returns 0, or pops a node and returns it.
|
|
678
|
+
/// If n + the stripe's value overflows, then the stripe's value
|
|
679
|
+
/// saturates silently at 2^32-1
|
|
680
|
+
uint32_t incrOrPop(uint32_t n, const bool skip_increment = false) {
|
|
681
|
+
while (true) {
|
|
682
|
+
assert(n > 0);
|
|
683
|
+
|
|
684
|
+
auto head = head_->load(std::memory_order_acquire);
|
|
685
|
+
if (head.isLocked()) {
|
|
686
|
+
std::this_thread::yield();
|
|
687
|
+
continue;
|
|
688
|
+
}
|
|
689
|
+
if (head.isNodeIdx()) {
|
|
690
|
+
auto& node = idxToNode(head.idx());
|
|
691
|
+
if (head_->compare_exchange_strong(
|
|
692
|
+
head,
|
|
693
|
+
head.withPop(node.next.load(std::memory_order_relaxed)))) {
|
|
694
|
+
// successful pop
|
|
695
|
+
return head.idx();
|
|
696
|
+
}
|
|
697
|
+
} else {
|
|
698
|
+
if (skip_increment) {
|
|
699
|
+
return 0;
|
|
700
|
+
}
|
|
701
|
+
auto after = head.withValueIncr(n);
|
|
702
|
+
if (head_->compare_exchange_strong(head, after)) {
|
|
703
|
+
// successful incr
|
|
704
|
+
return 0;
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
// retry
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
/// Returns DECR if some amount was decremented, with that amount
|
|
712
|
+
/// subtracted from n. If n is 1 and this function returns DECR then n
|
|
713
|
+
/// must be 0 afterward. Returns PUSH if no value could be decremented
|
|
714
|
+
/// and idx was pushed, or if idx was zero and no push was performed but
|
|
715
|
+
/// a push would have been performed with a valid node. Returns SHUTDOWN
|
|
716
|
+
/// if the caller should have blocked but isShutdown(). If idx == 0,
|
|
717
|
+
/// may return PUSH even after isShutdown() or may return SHUTDOWN
|
|
718
|
+
WaitResult decrOrPush(uint32_t& n, uint32_t idx) {
|
|
719
|
+
assert(n > 0);
|
|
720
|
+
|
|
721
|
+
while (true) {
|
|
722
|
+
auto head = head_->load(std::memory_order_acquire);
|
|
723
|
+
|
|
724
|
+
if (head.isLocked()) {
|
|
725
|
+
std::this_thread::yield();
|
|
726
|
+
continue;
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
if (!head.isNodeIdx() && head.value() > 0) {
|
|
730
|
+
// decr
|
|
731
|
+
auto delta = std::min(n, head.value());
|
|
732
|
+
if (head_->compare_exchange_strong(head, head.withValueDecr(delta))) {
|
|
733
|
+
n -= delta;
|
|
734
|
+
return WaitResult::DECR;
|
|
735
|
+
}
|
|
736
|
+
} else {
|
|
737
|
+
// push
|
|
738
|
+
if (idx == 0) {
|
|
739
|
+
return WaitResult::PUSH;
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
if (FOLLY_UNLIKELY(head.isShutdown())) {
|
|
743
|
+
return WaitResult::SHUTDOWN;
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
auto& node = idxToNode(idx);
|
|
747
|
+
node.next.store(
|
|
748
|
+
head.isNodeIdx() ? head.idx() : 0, std::memory_order_relaxed);
|
|
749
|
+
if (head_->compare_exchange_strong(head, head.withPush(idx))) {
|
|
750
|
+
// push succeeded
|
|
751
|
+
return WaitResult::PUSH;
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
// retry
|
|
756
|
+
}
|
|
757
|
+
};
|
|
758
|
+
|
|
759
|
+
} // namespace detail
|
|
760
|
+
|
|
761
|
+
template <template <typename> class Atom, class BatonType>
|
|
762
|
+
struct LifoSemImpl : public detail::LifoSemBase<BatonType, Atom> {
|
|
763
|
+
using Options = typename detail::LifoSemBase<BatonType, Atom>::Options;
|
|
764
|
+
using detail::LifoSemBase<BatonType, Atom>::LifoSemBase;
|
|
765
|
+
};
|
|
766
|
+
|
|
767
|
+
} // namespace folly
|