react-native-windows 0.83.2 → 0.83.3
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/CompositionEventHandler.cpp +17 -4
- package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp +8 -4
- 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 +9 -1
- package/PropertySheets/React.Cpp.props +3 -3
- package/PropertySheets/WinUI.props +2 -1
- package/ReactCommon/ReactCommon.vcxproj +0 -5
- package/Scripts/ConfigureYarnPackageAgeGate.ps1 +25 -0
- package/Scripts/EnableInternalWinAppSDKFeed.ps1 +12 -5
- package/Scripts/NuGetRestoreForceEvaluateAllSolutions.ps1 +103 -6
- package/Scripts/RunRnwInitWindows.js +37 -0
- package/Scripts/Tfs/Layout-Desktop-Headers.ps1 +4 -37
- package/Scripts/UpdateNightlyDependencies.ps1 +47 -0
- package/Scripts/creaternwapp.cmd +30 -17
- package/Scripts/creaternwlib.cmd +36 -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 +5 -5
- 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 -376
- 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,1212 @@
|
|
|
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 <climits>
|
|
22
|
+
#include <cmath>
|
|
23
|
+
#include <iomanip>
|
|
24
|
+
#include <iostream>
|
|
25
|
+
#include <mutex>
|
|
26
|
+
|
|
27
|
+
#include <folly/Random.h>
|
|
28
|
+
#include <folly/SpinLock.h>
|
|
29
|
+
#include <folly/ThreadLocal.h>
|
|
30
|
+
#include <folly/detail/Futex.h>
|
|
31
|
+
#include <folly/lang/Align.h>
|
|
32
|
+
#include <folly/synchronization/Hazptr.h>
|
|
33
|
+
#include <folly/synchronization/WaitOptions.h>
|
|
34
|
+
#include <folly/synchronization/detail/Spin.h>
|
|
35
|
+
|
|
36
|
+
/// ------ Concurrent Priority Queue Implementation ------
|
|
37
|
+
// The concurrent priority queue implementation is based on the
|
|
38
|
+
// Mound data structure (Mounds: Array-Based Concurrent Priority Queues
|
|
39
|
+
// by Yujie Liu and Michael Spear, ICPP 2012)
|
|
40
|
+
//
|
|
41
|
+
/// --- Overview ---
|
|
42
|
+
// This relaxed implementation extends the Mound algorithm, and provides
|
|
43
|
+
// following features:
|
|
44
|
+
// - Arbitrary priorities.
|
|
45
|
+
// - Unbounded size.
|
|
46
|
+
// - Push, pop, empty, size functions. [TODO: Non-waiting and timed wait pop]
|
|
47
|
+
// - Supports blocking.
|
|
48
|
+
// - Fast and Scalable.
|
|
49
|
+
//
|
|
50
|
+
/// --- Mound ---
|
|
51
|
+
// A Mound is a heap where each element is a sorted linked list.
|
|
52
|
+
// First nodes in the lists maintain the heap property. Push randomly
|
|
53
|
+
// selects a leaf at the bottom level, then uses binary search to find
|
|
54
|
+
// a place to insert the new node to the head of the list. Pop gets
|
|
55
|
+
// the node from the head of the list at the root, then swap the
|
|
56
|
+
// list down until the heap feature holds. To use Mound in our
|
|
57
|
+
// implementation, we need to solve the following problems:
|
|
58
|
+
// - 1. Lack of general relaxed implementations. Mound is appealing
|
|
59
|
+
// for relaxed priority queue implementation because pop the whole
|
|
60
|
+
// list from the root is straightforward. One thread pops the list
|
|
61
|
+
// and following threads can pop from the list until its empty.
|
|
62
|
+
// Those pops only trigger one swap done operation. Thus reduce
|
|
63
|
+
// the latency for pop and reduce the contention for Mound.
|
|
64
|
+
// The difficulty is to provide a scalable and fast mechanism
|
|
65
|
+
// to let threads concurrently get elements from the list.
|
|
66
|
+
// - 2. Lack of control of list length. The length for every
|
|
67
|
+
// lists is critical for the performance. Mound suffers from not
|
|
68
|
+
// only the extreme cases(Push with increasing priorities, Mound
|
|
69
|
+
// becomes a sorted linked list; Push with decreasing priorities,
|
|
70
|
+
// Mound becomes to a regular heap), but also the common case(for
|
|
71
|
+
// random generated priorities, Mound degrades to the regular heap
|
|
72
|
+
// after millions of push/pop operations). The difficulty is to
|
|
73
|
+
// stabilize the list length without losing the accuracy and performance.
|
|
74
|
+
// - 3. Does not support blocking. Blocking is an important feature.
|
|
75
|
+
// Mound paper does not mention it. Designing the new algorithm for
|
|
76
|
+
// efficient blocking is challenging.
|
|
77
|
+
// - 4. Memory management. Mound allows optimistic reads. We need to
|
|
78
|
+
// protect the node from been reclaimed.
|
|
79
|
+
//
|
|
80
|
+
/// --- Design ---
|
|
81
|
+
// Our implementation extends Mound algorithm to support
|
|
82
|
+
// efficient relaxed pop. We employ a shared buffer algorithm to
|
|
83
|
+
// share the popped list. Our algorithm makes popping from shared
|
|
84
|
+
// buffer as fast as fetch_and_add. We improve the performance
|
|
85
|
+
// and compact the heap structure by stabilizing the size of each list.
|
|
86
|
+
// The implementation exposes the template parameter to set the
|
|
87
|
+
// preferred list length. Under the hood, we provide algorithms for
|
|
88
|
+
// fast inserting, pruning, and merging. The blocking algorithm is
|
|
89
|
+
// tricky. It allows one producer only wakes one consumer at a time.
|
|
90
|
+
// It also does not block the producer. For optimistic read, we use
|
|
91
|
+
// hazard pointer to protect the node from been reclaimed. We optimize the
|
|
92
|
+
// check-lock-check pattern by using test-test-and-set spin lock.
|
|
93
|
+
|
|
94
|
+
/// --- Template Parameters: ---
|
|
95
|
+
// 1. PopBatch could be 0 or a positive integer.
|
|
96
|
+
// If it is 0, only pop one node at a time.
|
|
97
|
+
// This is the strict implementation. It guarantees the return
|
|
98
|
+
// priority is alway the highest. If it is > 0, we keep
|
|
99
|
+
// up to that number of nodes in a shared buffer to be consumed by
|
|
100
|
+
// subsequent pop operations.
|
|
101
|
+
//
|
|
102
|
+
// 2. ListTargetSize represents the minimal length for the list. It
|
|
103
|
+
// solves the problem when inserting to Mound with
|
|
104
|
+
// decreasing priority order (degrade to a heap). Moreover,
|
|
105
|
+
// it maintains the Mound structure stable after trillions of
|
|
106
|
+
// operations, which causes unbalanced problem in the original
|
|
107
|
+
// Mound algorithm. We set the prunning length and merging lengtyh
|
|
108
|
+
// based on this parameter.
|
|
109
|
+
//
|
|
110
|
+
/// --- Interface ---
|
|
111
|
+
// void push(const T& val)
|
|
112
|
+
// void pop(T& val)
|
|
113
|
+
// size_t size()
|
|
114
|
+
// bool empty()
|
|
115
|
+
|
|
116
|
+
namespace folly {
|
|
117
|
+
|
|
118
|
+
template <
|
|
119
|
+
typename T,
|
|
120
|
+
bool MayBlock = false,
|
|
121
|
+
bool SupportsSize = false,
|
|
122
|
+
size_t PopBatch = 16,
|
|
123
|
+
size_t ListTargetSize = 25,
|
|
124
|
+
typename Mutex = folly::SpinLock,
|
|
125
|
+
template <typename> class Atom = std::atomic>
|
|
126
|
+
class RelaxedConcurrentPriorityQueue {
|
|
127
|
+
// Max height of the tree
|
|
128
|
+
static constexpr uint32_t MAX_LEVELS = 32;
|
|
129
|
+
// The default minimum value
|
|
130
|
+
static constexpr T MIN_VALUE = std::numeric_limits<T>::min();
|
|
131
|
+
|
|
132
|
+
// Align size for the shared buffer node
|
|
133
|
+
static constexpr size_t Align = 1u << 7;
|
|
134
|
+
static constexpr int LevelForForceInsert = 3;
|
|
135
|
+
static constexpr int LevelForTraverseParent = 7;
|
|
136
|
+
|
|
137
|
+
static_assert(PopBatch <= 256, "PopBatch must be <= 256");
|
|
138
|
+
static_assert(
|
|
139
|
+
ListTargetSize >= 1 && ListTargetSize <= 256,
|
|
140
|
+
"TargetSize must be in the range [1, 256]");
|
|
141
|
+
|
|
142
|
+
// The maximal length for the list
|
|
143
|
+
static constexpr size_t PruningSize = ListTargetSize * 2;
|
|
144
|
+
// When pop from Mound, tree elements near the leaf
|
|
145
|
+
// level are likely be very small (the length of the list). When
|
|
146
|
+
// swapping down after pop a list, we check the size of the
|
|
147
|
+
// children to decide whether to merge them to their parent.
|
|
148
|
+
static constexpr size_t MergingSize = ListTargetSize;
|
|
149
|
+
|
|
150
|
+
/// List Node structure
|
|
151
|
+
struct Node : public folly::hazptr_obj_base<Node, Atom> {
|
|
152
|
+
Node* next;
|
|
153
|
+
T val;
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
/// Mound Element (Tree node), head points to a linked list
|
|
157
|
+
struct MoundElement {
|
|
158
|
+
// Reading (head, size) without acquiring the lock
|
|
159
|
+
Atom<Node*> head;
|
|
160
|
+
Atom<size_t> size;
|
|
161
|
+
alignas(Align) Mutex lock;
|
|
162
|
+
MoundElement() { // initializer
|
|
163
|
+
head.store(nullptr, std::memory_order_relaxed);
|
|
164
|
+
size.store(0, std::memory_order_relaxed);
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
/// The pos strcture simplify the implementation
|
|
169
|
+
struct Position {
|
|
170
|
+
uint32_t level;
|
|
171
|
+
uint32_t index;
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
/// Node for shared buffer should be aligned
|
|
175
|
+
struct BufferNode {
|
|
176
|
+
alignas(Align) Atom<Node*> pnode;
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
/// Data members
|
|
180
|
+
|
|
181
|
+
// Mound structure -> 2D array to represent a tree
|
|
182
|
+
MoundElement* levels_[MAX_LEVELS];
|
|
183
|
+
// Record the current leaf level (root is 0)
|
|
184
|
+
Atom<uint32_t> bottom_;
|
|
185
|
+
// It is used when expanding the tree
|
|
186
|
+
Atom<uint32_t> guard_;
|
|
187
|
+
|
|
188
|
+
// Mound with shared buffer
|
|
189
|
+
// Following two members are accessed by consumers
|
|
190
|
+
std::unique_ptr<BufferNode[]> shared_buffer_;
|
|
191
|
+
alignas(Align) Atom<int> top_loc_;
|
|
192
|
+
|
|
193
|
+
/// Blocking algorithm
|
|
194
|
+
// Numbers of futexs in the array
|
|
195
|
+
static constexpr size_t NumFutex = 128;
|
|
196
|
+
// The index gap for accessing futex in the array
|
|
197
|
+
static constexpr size_t Stride = 33;
|
|
198
|
+
std::unique_ptr<folly::detail::Futex<Atom>[]> futex_array_;
|
|
199
|
+
alignas(Align) Atom<uint32_t> cticket_;
|
|
200
|
+
alignas(Align) Atom<uint32_t> pticket_;
|
|
201
|
+
|
|
202
|
+
// Two counters to calculate size of the queue
|
|
203
|
+
alignas(Align) Atom<size_t> counter_p_;
|
|
204
|
+
alignas(Align) Atom<size_t> counter_c_;
|
|
205
|
+
|
|
206
|
+
public:
|
|
207
|
+
/// Constructor
|
|
208
|
+
RelaxedConcurrentPriorityQueue()
|
|
209
|
+
: cticket_(1), pticket_(1), counter_p_(0), counter_c_(0) {
|
|
210
|
+
if (MayBlock) {
|
|
211
|
+
futex_array_.reset(new folly::detail::Futex<Atom>[NumFutex]);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
if (PopBatch > 0) {
|
|
215
|
+
top_loc_ = -1;
|
|
216
|
+
shared_buffer_.reset(new BufferNode[PopBatch]);
|
|
217
|
+
for (size_t i = 0; i < PopBatch; i++) {
|
|
218
|
+
shared_buffer_[i].pnode = nullptr;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
bottom_.store(0, std::memory_order_relaxed);
|
|
222
|
+
guard_.store(0, std::memory_order_relaxed);
|
|
223
|
+
// allocate the root MoundElement and initialize Mound
|
|
224
|
+
levels_[0] = new MoundElement[1]; // default MM for MoundElement
|
|
225
|
+
for (uint32_t i = 1; i < MAX_LEVELS; i++) {
|
|
226
|
+
levels_[i] = nullptr;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
~RelaxedConcurrentPriorityQueue() {
|
|
231
|
+
if (PopBatch > 0) {
|
|
232
|
+
deleteSharedBuffer();
|
|
233
|
+
}
|
|
234
|
+
if (MayBlock) {
|
|
235
|
+
futex_array_.reset();
|
|
236
|
+
}
|
|
237
|
+
Position pos;
|
|
238
|
+
pos.level = pos.index = 0;
|
|
239
|
+
deleteAllNodes(pos);
|
|
240
|
+
// default MM for MoundElement
|
|
241
|
+
for (int i = getBottomLevel(); i >= 0; i--) {
|
|
242
|
+
delete[] levels_[i];
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
void push(const T& val) {
|
|
247
|
+
moundPush(val);
|
|
248
|
+
if (SupportsSize) {
|
|
249
|
+
counter_p_.fetch_add(1, std::memory_order_relaxed);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
void pop(T& val) {
|
|
254
|
+
moundPop(val);
|
|
255
|
+
if (SupportsSize) {
|
|
256
|
+
counter_c_.fetch_add(1, std::memory_order_relaxed);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/// Note: size() and empty() are guaranteed to be accurate only if
|
|
261
|
+
/// the queue is not changed concurrently.
|
|
262
|
+
/// Returns an estimate of the size of the queue
|
|
263
|
+
size_t size() {
|
|
264
|
+
DCHECK(SupportsSize);
|
|
265
|
+
size_t p = counter_p_.load(std::memory_order_acquire);
|
|
266
|
+
size_t c = counter_c_.load(std::memory_order_acquire);
|
|
267
|
+
return (p > c) ? p - c : 0;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/// Returns true only if the queue was empty during the call.
|
|
271
|
+
bool empty() { return isEmpty(); }
|
|
272
|
+
|
|
273
|
+
private:
|
|
274
|
+
uint32_t getBottomLevel() { return bottom_.load(std::memory_order_acquire); }
|
|
275
|
+
|
|
276
|
+
/// This function is only called by the destructor
|
|
277
|
+
void deleteSharedBuffer() {
|
|
278
|
+
DCHECK(PopBatch > 0);
|
|
279
|
+
// delete nodes in the buffer
|
|
280
|
+
int loc = top_loc_.load(std::memory_order_relaxed);
|
|
281
|
+
while (loc >= 0) {
|
|
282
|
+
Node* n = shared_buffer_[loc--].pnode.load(std::memory_order_relaxed);
|
|
283
|
+
delete n;
|
|
284
|
+
}
|
|
285
|
+
// delete buffer
|
|
286
|
+
shared_buffer_.reset();
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/// This function is only called by the destructor
|
|
290
|
+
void deleteAllNodes(const Position& pos) {
|
|
291
|
+
if (getElementSize(pos) == 0) {
|
|
292
|
+
// current list is empty, do not need to check
|
|
293
|
+
// its children again.
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
Node* curList = getList(pos);
|
|
298
|
+
setTreeNode(pos, nullptr);
|
|
299
|
+
while (curList != nullptr) { // reclaim nodes
|
|
300
|
+
Node* n = curList;
|
|
301
|
+
curList = curList->next;
|
|
302
|
+
delete n;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
if (!isLeaf(pos)) {
|
|
306
|
+
deleteAllNodes(leftOf(pos));
|
|
307
|
+
deleteAllNodes(rightOf(pos));
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/// Check the first node in TreeElement keeps the heap structure.
|
|
312
|
+
bool isHeap(const Position& pos) {
|
|
313
|
+
if (isLeaf(pos)) {
|
|
314
|
+
return true;
|
|
315
|
+
}
|
|
316
|
+
Position lchild = leftOf(pos);
|
|
317
|
+
Position rchild = rightOf(pos);
|
|
318
|
+
return isHeap(lchild) && isHeap(rchild) &&
|
|
319
|
+
readValue(pos) >= readValue(lchild) &&
|
|
320
|
+
readValue(pos) >= readValue(rchild);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/// Current position is leaf?
|
|
324
|
+
FOLLY_ALWAYS_INLINE bool isLeaf(const Position& pos) {
|
|
325
|
+
return pos.level == getBottomLevel();
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/// Current element is the root?
|
|
329
|
+
FOLLY_ALWAYS_INLINE bool isRoot(const Position& pos) {
|
|
330
|
+
return pos.level == 0;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/// Locate the parent node
|
|
334
|
+
FOLLY_ALWAYS_INLINE Position parentOf(const Position& pos) {
|
|
335
|
+
Position res;
|
|
336
|
+
res.level = pos.level - 1;
|
|
337
|
+
res.index = pos.index / 2;
|
|
338
|
+
return res;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/// Locate the left child
|
|
342
|
+
FOLLY_ALWAYS_INLINE Position leftOf(const Position& pos) {
|
|
343
|
+
Position res;
|
|
344
|
+
res.level = pos.level + 1;
|
|
345
|
+
res.index = pos.index * 2;
|
|
346
|
+
return res;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/// Locate the right child
|
|
350
|
+
FOLLY_ALWAYS_INLINE Position rightOf(const Position& pos) {
|
|
351
|
+
Position res;
|
|
352
|
+
res.level = pos.level + 1;
|
|
353
|
+
res.index = pos.index * 2 + 1;
|
|
354
|
+
return res;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/// get the list size in current MoundElement
|
|
358
|
+
FOLLY_ALWAYS_INLINE size_t getElementSize(const Position& pos) {
|
|
359
|
+
return levels_[pos.level][pos.index].size.load(std::memory_order_relaxed);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/// Set the size of current MoundElement
|
|
363
|
+
FOLLY_ALWAYS_INLINE void setElementSize(
|
|
364
|
+
const Position& pos, const uint32_t& v) {
|
|
365
|
+
levels_[pos.level][pos.index].size.store(v, std::memory_order_relaxed);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/// Extend the tree level
|
|
369
|
+
void grow(uint32_t btm) {
|
|
370
|
+
while (true) {
|
|
371
|
+
if (guard_.fetch_add(1, std::memory_order_acq_rel) == 0) {
|
|
372
|
+
break;
|
|
373
|
+
}
|
|
374
|
+
// someone already expanded the tree
|
|
375
|
+
if (btm != getBottomLevel()) {
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
std::this_thread::yield();
|
|
379
|
+
}
|
|
380
|
+
// double check the bottom has not changed yet
|
|
381
|
+
if (btm != getBottomLevel()) {
|
|
382
|
+
guard_.store(0, std::memory_order_release);
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
// create and initialize the new level
|
|
386
|
+
uint32_t tmp_btm = getBottomLevel();
|
|
387
|
+
uint32_t size = 1 << (tmp_btm + 1);
|
|
388
|
+
MoundElement* new_level = new MoundElement[size]; // MM
|
|
389
|
+
levels_[tmp_btm + 1] = new_level;
|
|
390
|
+
bottom_.store(tmp_btm + 1, std::memory_order_release);
|
|
391
|
+
guard_.store(0, std::memory_order_release);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/// TODO: optimization
|
|
395
|
+
// This function is important, it selects a position to insert the
|
|
396
|
+
// node, there are two execution paths when this function returns.
|
|
397
|
+
// 1. It returns a position with head node has lower priority than the target.
|
|
398
|
+
// Thus it could be potentially used as the starting element to do the binary
|
|
399
|
+
// search to find the fit position. (slow path)
|
|
400
|
+
// 2. It returns a position, which is not the best fit.
|
|
401
|
+
// But it prevents aggressively grow the Mound. (fast path)
|
|
402
|
+
Position selectPosition(
|
|
403
|
+
const T& val,
|
|
404
|
+
bool& path,
|
|
405
|
+
uint32_t& seed,
|
|
406
|
+
folly::hazptr_holder<Atom>& hptr) {
|
|
407
|
+
while (true) {
|
|
408
|
+
uint32_t b = getBottomLevel();
|
|
409
|
+
int bound = 1 << b; // number of elements in this level
|
|
410
|
+
int steps = 1 + b * b; // probe the length
|
|
411
|
+
++seed;
|
|
412
|
+
uint32_t index = seed % bound;
|
|
413
|
+
|
|
414
|
+
for (int i = 0; i < steps; i++) {
|
|
415
|
+
int loc = (index + i) % bound;
|
|
416
|
+
Position pos;
|
|
417
|
+
pos.level = b;
|
|
418
|
+
pos.index = loc;
|
|
419
|
+
// the first round, we do the quick check
|
|
420
|
+
if (optimisticReadValue(pos, hptr) <= val) {
|
|
421
|
+
path = false;
|
|
422
|
+
seed = ++loc;
|
|
423
|
+
return pos;
|
|
424
|
+
} else if (
|
|
425
|
+
b > LevelForForceInsert && getElementSize(pos) < ListTargetSize) {
|
|
426
|
+
// [fast path] conservative implementation
|
|
427
|
+
// it makes sure every tree element should
|
|
428
|
+
// have more than the given number of nodes.
|
|
429
|
+
seed = ++loc;
|
|
430
|
+
path = true;
|
|
431
|
+
return pos;
|
|
432
|
+
}
|
|
433
|
+
if (b != getBottomLevel()) {
|
|
434
|
+
break;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
// failed too many times grow
|
|
438
|
+
if (b == getBottomLevel()) {
|
|
439
|
+
grow(b);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
/// Swap two Tree Elements (head, size)
|
|
445
|
+
void swapList(const Position& a, const Position& b) {
|
|
446
|
+
Node* tmp = getList(a);
|
|
447
|
+
setTreeNode(a, getList(b));
|
|
448
|
+
setTreeNode(b, tmp);
|
|
449
|
+
|
|
450
|
+
// need to swap the tree node meta-data
|
|
451
|
+
uint32_t sa = getElementSize(a);
|
|
452
|
+
uint32_t sb = getElementSize(b);
|
|
453
|
+
setElementSize(a, sb);
|
|
454
|
+
setElementSize(b, sa);
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
FOLLY_ALWAYS_INLINE void lockNode(const Position& pos) {
|
|
458
|
+
levels_[pos.level][pos.index].lock.lock();
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
FOLLY_ALWAYS_INLINE void unlockNode(const Position& pos) {
|
|
462
|
+
levels_[pos.level][pos.index].lock.unlock();
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
FOLLY_ALWAYS_INLINE bool trylockNode(const Position& pos) {
|
|
466
|
+
return levels_[pos.level][pos.index].lock.try_lock();
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
FOLLY_ALWAYS_INLINE T
|
|
470
|
+
optimisticReadValue(const Position& pos, folly::hazptr_holder<Atom>& hptr) {
|
|
471
|
+
Node* tmp = hptr.protect(levels_[pos.level][pos.index].head);
|
|
472
|
+
return (tmp == nullptr) ? MIN_VALUE : tmp->val;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
// Get the value from the head of the list as the elementvalue
|
|
476
|
+
FOLLY_ALWAYS_INLINE T readValue(const Position& pos) {
|
|
477
|
+
Node* tmp = getList(pos);
|
|
478
|
+
return (tmp == nullptr) ? MIN_VALUE : tmp->val;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
FOLLY_ALWAYS_INLINE Node* getList(const Position& pos) {
|
|
482
|
+
return levels_[pos.level][pos.index].head.load(std::memory_order_acquire);
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
FOLLY_ALWAYS_INLINE void setTreeNode(const Position& pos, Node* t) {
|
|
486
|
+
levels_[pos.level][pos.index].head.store(t, std::memory_order_release);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
// Merge two sorted lists
|
|
490
|
+
Node* mergeList(Node* base, Node* source) {
|
|
491
|
+
if (base == nullptr) {
|
|
492
|
+
return source;
|
|
493
|
+
} else if (source == nullptr) {
|
|
494
|
+
return base;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
Node *res, *p;
|
|
498
|
+
// choose the head node
|
|
499
|
+
if (base->val >= source->val) {
|
|
500
|
+
res = base;
|
|
501
|
+
base = base->next;
|
|
502
|
+
p = res;
|
|
503
|
+
} else {
|
|
504
|
+
res = source;
|
|
505
|
+
source = source->next;
|
|
506
|
+
p = res;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
while (base != nullptr && source != nullptr) {
|
|
510
|
+
if (base->val >= source->val) {
|
|
511
|
+
p->next = base;
|
|
512
|
+
base = base->next;
|
|
513
|
+
} else {
|
|
514
|
+
p->next = source;
|
|
515
|
+
source = source->next;
|
|
516
|
+
}
|
|
517
|
+
p = p->next;
|
|
518
|
+
}
|
|
519
|
+
if (base == nullptr) {
|
|
520
|
+
p->next = source;
|
|
521
|
+
} else {
|
|
522
|
+
p->next = base;
|
|
523
|
+
}
|
|
524
|
+
return res;
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
/// Merge list t to the Element Position
|
|
528
|
+
void mergeListTo(const Position& pos, Node* t, const size_t& list_length) {
|
|
529
|
+
Node* head = getList(pos);
|
|
530
|
+
setTreeNode(pos, mergeList(head, t));
|
|
531
|
+
uint32_t ns = getElementSize(pos) + list_length;
|
|
532
|
+
setElementSize(pos, ns);
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
bool pruningLeaf(const Position& pos) {
|
|
536
|
+
if (getElementSize(pos) <= PruningSize) {
|
|
537
|
+
unlockNode(pos);
|
|
538
|
+
return true;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
int b = getBottomLevel();
|
|
542
|
+
int leaves = 1 << b;
|
|
543
|
+
int cnodes = 0;
|
|
544
|
+
for (int i = 0; i < leaves; i++) {
|
|
545
|
+
Position tmp;
|
|
546
|
+
tmp.level = b;
|
|
547
|
+
tmp.index = i;
|
|
548
|
+
if (getElementSize(tmp) != 0) {
|
|
549
|
+
cnodes++;
|
|
550
|
+
}
|
|
551
|
+
if (cnodes > leaves * 2 / 3) {
|
|
552
|
+
break;
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
if (cnodes <= leaves * 2 / 3) {
|
|
557
|
+
unlockNode(pos);
|
|
558
|
+
return true;
|
|
559
|
+
}
|
|
560
|
+
return false;
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
/// Split the current list into two lists,
|
|
564
|
+
/// then split the tail list and merge to two children.
|
|
565
|
+
void startPruning(const Position& pos) {
|
|
566
|
+
if (isLeaf(pos) && pruningLeaf(pos)) {
|
|
567
|
+
return;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
// split the list, record the tail
|
|
571
|
+
Node* pruning_head = getList(pos);
|
|
572
|
+
int steps = ListTargetSize; // keep in the original list
|
|
573
|
+
for (int i = 0; i < steps - 1; i++) {
|
|
574
|
+
pruning_head = pruning_head->next;
|
|
575
|
+
}
|
|
576
|
+
Node* t = pruning_head;
|
|
577
|
+
pruning_head = pruning_head->next;
|
|
578
|
+
t->next = nullptr;
|
|
579
|
+
int tail_length = getElementSize(pos) - steps;
|
|
580
|
+
setElementSize(pos, steps);
|
|
581
|
+
|
|
582
|
+
// split the tail list into two lists
|
|
583
|
+
// evenly merge to two children
|
|
584
|
+
if (pos.level != getBottomLevel()) {
|
|
585
|
+
// split the rest into two lists
|
|
586
|
+
int left_length = (tail_length + 1) / 2;
|
|
587
|
+
int right_length = tail_length - left_length;
|
|
588
|
+
Node *to_right, *to_left = pruning_head;
|
|
589
|
+
for (int i = 0; i < left_length - 1; i++) {
|
|
590
|
+
pruning_head = pruning_head->next;
|
|
591
|
+
}
|
|
592
|
+
to_right = pruning_head->next;
|
|
593
|
+
pruning_head->next = nullptr;
|
|
594
|
+
|
|
595
|
+
Position lchild = leftOf(pos);
|
|
596
|
+
Position rchild = rightOf(pos);
|
|
597
|
+
if (left_length != 0) {
|
|
598
|
+
lockNode(lchild);
|
|
599
|
+
mergeListTo(lchild, to_left, left_length);
|
|
600
|
+
}
|
|
601
|
+
if (right_length != 0) {
|
|
602
|
+
lockNode(rchild);
|
|
603
|
+
mergeListTo(rchild, to_right, right_length);
|
|
604
|
+
}
|
|
605
|
+
unlockNode(pos);
|
|
606
|
+
if (left_length != 0 && getElementSize(lchild) > PruningSize) {
|
|
607
|
+
startPruning(lchild);
|
|
608
|
+
} else if (left_length != 0) {
|
|
609
|
+
unlockNode(lchild);
|
|
610
|
+
}
|
|
611
|
+
if (right_length != 0 && getElementSize(rchild) > PruningSize) {
|
|
612
|
+
startPruning(rchild);
|
|
613
|
+
} else if (right_length != 0) {
|
|
614
|
+
unlockNode(rchild);
|
|
615
|
+
}
|
|
616
|
+
} else { // time to grow the Mound
|
|
617
|
+
grow(pos.level);
|
|
618
|
+
// randomly choose a child to insert
|
|
619
|
+
if (steps % 2 == 1) {
|
|
620
|
+
Position rchild = rightOf(pos);
|
|
621
|
+
lockNode(rchild);
|
|
622
|
+
mergeListTo(rchild, pruning_head, tail_length);
|
|
623
|
+
unlockNode(pos);
|
|
624
|
+
unlockNode(rchild);
|
|
625
|
+
} else {
|
|
626
|
+
Position lchild = leftOf(pos);
|
|
627
|
+
lockNode(lchild);
|
|
628
|
+
mergeListTo(lchild, pruning_head, tail_length);
|
|
629
|
+
unlockNode(pos);
|
|
630
|
+
unlockNode(lchild);
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
// This function insert the new node (always) at the head of the
|
|
636
|
+
// current list. It needs to lock the parent & current
|
|
637
|
+
// This function may cause the list becoming tooooo long, so we
|
|
638
|
+
// provide pruning algorithm.
|
|
639
|
+
bool regularInsert(const Position& pos, const T& val, Node* newNode) {
|
|
640
|
+
// insert to the root node
|
|
641
|
+
if (isRoot(pos)) {
|
|
642
|
+
lockNode(pos);
|
|
643
|
+
T nv = readValue(pos);
|
|
644
|
+
if (FOLLY_LIKELY(nv <= val)) {
|
|
645
|
+
newNode->next = getList(pos);
|
|
646
|
+
setTreeNode(pos, newNode);
|
|
647
|
+
uint32_t sz = getElementSize(pos);
|
|
648
|
+
setElementSize(pos, sz + 1);
|
|
649
|
+
if (FOLLY_UNLIKELY(sz > PruningSize)) {
|
|
650
|
+
startPruning(pos);
|
|
651
|
+
} else {
|
|
652
|
+
unlockNode(pos);
|
|
653
|
+
}
|
|
654
|
+
return true;
|
|
655
|
+
}
|
|
656
|
+
unlockNode(pos);
|
|
657
|
+
return false;
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
// insert to an inner node
|
|
661
|
+
Position parent = parentOf(pos);
|
|
662
|
+
if (!trylockNode(parent)) {
|
|
663
|
+
return false;
|
|
664
|
+
}
|
|
665
|
+
if (!trylockNode(pos)) {
|
|
666
|
+
unlockNode(parent);
|
|
667
|
+
return false;
|
|
668
|
+
}
|
|
669
|
+
T pv = readValue(parent);
|
|
670
|
+
T nv = readValue(pos);
|
|
671
|
+
if (FOLLY_LIKELY(pv > val && nv <= val)) {
|
|
672
|
+
// improve the accuracy by getting the node(R) with less priority than the
|
|
673
|
+
// new value from parent level, insert the new node to the parent list
|
|
674
|
+
// and insert R to the current list.
|
|
675
|
+
// It only happens at >= LevelForTraverseParent for reducing contention
|
|
676
|
+
uint32_t sz = getElementSize(pos);
|
|
677
|
+
if (pos.level >= LevelForTraverseParent) {
|
|
678
|
+
Node* start = getList(parent);
|
|
679
|
+
while (start->next != nullptr && start->next->val >= val) {
|
|
680
|
+
start = start->next;
|
|
681
|
+
}
|
|
682
|
+
if (start->next != nullptr) {
|
|
683
|
+
newNode->next = start->next;
|
|
684
|
+
start->next = newNode;
|
|
685
|
+
while (start->next->next != nullptr) {
|
|
686
|
+
start = start->next;
|
|
687
|
+
}
|
|
688
|
+
newNode = start->next;
|
|
689
|
+
start->next = nullptr;
|
|
690
|
+
}
|
|
691
|
+
unlockNode(parent);
|
|
692
|
+
|
|
693
|
+
Node* curList = getList(pos);
|
|
694
|
+
if (curList == nullptr) {
|
|
695
|
+
newNode->next = nullptr;
|
|
696
|
+
setTreeNode(pos, newNode);
|
|
697
|
+
} else {
|
|
698
|
+
Node* p = curList;
|
|
699
|
+
if (p->val <= newNode->val) {
|
|
700
|
+
newNode->next = curList;
|
|
701
|
+
setTreeNode(pos, newNode);
|
|
702
|
+
} else {
|
|
703
|
+
while (p->next != nullptr && p->next->val >= newNode->val) {
|
|
704
|
+
p = p->next;
|
|
705
|
+
}
|
|
706
|
+
newNode->next = p->next;
|
|
707
|
+
p->next = newNode;
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
setElementSize(pos, sz + 1);
|
|
711
|
+
} else {
|
|
712
|
+
unlockNode(parent);
|
|
713
|
+
newNode->next = getList(pos);
|
|
714
|
+
setTreeNode(pos, newNode);
|
|
715
|
+
setElementSize(pos, sz + 1);
|
|
716
|
+
}
|
|
717
|
+
if (FOLLY_UNLIKELY(sz > PruningSize)) {
|
|
718
|
+
startPruning(pos);
|
|
719
|
+
} else {
|
|
720
|
+
unlockNode(pos);
|
|
721
|
+
}
|
|
722
|
+
return true;
|
|
723
|
+
}
|
|
724
|
+
unlockNode(parent);
|
|
725
|
+
unlockNode(pos);
|
|
726
|
+
return false;
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
bool forceInsertToRoot(Node* newNode) {
|
|
730
|
+
Position pos;
|
|
731
|
+
pos.level = pos.index = 0;
|
|
732
|
+
std::unique_lock<Mutex> lck(
|
|
733
|
+
levels_[pos.level][pos.index].lock, std::try_to_lock);
|
|
734
|
+
if (!lck.owns_lock()) {
|
|
735
|
+
return false;
|
|
736
|
+
}
|
|
737
|
+
uint32_t sz = getElementSize(pos);
|
|
738
|
+
if (sz >= ListTargetSize) {
|
|
739
|
+
return false;
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
Node* curList = getList(pos);
|
|
743
|
+
if (curList == nullptr) {
|
|
744
|
+
newNode->next = nullptr;
|
|
745
|
+
setTreeNode(pos, newNode);
|
|
746
|
+
} else {
|
|
747
|
+
Node* p = curList;
|
|
748
|
+
if (p->val <= newNode->val) {
|
|
749
|
+
newNode->next = curList;
|
|
750
|
+
setTreeNode(pos, newNode);
|
|
751
|
+
} else {
|
|
752
|
+
while (p->next != nullptr && p->next->val >= newNode->val) {
|
|
753
|
+
p = p->next;
|
|
754
|
+
}
|
|
755
|
+
newNode->next = p->next;
|
|
756
|
+
p->next = newNode;
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
setElementSize(pos, sz + 1);
|
|
760
|
+
return true;
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
// This function forces the new node inserting to the current position
|
|
764
|
+
// if the element does not hold the enough nodes. It is safe to
|
|
765
|
+
// lock just one position to insert, because it won't be the first
|
|
766
|
+
// node to sustain the heap structure.
|
|
767
|
+
bool forceInsert(const Position& pos, const T& val, Node* newNode) {
|
|
768
|
+
if (isRoot(pos)) {
|
|
769
|
+
return forceInsertToRoot(newNode);
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
while (true) {
|
|
773
|
+
std::unique_lock<Mutex> lck(
|
|
774
|
+
levels_[pos.level][pos.index].lock, std::try_to_lock);
|
|
775
|
+
if (!lck.owns_lock()) {
|
|
776
|
+
if (getElementSize(pos) < ListTargetSize && readValue(pos) >= val) {
|
|
777
|
+
continue;
|
|
778
|
+
} else {
|
|
779
|
+
return false;
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
T nv = readValue(pos);
|
|
783
|
+
uint32_t sz = getElementSize(pos);
|
|
784
|
+
// do not allow the new node to be the first one
|
|
785
|
+
// do not allow the list size tooooo big
|
|
786
|
+
if (FOLLY_UNLIKELY(nv < val || sz >= ListTargetSize)) {
|
|
787
|
+
return false;
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
Node* p = getList(pos);
|
|
791
|
+
// find a place to insert the node
|
|
792
|
+
while (p->next != nullptr && p->next->val > val) {
|
|
793
|
+
p = p->next;
|
|
794
|
+
}
|
|
795
|
+
newNode->next = p->next;
|
|
796
|
+
p->next = newNode;
|
|
797
|
+
// do not forget to change the metadata
|
|
798
|
+
setElementSize(pos, sz + 1);
|
|
799
|
+
return true;
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
void binarySearchPosition(
|
|
804
|
+
Position& cur, const T& val, folly::hazptr_holder<Atom>& hptr) {
|
|
805
|
+
Position parent, mid;
|
|
806
|
+
if (cur.level == 0) {
|
|
807
|
+
return;
|
|
808
|
+
}
|
|
809
|
+
// start from the root
|
|
810
|
+
parent.level = parent.index = 0;
|
|
811
|
+
|
|
812
|
+
while (true) { // binary search
|
|
813
|
+
mid.level = (cur.level + parent.level) / 2;
|
|
814
|
+
mid.index = cur.index >> (cur.level - mid.level);
|
|
815
|
+
|
|
816
|
+
T mv = optimisticReadValue(mid, hptr);
|
|
817
|
+
if (val < mv) {
|
|
818
|
+
parent = mid;
|
|
819
|
+
} else {
|
|
820
|
+
cur = mid;
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
if (mid.level == 0 || // the root
|
|
824
|
+
((parent.level + 1 == cur.level) && parent.level != 0)) {
|
|
825
|
+
return;
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
// The push keeps the length of each element stable
|
|
831
|
+
void moundPush(const T& val) {
|
|
832
|
+
Position cur;
|
|
833
|
+
folly::hazptr_holder<Atom> hptr = folly::make_hazard_pointer<Atom>();
|
|
834
|
+
Node* newNode = new Node;
|
|
835
|
+
newNode->val = val;
|
|
836
|
+
uint32_t seed = folly::Random::rand32() % (1 << 21);
|
|
837
|
+
|
|
838
|
+
while (true) {
|
|
839
|
+
// shell we go the fast path?
|
|
840
|
+
bool go_fast_path = false;
|
|
841
|
+
// chooice the right node to start
|
|
842
|
+
cur = selectPosition(val, go_fast_path, seed, hptr);
|
|
843
|
+
if (go_fast_path) {
|
|
844
|
+
if (FOLLY_LIKELY(forceInsert(cur, val, newNode))) {
|
|
845
|
+
if (MayBlock) {
|
|
846
|
+
blockingPushImpl();
|
|
847
|
+
}
|
|
848
|
+
return;
|
|
849
|
+
} else {
|
|
850
|
+
continue;
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
binarySearchPosition(cur, val, hptr);
|
|
855
|
+
if (FOLLY_LIKELY(regularInsert(cur, val, newNode))) {
|
|
856
|
+
if (MayBlock) {
|
|
857
|
+
blockingPushImpl();
|
|
858
|
+
}
|
|
859
|
+
return;
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
int popToSharedBuffer(const uint32_t rsize, Node* head) {
|
|
865
|
+
Position pos;
|
|
866
|
+
pos.level = pos.index = 0;
|
|
867
|
+
|
|
868
|
+
int num = std::min(rsize, (uint32_t)PopBatch);
|
|
869
|
+
for (int i = num - 1; i >= 0; i--) {
|
|
870
|
+
// wait until this block is empty
|
|
871
|
+
while (shared_buffer_[i].pnode.load(std::memory_order_relaxed) != nullptr)
|
|
872
|
+
;
|
|
873
|
+
shared_buffer_[i].pnode.store(head, std::memory_order_relaxed);
|
|
874
|
+
head = head->next;
|
|
875
|
+
}
|
|
876
|
+
if (num > 0) {
|
|
877
|
+
top_loc_.store(num - 1, std::memory_order_release);
|
|
878
|
+
}
|
|
879
|
+
setTreeNode(pos, head);
|
|
880
|
+
return rsize - num;
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
void mergeDown(const Position& pos) {
|
|
884
|
+
if (isLeaf(pos)) {
|
|
885
|
+
unlockNode(pos);
|
|
886
|
+
return;
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
// acquire locks for L and R and compare
|
|
890
|
+
Position lchild = leftOf(pos);
|
|
891
|
+
Position rchild = rightOf(pos);
|
|
892
|
+
lockNode(lchild);
|
|
893
|
+
lockNode(rchild);
|
|
894
|
+
// read values
|
|
895
|
+
T nv = readValue(pos);
|
|
896
|
+
T lv = readValue(lchild);
|
|
897
|
+
T rv = readValue(rchild);
|
|
898
|
+
if (nv >= lv && nv >= rv) {
|
|
899
|
+
unlockNode(pos);
|
|
900
|
+
unlockNode(lchild);
|
|
901
|
+
unlockNode(rchild);
|
|
902
|
+
return;
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
// If two children contains nodes less than the
|
|
906
|
+
// threshold, we merge two children to the parent
|
|
907
|
+
// and do merge down on both of them.
|
|
908
|
+
size_t sum =
|
|
909
|
+
getElementSize(rchild) + getElementSize(lchild) + getElementSize(pos);
|
|
910
|
+
if (sum <= MergingSize) {
|
|
911
|
+
Node* l1 = mergeList(getList(rchild), getList(lchild));
|
|
912
|
+
setTreeNode(pos, mergeList(l1, getList(pos)));
|
|
913
|
+
setElementSize(pos, sum);
|
|
914
|
+
setTreeNode(lchild, nullptr);
|
|
915
|
+
setElementSize(lchild, 0);
|
|
916
|
+
setTreeNode(rchild, nullptr);
|
|
917
|
+
setElementSize(rchild, 0);
|
|
918
|
+
unlockNode(pos);
|
|
919
|
+
mergeDown(lchild);
|
|
920
|
+
mergeDown(rchild);
|
|
921
|
+
return;
|
|
922
|
+
}
|
|
923
|
+
// pull from right
|
|
924
|
+
if (rv >= lv && rv > nv) {
|
|
925
|
+
swapList(rchild, pos);
|
|
926
|
+
unlockNode(pos);
|
|
927
|
+
unlockNode(lchild);
|
|
928
|
+
mergeDown(rchild);
|
|
929
|
+
} else if (lv >= rv && lv > nv) {
|
|
930
|
+
// pull from left
|
|
931
|
+
swapList(lchild, pos);
|
|
932
|
+
unlockNode(pos);
|
|
933
|
+
unlockNode(rchild);
|
|
934
|
+
mergeDown(lchild);
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
bool deferSettingRootSize(Position& pos) {
|
|
939
|
+
if (isLeaf(pos)) {
|
|
940
|
+
setElementSize(pos, 0);
|
|
941
|
+
unlockNode(pos);
|
|
942
|
+
return true;
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
// acquire locks for L and R and compare
|
|
946
|
+
Position lchild = leftOf(pos);
|
|
947
|
+
Position rchild = rightOf(pos);
|
|
948
|
+
lockNode(lchild);
|
|
949
|
+
lockNode(rchild);
|
|
950
|
+
if (getElementSize(lchild) == 0 && getElementSize(rchild) == 0) {
|
|
951
|
+
setElementSize(pos, 0);
|
|
952
|
+
unlockNode(pos);
|
|
953
|
+
unlockNode(lchild);
|
|
954
|
+
unlockNode(rchild);
|
|
955
|
+
return true;
|
|
956
|
+
} else {
|
|
957
|
+
// read values
|
|
958
|
+
T lv = readValue(lchild);
|
|
959
|
+
T rv = readValue(rchild);
|
|
960
|
+
if (lv >= rv) {
|
|
961
|
+
swapList(lchild, pos);
|
|
962
|
+
setElementSize(lchild, 0);
|
|
963
|
+
unlockNode(pos);
|
|
964
|
+
unlockNode(rchild);
|
|
965
|
+
pos = lchild;
|
|
966
|
+
} else {
|
|
967
|
+
swapList(rchild, pos);
|
|
968
|
+
setElementSize(rchild, 0);
|
|
969
|
+
unlockNode(pos);
|
|
970
|
+
unlockNode(lchild);
|
|
971
|
+
pos = rchild;
|
|
972
|
+
}
|
|
973
|
+
return false;
|
|
974
|
+
}
|
|
975
|
+
}
|
|
976
|
+
|
|
977
|
+
bool moundPopMany(T& val) {
|
|
978
|
+
// pop from the root
|
|
979
|
+
Position pos;
|
|
980
|
+
pos.level = pos.index = 0;
|
|
981
|
+
// the root is nullptr, return false
|
|
982
|
+
Node* head = getList(pos);
|
|
983
|
+
if (head == nullptr) {
|
|
984
|
+
unlockNode(pos);
|
|
985
|
+
return false;
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
// shared buffer already filled by other threads
|
|
989
|
+
if (PopBatch > 0 && top_loc_.load(std::memory_order_acquire) >= 0) {
|
|
990
|
+
unlockNode(pos);
|
|
991
|
+
return false;
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
uint32_t sz = getElementSize(pos);
|
|
995
|
+
// get the one node first
|
|
996
|
+
val = head->val;
|
|
997
|
+
Node* p = head;
|
|
998
|
+
head = head->next;
|
|
999
|
+
sz--;
|
|
1000
|
+
|
|
1001
|
+
if (PopBatch > 0) {
|
|
1002
|
+
sz = popToSharedBuffer(sz, head);
|
|
1003
|
+
} else {
|
|
1004
|
+
setTreeNode(pos, head);
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
bool done = false;
|
|
1008
|
+
if (FOLLY_LIKELY(sz == 0)) {
|
|
1009
|
+
done = deferSettingRootSize(pos);
|
|
1010
|
+
} else {
|
|
1011
|
+
setElementSize(pos, sz);
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
if (FOLLY_LIKELY(!done)) {
|
|
1015
|
+
mergeDown(pos);
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
p->retire();
|
|
1019
|
+
return true;
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
void blockingPushImpl() {
|
|
1023
|
+
auto p = pticket_.fetch_add(1, std::memory_order_acq_rel);
|
|
1024
|
+
auto loc = getFutexArrayLoc(p);
|
|
1025
|
+
uint32_t curfutex = futex_array_[loc].load(std::memory_order_acquire);
|
|
1026
|
+
|
|
1027
|
+
while (true) {
|
|
1028
|
+
uint32_t ready = p << 1; // get the lower 31 bits
|
|
1029
|
+
// avoid the situation that push has larger ticket already set the value
|
|
1030
|
+
if (FOLLY_UNLIKELY(
|
|
1031
|
+
ready + 1 < curfutex ||
|
|
1032
|
+
((curfutex > ready) && (curfutex - ready > 0x40000000)))) {
|
|
1033
|
+
return;
|
|
1034
|
+
}
|
|
1035
|
+
|
|
1036
|
+
if (futex_array_[loc].compare_exchange_strong(curfutex, ready)) {
|
|
1037
|
+
if (curfutex &
|
|
1038
|
+
1) { // One or more consumers may be blocked on this futex
|
|
1039
|
+
detail::futexWake(&futex_array_[loc]);
|
|
1040
|
+
}
|
|
1041
|
+
return;
|
|
1042
|
+
} else {
|
|
1043
|
+
curfutex = futex_array_[loc].load(std::memory_order_acquire);
|
|
1044
|
+
}
|
|
1045
|
+
}
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
// This could guarentee the Mound is empty
|
|
1049
|
+
FOLLY_ALWAYS_INLINE bool isMoundEmpty() {
|
|
1050
|
+
Position pos;
|
|
1051
|
+
pos.level = pos.index = 0;
|
|
1052
|
+
return getElementSize(pos) == 0;
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
// Return true if the shared buffer is empty
|
|
1056
|
+
FOLLY_ALWAYS_INLINE bool isSharedBufferEmpty() {
|
|
1057
|
+
return top_loc_.load(std::memory_order_acquire) < 0;
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
FOLLY_ALWAYS_INLINE bool isEmpty() {
|
|
1061
|
+
if (PopBatch > 0) {
|
|
1062
|
+
return isMoundEmpty() && isSharedBufferEmpty();
|
|
1063
|
+
}
|
|
1064
|
+
return isMoundEmpty();
|
|
1065
|
+
}
|
|
1066
|
+
|
|
1067
|
+
FOLLY_ALWAYS_INLINE bool futexIsReady(const size_t& curticket) {
|
|
1068
|
+
auto loc = getFutexArrayLoc(curticket);
|
|
1069
|
+
auto curfutex = futex_array_[loc].load(std::memory_order_acquire);
|
|
1070
|
+
uint32_t short_cticket = curticket & 0x7FFFFFFF;
|
|
1071
|
+
uint32_t futex_ready = curfutex >> 1;
|
|
1072
|
+
// handle unsigned 31 bits overflow
|
|
1073
|
+
return futex_ready >= short_cticket ||
|
|
1074
|
+
short_cticket - futex_ready > 0x40000000;
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
template <typename Clock, typename Duration>
|
|
1078
|
+
FOLLY_NOINLINE bool trySpinBeforeBlock(
|
|
1079
|
+
const size_t& curticket,
|
|
1080
|
+
const std::chrono::time_point<Clock, Duration>& deadline,
|
|
1081
|
+
const folly::WaitOptions& opt = wait_options()) {
|
|
1082
|
+
return folly::detail::spin_pause_until(deadline, opt, [=] {
|
|
1083
|
+
return futexIsReady(curticket);
|
|
1084
|
+
}) == folly::detail::spin_result::success;
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
void tryBlockingPop(const size_t& curticket) {
|
|
1088
|
+
auto loc = getFutexArrayLoc(curticket);
|
|
1089
|
+
auto curfutex = futex_array_[loc].load(std::memory_order_acquire);
|
|
1090
|
+
if (curfutex &
|
|
1091
|
+
1) { /// The last round consumers are still waiting, go to sleep
|
|
1092
|
+
detail::futexWait(&futex_array_[loc], curfutex);
|
|
1093
|
+
}
|
|
1094
|
+
if (trySpinBeforeBlock(
|
|
1095
|
+
curticket,
|
|
1096
|
+
std::chrono::time_point<std::chrono::steady_clock>::max())) {
|
|
1097
|
+
return; /// Spin until the push ticket is ready
|
|
1098
|
+
}
|
|
1099
|
+
while (true) {
|
|
1100
|
+
curfutex = futex_array_[loc].load(std::memory_order_acquire);
|
|
1101
|
+
if (curfutex &
|
|
1102
|
+
1) { /// The last round consumers are still waiting, go to sleep
|
|
1103
|
+
detail::futexWait(&futex_array_[loc], curfutex);
|
|
1104
|
+
} else if (!futexIsReady(curticket)) { // current ticket < pop ticket
|
|
1105
|
+
uint32_t blocking_futex = curfutex + 1;
|
|
1106
|
+
if (futex_array_[loc].compare_exchange_strong(
|
|
1107
|
+
curfutex, blocking_futex)) {
|
|
1108
|
+
detail::futexWait(&futex_array_[loc], blocking_futex);
|
|
1109
|
+
}
|
|
1110
|
+
} else {
|
|
1111
|
+
return;
|
|
1112
|
+
}
|
|
1113
|
+
}
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1116
|
+
void blockingPopImpl() {
|
|
1117
|
+
auto ct = cticket_.fetch_add(1, std::memory_order_acq_rel);
|
|
1118
|
+
// fast path check
|
|
1119
|
+
if (futexIsReady(ct)) {
|
|
1120
|
+
return;
|
|
1121
|
+
}
|
|
1122
|
+
// Blocking
|
|
1123
|
+
tryBlockingPop(ct);
|
|
1124
|
+
}
|
|
1125
|
+
|
|
1126
|
+
bool tryPopFromMound(T& val) {
|
|
1127
|
+
if (isMoundEmpty()) {
|
|
1128
|
+
return false;
|
|
1129
|
+
}
|
|
1130
|
+
Position pos;
|
|
1131
|
+
pos.level = pos.index = 0;
|
|
1132
|
+
|
|
1133
|
+
// lock the root
|
|
1134
|
+
if (trylockNode(pos)) {
|
|
1135
|
+
return moundPopMany(val);
|
|
1136
|
+
}
|
|
1137
|
+
return false;
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1140
|
+
FOLLY_ALWAYS_INLINE static folly::WaitOptions wait_options() { return {}; }
|
|
1141
|
+
|
|
1142
|
+
template <typename Clock, typename Duration>
|
|
1143
|
+
FOLLY_NOINLINE bool tryWait(
|
|
1144
|
+
const std::chrono::time_point<Clock, Duration>& deadline,
|
|
1145
|
+
const folly::WaitOptions& opt = wait_options()) {
|
|
1146
|
+
// Fast path, by quick check the status
|
|
1147
|
+
switch (folly::detail::spin_pause_until(
|
|
1148
|
+
deadline, opt, [=] { return !isEmpty(); })) {
|
|
1149
|
+
case folly::detail::spin_result::success:
|
|
1150
|
+
return true;
|
|
1151
|
+
case folly::detail::spin_result::timeout:
|
|
1152
|
+
return false;
|
|
1153
|
+
case folly::detail::spin_result::advance:
|
|
1154
|
+
break;
|
|
1155
|
+
}
|
|
1156
|
+
|
|
1157
|
+
// Spinning strategy
|
|
1158
|
+
while (true) {
|
|
1159
|
+
auto res =
|
|
1160
|
+
folly::detail::spin_yield_until(deadline, [=] { return !isEmpty(); });
|
|
1161
|
+
if (res == folly::detail::spin_result::success) {
|
|
1162
|
+
return true;
|
|
1163
|
+
} else if (res == folly::detail::spin_result::timeout) {
|
|
1164
|
+
return false;
|
|
1165
|
+
}
|
|
1166
|
+
}
|
|
1167
|
+
return true;
|
|
1168
|
+
}
|
|
1169
|
+
|
|
1170
|
+
bool tryPopFromSharedBuffer(T& val) {
|
|
1171
|
+
int get_or = -1;
|
|
1172
|
+
if (!isSharedBufferEmpty()) {
|
|
1173
|
+
get_or = top_loc_.fetch_sub(1, std::memory_order_acq_rel);
|
|
1174
|
+
if (get_or >= 0) {
|
|
1175
|
+
Node* c = shared_buffer_[get_or].pnode.load(std::memory_order_relaxed);
|
|
1176
|
+
shared_buffer_[get_or].pnode.store(nullptr, std::memory_order_release);
|
|
1177
|
+
val = c->val;
|
|
1178
|
+
c->retire();
|
|
1179
|
+
return true;
|
|
1180
|
+
}
|
|
1181
|
+
}
|
|
1182
|
+
return false;
|
|
1183
|
+
}
|
|
1184
|
+
|
|
1185
|
+
size_t getFutexArrayLoc(size_t s) {
|
|
1186
|
+
return ((s - 1) * Stride) & (NumFutex - 1);
|
|
1187
|
+
}
|
|
1188
|
+
|
|
1189
|
+
void moundPop(T& val) {
|
|
1190
|
+
if (MayBlock) {
|
|
1191
|
+
blockingPopImpl();
|
|
1192
|
+
}
|
|
1193
|
+
|
|
1194
|
+
if (PopBatch > 0) {
|
|
1195
|
+
if (tryPopFromSharedBuffer(val)) {
|
|
1196
|
+
return;
|
|
1197
|
+
}
|
|
1198
|
+
}
|
|
1199
|
+
|
|
1200
|
+
while (true) {
|
|
1201
|
+
if (FOLLY_LIKELY(tryPopFromMound(val))) {
|
|
1202
|
+
return;
|
|
1203
|
+
}
|
|
1204
|
+
tryWait(std::chrono::time_point<std::chrono::steady_clock>::max());
|
|
1205
|
+
if (PopBatch > 0 && tryPopFromSharedBuffer(val)) {
|
|
1206
|
+
return;
|
|
1207
|
+
}
|
|
1208
|
+
}
|
|
1209
|
+
}
|
|
1210
|
+
};
|
|
1211
|
+
|
|
1212
|
+
} // namespace folly
|