react-native-windows 0.83.0 → 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/Common/unicode.cpp +36 -0
- package/Common/unicode.h +8 -0
- 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/ParagraphComponentView.cpp +6 -4
- package/Microsoft.ReactNative/Fabric/Composition/TextDrawing.cpp +1 -1
- package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp +8 -4
- package/Microsoft.ReactNative/Fabric/platform/react/renderer/textlayoutmanager/WindowsTextLayoutManager.cpp +1 -1
- package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj +4 -9
- package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj.filters +0 -3
- package/Microsoft.ReactNative/ReactNativeAppBuilder.idl +3 -0
- package/Microsoft.ReactNative/Utils/LocalBundleReader.cpp +33 -25
- package/Microsoft.ReactNative/Utils/LocalBundleReader.h +5 -3
- package/Microsoft.ReactNative/Utils/UwpScriptStore.cpp +2 -2
- package/Microsoft.ReactNative/Utils/UwpScriptStore.h +3 -2
- package/Microsoft.ReactNative.Cxx/Microsoft.ReactNative.Cxx.vcxitems +16 -0
- package/Microsoft.ReactNative.Managed/Microsoft.ReactNative.Managed.csproj +3 -3
- package/Microsoft.ReactNative.Managed.CodeGen/Microsoft.ReactNative.Managed.CodeGen.csproj +10 -10
- package/Microsoft.ReactNative.Managed.CodeGen/Properties/PublishProfiles/DeployAsTool-Debug.pubxml +1 -1
- package/Microsoft.ReactNative.Managed.CodeGen/Properties/PublishProfiles/DeployAsTool-Release.pubxml +1 -1
- 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 +7 -6
- package/PropertySheets/WinUI.props +4 -3
- package/ReactCommon/ReactCommon.vcxproj +0 -5
- package/Scripts/ConfigureYarnPackageAgeGate.ps1 +25 -0
- package/Scripts/EnableInternalWinAppSDKFeed.ps1 +12 -5
- package/Scripts/JustMyXaml.ps1 +8 -8
- package/Scripts/NuGetRestoreForceEvaluateAllSolutions.ps1 +103 -6
- package/Scripts/RunRnwInitWindows.js +37 -0
- package/Scripts/Tfs/Layout-Desktop-Headers.ps1 +4 -37
- package/Scripts/UnitTest.ps1 +3 -1
- package/Scripts/UpdateNightlyDependencies.ps1 +47 -0
- package/Scripts/creaternwapp.cmd +35 -12
- package/Scripts/creaternwlib.cmd +41 -18
- package/Scripts/rnw-dependencies.ps1 +15 -16
- package/Shared/DevSupportManager.cpp +55 -48
- package/Shared/DevSupportManager.h +0 -1
- package/Shared/Modules/IWebSocketModuleContentHandler.h +15 -0
- package/Shared/Modules/WebSocketModule.cpp +8 -3
- package/Shared/Networking/DefaultBlobResource.cpp +37 -0
- package/Shared/Networking/DefaultBlobResource.h +12 -0
- package/Shared/Networking/WinRTWebSocketResource.h +5 -1
- 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/just-task.js +13 -2
- package/package.json +6 -6
- package/template/cpp-lib/proj/MyLib.sln +0 -33
- package/template/cs-lib/proj/MyLib.sln +0 -33
- package/templates/cpp-app/windows/MyApp/MyApp.vcxproj +1 -1
- 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/MyLib.vcxproj +1 -1
- 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,891 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
#pragma once
|
|
18
|
+
|
|
19
|
+
#include <atomic>
|
|
20
|
+
#include <chrono>
|
|
21
|
+
#include <memory>
|
|
22
|
+
|
|
23
|
+
#include <glog/logging.h>
|
|
24
|
+
|
|
25
|
+
#include <folly/ConstexprMath.h>
|
|
26
|
+
#include <folly/Optional.h>
|
|
27
|
+
#include <folly/Traits.h>
|
|
28
|
+
#include <folly/concurrency/CacheLocality.h>
|
|
29
|
+
#include <folly/lang/Align.h>
|
|
30
|
+
#include <folly/synchronization/Hazptr.h>
|
|
31
|
+
#include <folly/synchronization/SaturatingSemaphore.h>
|
|
32
|
+
#include <folly/synchronization/WaitOptions.h>
|
|
33
|
+
#include <folly/synchronization/detail/Spin.h>
|
|
34
|
+
|
|
35
|
+
namespace folly {
|
|
36
|
+
|
|
37
|
+
/// UnboundedQueue supports a variety of options for unbounded
|
|
38
|
+
/// dynamically expanding an shrinking queues, including variations of:
|
|
39
|
+
/// - Single vs. multiple producers
|
|
40
|
+
/// - Single vs. multiple consumers
|
|
41
|
+
/// - Blocking vs. spin-waiting
|
|
42
|
+
/// - Non-waiting, timed, and waiting consumer operations.
|
|
43
|
+
/// Producer operations never wait or fail (unless out-of-memory).
|
|
44
|
+
///
|
|
45
|
+
/// Template parameters:
|
|
46
|
+
/// - T: element type
|
|
47
|
+
/// - SingleProducer: true if there can be only one producer at a
|
|
48
|
+
/// time.
|
|
49
|
+
/// - SingleConsumer: true if there can be only one consumer at a
|
|
50
|
+
/// time.
|
|
51
|
+
/// - MayBlock: true if consumers may block, false if they only
|
|
52
|
+
/// spin. A performance tuning parameter.
|
|
53
|
+
/// - LgSegmentSize (default 8): Log base 2 of number of elements per
|
|
54
|
+
/// segment. A performance tuning parameter. See below.
|
|
55
|
+
/// - LgAlign (default 7): Log base 2 of alignment directive; can be
|
|
56
|
+
/// used to balance scalability (avoidance of false sharing) with
|
|
57
|
+
/// memory efficiency.
|
|
58
|
+
///
|
|
59
|
+
/// When to use UnboundedQueue:
|
|
60
|
+
/// - If a small bound may lead to deadlock or performance degradation
|
|
61
|
+
/// under bursty patterns.
|
|
62
|
+
/// - If there is no risk of the queue growing too much.
|
|
63
|
+
///
|
|
64
|
+
/// When not to use UnboundedQueue:
|
|
65
|
+
/// - If there is risk of the queue growing too much and a large bound
|
|
66
|
+
/// is acceptable, then use DynamicBoundedQueue.
|
|
67
|
+
/// - If the queue must not allocate on enqueue or it must have a
|
|
68
|
+
/// small bound, then use fixed-size MPMCQueue or (if non-blocking
|
|
69
|
+
/// SPSC) ProducerConsumerQueue.
|
|
70
|
+
///
|
|
71
|
+
/// Template Aliases:
|
|
72
|
+
/// USPSCQueue<T, MayBlock, LgSegmentSize, LgAlign>
|
|
73
|
+
/// UMPSCQueue<T, MayBlock, LgSegmentSize, LgAlign>
|
|
74
|
+
/// USPMCQueue<T, MayBlock, LgSegmentSize, LgAlign>
|
|
75
|
+
/// UMPMCQueue<T, MayBlock, LgSegmentSize, LgAlign>
|
|
76
|
+
///
|
|
77
|
+
/// Functions:
|
|
78
|
+
/// Producer operations never wait or fail (unless OOM)
|
|
79
|
+
/// void enqueue(const T&);
|
|
80
|
+
/// void enqueue(T&&);
|
|
81
|
+
/// Adds an element to the end of the queue.
|
|
82
|
+
///
|
|
83
|
+
/// Consumer operations:
|
|
84
|
+
/// void dequeue(T&);
|
|
85
|
+
/// T dequeue();
|
|
86
|
+
/// Extracts an element from the front of the queue. Waits
|
|
87
|
+
/// until an element is available if needed.
|
|
88
|
+
/// bool try_dequeue(T&);
|
|
89
|
+
/// folly::Optional<T> try_dequeue();
|
|
90
|
+
/// Tries to extract an element from the front of the queue
|
|
91
|
+
/// if available.
|
|
92
|
+
/// bool try_dequeue_until(T&, time_point& deadline);
|
|
93
|
+
/// folly::Optional<T> try_dequeue_until(time_point& deadline);
|
|
94
|
+
/// Tries to extract an element from the front of the queue
|
|
95
|
+
/// if available until the specified deadline.
|
|
96
|
+
/// bool try_dequeue_for(T&, duration&);
|
|
97
|
+
/// folly::Optional<T> try_dequeue_for(duration&);
|
|
98
|
+
/// Tries to extract an element from the front of the queue if
|
|
99
|
+
/// available until the expiration of the specified duration.
|
|
100
|
+
/// const T* try_peek();
|
|
101
|
+
/// Returns pointer to the element at the front of the queue
|
|
102
|
+
/// if available, or nullptr if the queue is empty. Only for
|
|
103
|
+
/// SPSC and MPSC.
|
|
104
|
+
///
|
|
105
|
+
/// Secondary functions:
|
|
106
|
+
/// size_t size();
|
|
107
|
+
/// Returns an estimate of the size of the queue.
|
|
108
|
+
/// bool empty();
|
|
109
|
+
/// Returns true only if the queue was empty during the call.
|
|
110
|
+
/// Note: size() and empty() are guaranteed to be accurate only if
|
|
111
|
+
/// the queue is not changed concurrently.
|
|
112
|
+
///
|
|
113
|
+
/// Usage examples:
|
|
114
|
+
/// @code
|
|
115
|
+
/// /* UMPSC, doesn't block, 1024 int elements per segment */
|
|
116
|
+
/// UMPSCQueue<int, false, 10> q;
|
|
117
|
+
/// q.enqueue(1);
|
|
118
|
+
/// q.enqueue(2);
|
|
119
|
+
/// q.enqueue(3);
|
|
120
|
+
/// ASSERT_FALSE(q.empty());
|
|
121
|
+
/// ASSERT_EQ(q.size(), 3);
|
|
122
|
+
/// int v;
|
|
123
|
+
/// q.dequeue(v);
|
|
124
|
+
/// ASSERT_EQ(v, 1);
|
|
125
|
+
/// ASSERT_TRUE(try_dequeue(v));
|
|
126
|
+
/// ASSERT_EQ(v, 2);
|
|
127
|
+
/// ASSERT_TRUE(try_dequeue_until(v, now() + seconds(1)));
|
|
128
|
+
/// ASSERT_EQ(v, 3);
|
|
129
|
+
/// ASSERT_TRUE(q.empty());
|
|
130
|
+
/// ASSERT_EQ(q.size(), 0);
|
|
131
|
+
/// ASSERT_FALSE(try_dequeue(v));
|
|
132
|
+
/// ASSERT_FALSE(try_dequeue_for(v, microseconds(100)));
|
|
133
|
+
/// @endcode
|
|
134
|
+
///
|
|
135
|
+
/// Design:
|
|
136
|
+
/// - The queue is composed of one or more segments. Each segment has
|
|
137
|
+
/// a fixed size of 2^LgSegmentSize entries. Each segment is used
|
|
138
|
+
/// exactly once.
|
|
139
|
+
/// - Each entry is composed of a futex and a single element.
|
|
140
|
+
/// - Each segment's array of entries is strided to avoid false sharing.
|
|
141
|
+
/// I.e., to reduce any cacheline contention that might be induced by
|
|
142
|
+
/// concurrent mutations to the queue that might happen to affect
|
|
143
|
+
/// otherwise-adjacent locations that might happen to share cacheline.
|
|
144
|
+
/// - The queue contains two 64-bit ticket variables. The producer
|
|
145
|
+
/// ticket counts the number of producer tickets issued so far, and
|
|
146
|
+
/// the same for the consumer ticket. Each ticket number corresponds
|
|
147
|
+
/// to a specific entry in a specific segment.
|
|
148
|
+
/// - The queue maintains two pointers, head and tail. Head points to
|
|
149
|
+
/// the segment that corresponds to the current consumer
|
|
150
|
+
/// ticket. Similarly, tail pointer points to the segment that
|
|
151
|
+
/// corresponds to the producer ticket.
|
|
152
|
+
/// - Segments are organized as a singly linked list.
|
|
153
|
+
/// - The producer with the first ticket in the current producer
|
|
154
|
+
/// segment has primary responsibility for allocating and linking
|
|
155
|
+
/// the next segment. Other producers and connsumers may help do so
|
|
156
|
+
/// when needed if that thread is delayed.
|
|
157
|
+
/// - The producer with the last ticket in the current producer
|
|
158
|
+
/// segment is primarily responsible for advancing the tail pointer
|
|
159
|
+
/// to the next segment. Other producers and consumers may help do
|
|
160
|
+
/// so when needed if that thread is delayed.
|
|
161
|
+
/// - Similarly, the consumer with the last ticket in the current
|
|
162
|
+
/// consumer segment is primarily responsible for advancing the head
|
|
163
|
+
/// pointer to the next segment. Other consumers may help do so when
|
|
164
|
+
/// needed if that thread is delayed.
|
|
165
|
+
/// - The tail pointer must not lag behind the head pointer.
|
|
166
|
+
/// Otherwise, the algorithm cannot be certain about the removal of
|
|
167
|
+
/// segment and would have to incur higher costs to ensure safe
|
|
168
|
+
/// reclamation. Consumers must ensure that head never overtakes
|
|
169
|
+
/// tail.
|
|
170
|
+
///
|
|
171
|
+
/// Memory Usage:
|
|
172
|
+
/// - An empty queue contains one segment. A nonempty queue contains
|
|
173
|
+
/// one or two more segment than fits its contents.
|
|
174
|
+
/// - Removed segments are not reclaimed until there are no threads,
|
|
175
|
+
/// producers or consumers, with references to them or their
|
|
176
|
+
/// predecessors. That is, a lagging thread may delay the reclamation
|
|
177
|
+
/// of a chain of removed segments.
|
|
178
|
+
/// - The template parameter LgAlign can be used to reduce memory usage
|
|
179
|
+
/// at the cost of increased chance of false sharing.
|
|
180
|
+
///
|
|
181
|
+
/// Performance considerations:
|
|
182
|
+
/// - All operations take constant time, excluding the costs of
|
|
183
|
+
/// allocation, reclamation, interference from other threads, and
|
|
184
|
+
/// waiting for actions by other threads.
|
|
185
|
+
/// - In general, using the single producer and or single consumer
|
|
186
|
+
/// variants yield better performance than the MP and MC
|
|
187
|
+
/// alternatives.
|
|
188
|
+
/// - SPSC without blocking is the fastest configuration. It doesn't
|
|
189
|
+
/// include any read-modify-write atomic operations, full fences, or
|
|
190
|
+
/// system calls in the critical path.
|
|
191
|
+
/// - MP adds a fetch_add to the critical path of each producer operation.
|
|
192
|
+
/// - MC adds a fetch_add or compare_exchange to the critical path of
|
|
193
|
+
/// each consumer operation.
|
|
194
|
+
/// - The possibility of consumers blocking, even if they never do,
|
|
195
|
+
/// adds a compare_exchange to the critical path of each producer
|
|
196
|
+
/// operation.
|
|
197
|
+
/// - MPMC, SPMC, MPSC require the use of a deferred reclamation
|
|
198
|
+
/// mechanism to guarantee that segments removed from the linked
|
|
199
|
+
/// list, i.e., unreachable from the head pointer, are reclaimed
|
|
200
|
+
/// only after they are no longer needed by any lagging producers or
|
|
201
|
+
/// consumers.
|
|
202
|
+
/// - The overheads of segment allocation and reclamation are intended
|
|
203
|
+
/// to be mostly out of the critical path of the queue's throughput.
|
|
204
|
+
/// - If the template parameter LgSegmentSize is changed, it should be
|
|
205
|
+
/// set adequately high to keep the amortized cost of allocation and
|
|
206
|
+
/// reclamation low.
|
|
207
|
+
/// - It is recommended to measure performance with different variants
|
|
208
|
+
/// when applicable, e.g., UMPMC vs UMPSC. Depending on the use
|
|
209
|
+
/// case, sometimes the variant with the higher sequential overhead
|
|
210
|
+
/// may yield better results due to, for example, more favorable
|
|
211
|
+
/// producer-consumer balance or favorable timing for avoiding
|
|
212
|
+
/// costly blocking.
|
|
213
|
+
///
|
|
214
|
+
/// Guarantees:
|
|
215
|
+
/// - The queues are linearizable:
|
|
216
|
+
/// - For two enqueue operations q(A) and q(B), if q(A) < q(B) in
|
|
217
|
+
/// the happens-before relation, then A precedes B in the queue.
|
|
218
|
+
/// - For two dequeue operations d(A) and d(B), if d(A) < d(B) in
|
|
219
|
+
/// the happens-before relation, then A preceded B in the queue.
|
|
220
|
+
|
|
221
|
+
template <
|
|
222
|
+
typename T,
|
|
223
|
+
bool SingleProducer,
|
|
224
|
+
bool SingleConsumer,
|
|
225
|
+
bool MayBlock,
|
|
226
|
+
size_t LgSegmentSize = 8,
|
|
227
|
+
size_t LgAlign = constexpr_log2(hardware_destructive_interference_size),
|
|
228
|
+
template <typename> class Atom = std::atomic>
|
|
229
|
+
class UnboundedQueue {
|
|
230
|
+
using Ticket = uint64_t;
|
|
231
|
+
class Entry;
|
|
232
|
+
class Segment;
|
|
233
|
+
|
|
234
|
+
static constexpr bool SPSC = SingleProducer && SingleConsumer;
|
|
235
|
+
static constexpr size_t Stride = SPSC || (LgSegmentSize <= 1) ? 1 : 27;
|
|
236
|
+
static constexpr size_t SegmentSize = 1u << LgSegmentSize;
|
|
237
|
+
static constexpr size_t Align = 1u << LgAlign;
|
|
238
|
+
|
|
239
|
+
static_assert(
|
|
240
|
+
std::is_nothrow_destructible<T>::value, "T must be nothrow_destructible");
|
|
241
|
+
static_assert((Stride & 1) == 1, "Stride must be odd");
|
|
242
|
+
static_assert(LgSegmentSize < 32, "LgSegmentSize must be < 32");
|
|
243
|
+
static_assert(LgAlign < 16, "LgAlign must be < 16");
|
|
244
|
+
|
|
245
|
+
using Sem = folly::SaturatingSemaphore<MayBlock, Atom>;
|
|
246
|
+
|
|
247
|
+
struct Consumer {
|
|
248
|
+
Atom<Segment*> head;
|
|
249
|
+
Atom<Ticket> ticket;
|
|
250
|
+
hazptr_obj_cohort<Atom> cohort;
|
|
251
|
+
explicit Consumer(Segment* s) : head(s), ticket(0) {
|
|
252
|
+
s->set_cohort_no_tag(&cohort); // defined in hazptr_obj
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
struct Producer {
|
|
256
|
+
Atom<Segment*> tail;
|
|
257
|
+
Atom<Ticket> ticket;
|
|
258
|
+
explicit Producer(Segment* s) : tail(s), ticket(0) {}
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
alignas(Align) Consumer c_;
|
|
262
|
+
alignas(Align) Producer p_;
|
|
263
|
+
|
|
264
|
+
public:
|
|
265
|
+
using value_type = T;
|
|
266
|
+
using size_type = size_t;
|
|
267
|
+
|
|
268
|
+
/** constructor */
|
|
269
|
+
UnboundedQueue()
|
|
270
|
+
: c_(new Segment(0)), p_(c_.head.load(std::memory_order_relaxed)) {}
|
|
271
|
+
|
|
272
|
+
/** destructor */
|
|
273
|
+
~UnboundedQueue() {
|
|
274
|
+
cleanUpRemainingItems();
|
|
275
|
+
reclaimRemainingSegments();
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/** enqueue */
|
|
279
|
+
FOLLY_ALWAYS_INLINE void enqueue(const T& arg) { enqueueImpl(arg); }
|
|
280
|
+
|
|
281
|
+
FOLLY_ALWAYS_INLINE void enqueue(T&& arg) { enqueueImpl(std::move(arg)); }
|
|
282
|
+
|
|
283
|
+
/** dequeue */
|
|
284
|
+
FOLLY_ALWAYS_INLINE void dequeue(T& item) noexcept { item = dequeueImpl(); }
|
|
285
|
+
|
|
286
|
+
FOLLY_ALWAYS_INLINE T dequeue() noexcept { return dequeueImpl(); }
|
|
287
|
+
|
|
288
|
+
/** try_dequeue */
|
|
289
|
+
FOLLY_ALWAYS_INLINE bool try_dequeue(T& item) noexcept {
|
|
290
|
+
auto o = try_dequeue();
|
|
291
|
+
if (FOLLY_LIKELY(o.has_value())) {
|
|
292
|
+
item = std::move(*o);
|
|
293
|
+
return true;
|
|
294
|
+
}
|
|
295
|
+
return false;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
FOLLY_ALWAYS_INLINE folly::Optional<T> try_dequeue() noexcept {
|
|
299
|
+
return tryDequeueUntil(std::chrono::steady_clock::time_point::min());
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/** try_dequeue_until */
|
|
303
|
+
template <typename Clock, typename Duration>
|
|
304
|
+
FOLLY_ALWAYS_INLINE bool try_dequeue_until(
|
|
305
|
+
T& item,
|
|
306
|
+
const std::chrono::time_point<Clock, Duration>& deadline) noexcept {
|
|
307
|
+
folly::Optional<T> o = try_dequeue_until(deadline);
|
|
308
|
+
|
|
309
|
+
if (FOLLY_LIKELY(o.has_value())) {
|
|
310
|
+
item = std::move(*o);
|
|
311
|
+
return true;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
return false;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
template <typename Clock, typename Duration>
|
|
318
|
+
FOLLY_ALWAYS_INLINE folly::Optional<T> try_dequeue_until(
|
|
319
|
+
const std::chrono::time_point<Clock, Duration>& deadline) noexcept {
|
|
320
|
+
return tryDequeueUntil(deadline);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/** try_dequeue_for */
|
|
324
|
+
template <typename Rep, typename Period>
|
|
325
|
+
FOLLY_ALWAYS_INLINE bool try_dequeue_for(
|
|
326
|
+
T& item, const std::chrono::duration<Rep, Period>& duration) noexcept {
|
|
327
|
+
folly::Optional<T> o = try_dequeue_for(duration);
|
|
328
|
+
|
|
329
|
+
if (FOLLY_LIKELY(o.has_value())) {
|
|
330
|
+
item = std::move(*o);
|
|
331
|
+
return true;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
return false;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
template <typename Rep, typename Period>
|
|
338
|
+
FOLLY_ALWAYS_INLINE folly::Optional<T> try_dequeue_for(
|
|
339
|
+
const std::chrono::duration<Rep, Period>& duration) noexcept {
|
|
340
|
+
folly::Optional<T> o = try_dequeue();
|
|
341
|
+
if (FOLLY_LIKELY(o.has_value())) {
|
|
342
|
+
return o;
|
|
343
|
+
}
|
|
344
|
+
return tryDequeueUntil(std::chrono::steady_clock::now() + duration);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/** try_peek */
|
|
348
|
+
FOLLY_ALWAYS_INLINE const T* try_peek() noexcept {
|
|
349
|
+
static_assert(SingleConsumer, "not single-consumer");
|
|
350
|
+
return tryPeekUntil(std::chrono::steady_clock::time_point::min());
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/** size */
|
|
354
|
+
size_t size() const noexcept {
|
|
355
|
+
auto p = producerTicket();
|
|
356
|
+
auto c = consumerTicket();
|
|
357
|
+
return p > c ? p - c : 0;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/** empty */
|
|
361
|
+
bool empty() const noexcept {
|
|
362
|
+
auto c = consumerTicket();
|
|
363
|
+
auto p = producerTicket();
|
|
364
|
+
return p <= c;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
private:
|
|
368
|
+
/** enqueueImpl */
|
|
369
|
+
template <typename Arg>
|
|
370
|
+
FOLLY_ALWAYS_INLINE void enqueueImpl(Arg&& arg) {
|
|
371
|
+
if (SPSC) {
|
|
372
|
+
Segment* s = tail();
|
|
373
|
+
enqueueCommon(s, std::forward<Arg>(arg));
|
|
374
|
+
} else {
|
|
375
|
+
// Using hazptr_holder instead of hazptr_local because it is
|
|
376
|
+
// possible that the T ctor happens to use hazard pointers.
|
|
377
|
+
hazptr_holder<Atom> hptr = make_hazard_pointer<Atom>();
|
|
378
|
+
Segment* s = hptr.protect(p_.tail);
|
|
379
|
+
enqueueCommon(s, std::forward<Arg>(arg));
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/** enqueueCommon */
|
|
384
|
+
template <typename Arg>
|
|
385
|
+
FOLLY_ALWAYS_INLINE void enqueueCommon(Segment* s, Arg&& arg) {
|
|
386
|
+
Ticket t = fetchIncrementProducerTicket();
|
|
387
|
+
if (!SingleProducer) {
|
|
388
|
+
s = findSegment(s, t);
|
|
389
|
+
}
|
|
390
|
+
DCHECK_GE(t, s->minTicket());
|
|
391
|
+
DCHECK_LT(t, s->minTicket() + SegmentSize);
|
|
392
|
+
size_t idx = index(t);
|
|
393
|
+
Entry& e = s->entry(idx);
|
|
394
|
+
e.putItem(std::forward<Arg>(arg));
|
|
395
|
+
if (responsibleForAlloc(t)) {
|
|
396
|
+
allocNextSegment(s);
|
|
397
|
+
}
|
|
398
|
+
if (responsibleForAdvance(t)) {
|
|
399
|
+
advanceTail(s);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/** dequeueImpl */
|
|
404
|
+
FOLLY_ALWAYS_INLINE T dequeueImpl() noexcept {
|
|
405
|
+
if (SPSC) {
|
|
406
|
+
Segment* s = head();
|
|
407
|
+
return dequeueCommon(s);
|
|
408
|
+
} else {
|
|
409
|
+
// Using hazptr_holder instead of hazptr_local because it is
|
|
410
|
+
// possible to call the T dtor and it may happen to use hazard
|
|
411
|
+
// pointers.
|
|
412
|
+
hazptr_holder<Atom> hptr = make_hazard_pointer<Atom>();
|
|
413
|
+
Segment* s = hptr.protect(c_.head);
|
|
414
|
+
return dequeueCommon(s);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
/** dequeueCommon */
|
|
419
|
+
FOLLY_ALWAYS_INLINE T dequeueCommon(Segment* s) noexcept {
|
|
420
|
+
Ticket t = fetchIncrementConsumerTicket();
|
|
421
|
+
if (!SingleConsumer) {
|
|
422
|
+
s = findSegment(s, t);
|
|
423
|
+
}
|
|
424
|
+
size_t idx = index(t);
|
|
425
|
+
Entry& e = s->entry(idx);
|
|
426
|
+
auto res = e.takeItem();
|
|
427
|
+
if (responsibleForAdvance(t)) {
|
|
428
|
+
advanceHead(s);
|
|
429
|
+
}
|
|
430
|
+
return res;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/** tryDequeueUntil */
|
|
434
|
+
template <typename Clock, typename Duration>
|
|
435
|
+
FOLLY_ALWAYS_INLINE folly::Optional<T> tryDequeueUntil(
|
|
436
|
+
const std::chrono::time_point<Clock, Duration>& deadline) noexcept {
|
|
437
|
+
if (SingleConsumer) {
|
|
438
|
+
Segment* s = head();
|
|
439
|
+
return tryDequeueUntilSC(s, deadline);
|
|
440
|
+
} else {
|
|
441
|
+
// Using hazptr_holder instead of hazptr_local because it is
|
|
442
|
+
// possible to call ~T() and it may happen to use hazard pointers.
|
|
443
|
+
hazptr_holder<Atom> hptr = make_hazard_pointer<Atom>();
|
|
444
|
+
Segment* s = hptr.protect(c_.head);
|
|
445
|
+
return tryDequeueUntilMC(s, deadline);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
/** tryDequeueUntilSC */
|
|
450
|
+
template <typename Clock, typename Duration>
|
|
451
|
+
FOLLY_ALWAYS_INLINE folly::Optional<T> tryDequeueUntilSC(
|
|
452
|
+
Segment* s,
|
|
453
|
+
const std::chrono::time_point<Clock, Duration>& deadline) noexcept {
|
|
454
|
+
Ticket t = consumerTicket();
|
|
455
|
+
DCHECK_GE(t, s->minTicket());
|
|
456
|
+
DCHECK_LT(t, (s->minTicket() + SegmentSize));
|
|
457
|
+
size_t idx = index(t);
|
|
458
|
+
Entry& e = s->entry(idx);
|
|
459
|
+
if (FOLLY_UNLIKELY(!tryDequeueWaitElem(e, t, deadline))) {
|
|
460
|
+
return folly::Optional<T>();
|
|
461
|
+
}
|
|
462
|
+
setConsumerTicket(t + 1);
|
|
463
|
+
folly::Optional<T> ret = e.takeItem();
|
|
464
|
+
if (responsibleForAdvance(t)) {
|
|
465
|
+
advanceHead(s);
|
|
466
|
+
}
|
|
467
|
+
return ret;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/** tryDequeueUntilMC */
|
|
471
|
+
template <typename Clock, typename Duration>
|
|
472
|
+
FOLLY_ALWAYS_INLINE folly::Optional<T> tryDequeueUntilMC(
|
|
473
|
+
Segment* s,
|
|
474
|
+
const std::chrono::time_point<Clock, Duration>& deadline) noexcept {
|
|
475
|
+
while (true) {
|
|
476
|
+
Ticket t = consumerTicket();
|
|
477
|
+
if (FOLLY_UNLIKELY(t >= (s->minTicket() + SegmentSize))) {
|
|
478
|
+
s = getAllocNextSegment(s, t);
|
|
479
|
+
DCHECK(s);
|
|
480
|
+
continue;
|
|
481
|
+
}
|
|
482
|
+
size_t idx = index(t);
|
|
483
|
+
Entry& e = s->entry(idx);
|
|
484
|
+
if (FOLLY_UNLIKELY(!tryDequeueWaitElem(e, t, deadline))) {
|
|
485
|
+
return folly::Optional<T>();
|
|
486
|
+
}
|
|
487
|
+
if (!c_.ticket.compare_exchange_weak(
|
|
488
|
+
t, t + 1, std::memory_order_acq_rel, std::memory_order_acquire)) {
|
|
489
|
+
continue;
|
|
490
|
+
}
|
|
491
|
+
folly::Optional<T> ret = e.takeItem();
|
|
492
|
+
if (responsibleForAdvance(t)) {
|
|
493
|
+
advanceHead(s);
|
|
494
|
+
}
|
|
495
|
+
return ret;
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
/** tryDequeueWaitElem */
|
|
500
|
+
template <typename Clock, typename Duration>
|
|
501
|
+
FOLLY_ALWAYS_INLINE bool tryDequeueWaitElem(
|
|
502
|
+
Entry& e,
|
|
503
|
+
Ticket t,
|
|
504
|
+
const std::chrono::time_point<Clock, Duration>& deadline) noexcept {
|
|
505
|
+
if (FOLLY_LIKELY(e.tryWaitUntil(deadline))) {
|
|
506
|
+
return true;
|
|
507
|
+
}
|
|
508
|
+
return t < producerTicket();
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
/** tryPeekUntil */
|
|
512
|
+
template <typename Clock, typename Duration>
|
|
513
|
+
FOLLY_ALWAYS_INLINE const T* tryPeekUntil(
|
|
514
|
+
const std::chrono::time_point<Clock, Duration>& deadline) noexcept {
|
|
515
|
+
// This function is supported only for USPSC and UMPSC queues.
|
|
516
|
+
DCHECK(SingleConsumer);
|
|
517
|
+
Segment* s = head();
|
|
518
|
+
Ticket t = consumerTicket();
|
|
519
|
+
DCHECK_GE(t, s->minTicket());
|
|
520
|
+
DCHECK_LT(t, (s->minTicket() + SegmentSize));
|
|
521
|
+
size_t idx = index(t);
|
|
522
|
+
Entry& e = s->entry(idx);
|
|
523
|
+
if (FOLLY_UNLIKELY(!tryDequeueWaitElem(e, t, deadline))) {
|
|
524
|
+
return nullptr;
|
|
525
|
+
}
|
|
526
|
+
return e.peekItem();
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
/** findSegment */
|
|
530
|
+
FOLLY_ALWAYS_INLINE
|
|
531
|
+
Segment* findSegment(Segment* s, const Ticket t) noexcept {
|
|
532
|
+
while (FOLLY_UNLIKELY(t >= (s->minTicket() + SegmentSize))) {
|
|
533
|
+
s = getAllocNextSegment(s, t);
|
|
534
|
+
DCHECK(s);
|
|
535
|
+
}
|
|
536
|
+
return s;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
/** getAllocNextSegment */
|
|
540
|
+
Segment* getAllocNextSegment(Segment* s, Ticket t) noexcept {
|
|
541
|
+
Segment* next = s->nextSegment();
|
|
542
|
+
if (!next) {
|
|
543
|
+
DCHECK_GE(t, s->minTicket() + SegmentSize);
|
|
544
|
+
auto diff = t - (s->minTicket() + SegmentSize);
|
|
545
|
+
if (diff > 0) {
|
|
546
|
+
auto dur = std::chrono::microseconds(diff);
|
|
547
|
+
auto deadline = std::chrono::steady_clock::now() + dur;
|
|
548
|
+
WaitOptions opt;
|
|
549
|
+
opt.spin_max(dur);
|
|
550
|
+
detail::spin_pause_until(
|
|
551
|
+
deadline, opt, [s] { return s->nextSegment(); });
|
|
552
|
+
next = s->nextSegment();
|
|
553
|
+
if (next) {
|
|
554
|
+
return next;
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
next = allocNextSegment(s);
|
|
558
|
+
}
|
|
559
|
+
DCHECK(next);
|
|
560
|
+
return next;
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
/** allocNextSegment */
|
|
564
|
+
Segment* allocNextSegment(Segment* s) {
|
|
565
|
+
auto t = s->minTicket() + SegmentSize;
|
|
566
|
+
Segment* next = new Segment(t);
|
|
567
|
+
next->set_cohort_no_tag(&c_.cohort); // defined in hazptr_obj
|
|
568
|
+
next->acquire_ref_safe(); // defined in hazptr_obj_base_linked
|
|
569
|
+
if (!s->casNextSegment(next)) {
|
|
570
|
+
delete next;
|
|
571
|
+
next = s->nextSegment();
|
|
572
|
+
}
|
|
573
|
+
DCHECK(next);
|
|
574
|
+
return next;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
/** advanceTail */
|
|
578
|
+
void advanceTail(Segment* s) noexcept {
|
|
579
|
+
if (SPSC) {
|
|
580
|
+
Segment* next = s->nextSegment();
|
|
581
|
+
DCHECK(next);
|
|
582
|
+
setTail(next);
|
|
583
|
+
} else {
|
|
584
|
+
Ticket t = s->minTicket() + SegmentSize;
|
|
585
|
+
advanceTailToTicket(t);
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
/** advanceTailToTicket */
|
|
590
|
+
void advanceTailToTicket(Ticket t) noexcept {
|
|
591
|
+
Segment* s = tail();
|
|
592
|
+
while (s->minTicket() < t) {
|
|
593
|
+
Segment* next = s->nextSegment();
|
|
594
|
+
if (!next) {
|
|
595
|
+
next = allocNextSegment(s);
|
|
596
|
+
}
|
|
597
|
+
DCHECK(next);
|
|
598
|
+
casTail(s, next);
|
|
599
|
+
s = tail();
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
/** advanceHead */
|
|
604
|
+
void advanceHead(Segment* s) noexcept {
|
|
605
|
+
if (SPSC) {
|
|
606
|
+
while (tail() == s) {
|
|
607
|
+
/* Wait for producer to advance tail. */
|
|
608
|
+
asm_volatile_pause();
|
|
609
|
+
}
|
|
610
|
+
Segment* next = s->nextSegment();
|
|
611
|
+
DCHECK(next);
|
|
612
|
+
setHead(next);
|
|
613
|
+
reclaimSegment(s);
|
|
614
|
+
} else {
|
|
615
|
+
Ticket t = s->minTicket() + SegmentSize;
|
|
616
|
+
advanceHeadToTicket(t);
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
/** advanceHeadToTicket */
|
|
621
|
+
void advanceHeadToTicket(Ticket t) noexcept {
|
|
622
|
+
/* Tail must not lag behind head. Otherwise, the algorithm cannot
|
|
623
|
+
be certain about removal of segments. */
|
|
624
|
+
advanceTailToTicket(t);
|
|
625
|
+
Segment* s = head();
|
|
626
|
+
if (SingleConsumer) {
|
|
627
|
+
DCHECK_EQ(s->minTicket() + SegmentSize, t);
|
|
628
|
+
Segment* next = s->nextSegment();
|
|
629
|
+
DCHECK(next);
|
|
630
|
+
setHead(next);
|
|
631
|
+
reclaimSegment(s);
|
|
632
|
+
} else {
|
|
633
|
+
while (s->minTicket() < t) {
|
|
634
|
+
Segment* next = s->nextSegment();
|
|
635
|
+
DCHECK(next);
|
|
636
|
+
if (casHead(s, next)) {
|
|
637
|
+
reclaimSegment(s);
|
|
638
|
+
s = next;
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
/** reclaimSegment */
|
|
645
|
+
void reclaimSegment(Segment* s) noexcept {
|
|
646
|
+
if (SPSC) {
|
|
647
|
+
delete s;
|
|
648
|
+
} else {
|
|
649
|
+
s->retire(); // defined in hazptr_obj_base_linked
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
/** cleanUpRemainingItems */
|
|
654
|
+
void cleanUpRemainingItems() {
|
|
655
|
+
auto end = producerTicket();
|
|
656
|
+
auto s = head();
|
|
657
|
+
for (auto t = consumerTicket(); t < end; ++t) {
|
|
658
|
+
if (t >= s->minTicket() + SegmentSize) {
|
|
659
|
+
s = s->nextSegment();
|
|
660
|
+
}
|
|
661
|
+
DCHECK_LT(t, (s->minTicket() + SegmentSize));
|
|
662
|
+
auto idx = index(t);
|
|
663
|
+
auto& e = s->entry(idx);
|
|
664
|
+
e.destroyItem();
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
/** reclaimRemainingSegments */
|
|
669
|
+
void reclaimRemainingSegments() {
|
|
670
|
+
auto h = head();
|
|
671
|
+
auto s = h->nextSegment();
|
|
672
|
+
h->setNextSegment(nullptr);
|
|
673
|
+
reclaimSegment(h);
|
|
674
|
+
while (s) {
|
|
675
|
+
auto next = s->nextSegment();
|
|
676
|
+
delete s;
|
|
677
|
+
s = next;
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
FOLLY_ALWAYS_INLINE size_t index(Ticket t) const noexcept {
|
|
682
|
+
return (t * Stride) & (SegmentSize - 1);
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
FOLLY_ALWAYS_INLINE bool responsibleForAlloc(Ticket t) const noexcept {
|
|
686
|
+
return (t & (SegmentSize - 1)) == 0;
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
FOLLY_ALWAYS_INLINE bool responsibleForAdvance(Ticket t) const noexcept {
|
|
690
|
+
return (t & (SegmentSize - 1)) == (SegmentSize - 1);
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
FOLLY_ALWAYS_INLINE Segment* head() const noexcept {
|
|
694
|
+
return c_.head.load(std::memory_order_acquire);
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
FOLLY_ALWAYS_INLINE Segment* tail() const noexcept {
|
|
698
|
+
return p_.tail.load(std::memory_order_acquire);
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
FOLLY_ALWAYS_INLINE Ticket producerTicket() const noexcept {
|
|
702
|
+
return p_.ticket.load(std::memory_order_acquire);
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
FOLLY_ALWAYS_INLINE Ticket consumerTicket() const noexcept {
|
|
706
|
+
return c_.ticket.load(std::memory_order_acquire);
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
void setHead(Segment* s) noexcept {
|
|
710
|
+
DCHECK(SingleConsumer);
|
|
711
|
+
c_.head.store(s, std::memory_order_relaxed);
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
void setTail(Segment* s) noexcept {
|
|
715
|
+
DCHECK(SPSC);
|
|
716
|
+
p_.tail.store(s, std::memory_order_release);
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
bool casHead(Segment*& s, Segment* next) noexcept {
|
|
720
|
+
DCHECK(!SingleConsumer);
|
|
721
|
+
return c_.head.compare_exchange_strong(
|
|
722
|
+
s, next, std::memory_order_release, std::memory_order_acquire);
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
void casTail(Segment*& s, Segment* next) noexcept {
|
|
726
|
+
DCHECK(!SPSC);
|
|
727
|
+
p_.tail.compare_exchange_strong(
|
|
728
|
+
s, next, std::memory_order_release, std::memory_order_relaxed);
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
FOLLY_ALWAYS_INLINE void setProducerTicket(Ticket t) noexcept {
|
|
732
|
+
p_.ticket.store(t, std::memory_order_release);
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
FOLLY_ALWAYS_INLINE void setConsumerTicket(Ticket t) noexcept {
|
|
736
|
+
c_.ticket.store(t, std::memory_order_release);
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
FOLLY_ALWAYS_INLINE Ticket fetchIncrementConsumerTicket() noexcept {
|
|
740
|
+
if (SingleConsumer) {
|
|
741
|
+
Ticket oldval = consumerTicket();
|
|
742
|
+
setConsumerTicket(oldval + 1);
|
|
743
|
+
return oldval;
|
|
744
|
+
} else { // MC
|
|
745
|
+
return c_.ticket.fetch_add(1, std::memory_order_acq_rel);
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
FOLLY_ALWAYS_INLINE Ticket fetchIncrementProducerTicket() noexcept {
|
|
750
|
+
if (SingleProducer) {
|
|
751
|
+
Ticket oldval = producerTicket();
|
|
752
|
+
setProducerTicket(oldval + 1);
|
|
753
|
+
return oldval;
|
|
754
|
+
} else { // MP
|
|
755
|
+
return p_.ticket.fetch_add(1, std::memory_order_acq_rel);
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
/**
|
|
760
|
+
* Entry
|
|
761
|
+
*/
|
|
762
|
+
class Entry {
|
|
763
|
+
Sem flag_;
|
|
764
|
+
aligned_storage_for_t<T> item_;
|
|
765
|
+
|
|
766
|
+
public:
|
|
767
|
+
template <typename Arg>
|
|
768
|
+
FOLLY_ALWAYS_INLINE void putItem(Arg&& arg) {
|
|
769
|
+
new (&item_) T(std::forward<Arg>(arg));
|
|
770
|
+
flag_.post();
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
FOLLY_ALWAYS_INLINE T takeItem() noexcept {
|
|
774
|
+
flag_.wait();
|
|
775
|
+
return getItem();
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
FOLLY_ALWAYS_INLINE const T* peekItem() noexcept {
|
|
779
|
+
flag_.wait();
|
|
780
|
+
return itemPtr();
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
template <typename Clock, typename Duration>
|
|
784
|
+
FOLLY_EXPORT FOLLY_ALWAYS_INLINE bool tryWaitUntil(
|
|
785
|
+
const std::chrono::time_point<Clock, Duration>& deadline) noexcept {
|
|
786
|
+
// wait-options from benchmarks on contended queues:
|
|
787
|
+
static constexpr auto const opt =
|
|
788
|
+
Sem::wait_options().spin_max(std::chrono::microseconds(10));
|
|
789
|
+
return flag_.try_wait_until(deadline, opt);
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
FOLLY_ALWAYS_INLINE void destroyItem() noexcept { itemPtr()->~T(); }
|
|
793
|
+
|
|
794
|
+
private:
|
|
795
|
+
FOLLY_ALWAYS_INLINE T getItem() noexcept {
|
|
796
|
+
T ret = std::move(*(itemPtr()));
|
|
797
|
+
destroyItem();
|
|
798
|
+
return ret;
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
FOLLY_ALWAYS_INLINE T* itemPtr() noexcept {
|
|
802
|
+
return static_cast<T*>(static_cast<void*>(&item_));
|
|
803
|
+
}
|
|
804
|
+
}; // Entry
|
|
805
|
+
|
|
806
|
+
/**
|
|
807
|
+
* Segment
|
|
808
|
+
*/
|
|
809
|
+
class Segment : public hazptr_obj_base_linked<Segment, Atom> {
|
|
810
|
+
Atom<Segment*> next_{nullptr};
|
|
811
|
+
const Ticket min_;
|
|
812
|
+
alignas(Align) Entry b_[SegmentSize];
|
|
813
|
+
|
|
814
|
+
public:
|
|
815
|
+
explicit Segment(const Ticket t) noexcept : min_(t) {}
|
|
816
|
+
|
|
817
|
+
Segment* nextSegment() const noexcept {
|
|
818
|
+
return next_.load(std::memory_order_acquire);
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
void setNextSegment(Segment* next) {
|
|
822
|
+
next_.store(next, std::memory_order_relaxed);
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
bool casNextSegment(Segment* next) noexcept {
|
|
826
|
+
Segment* expected = nullptr;
|
|
827
|
+
return next_.compare_exchange_strong(
|
|
828
|
+
expected, next, std::memory_order_release, std::memory_order_relaxed);
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
FOLLY_ALWAYS_INLINE Ticket minTicket() const noexcept {
|
|
832
|
+
DCHECK_EQ((min_ & (SegmentSize - 1)), Ticket(0));
|
|
833
|
+
return min_;
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
FOLLY_ALWAYS_INLINE Entry& entry(size_t index) noexcept {
|
|
837
|
+
return b_[index];
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
template <typename S>
|
|
841
|
+
void push_links(bool m, S& s) {
|
|
842
|
+
if (m == false) { // next_ is immutable
|
|
843
|
+
auto p = nextSegment();
|
|
844
|
+
if (p) {
|
|
845
|
+
s.push(p);
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
}; // Segment
|
|
850
|
+
|
|
851
|
+
}; // UnboundedQueue
|
|
852
|
+
|
|
853
|
+
/* Aliases */
|
|
854
|
+
|
|
855
|
+
template <
|
|
856
|
+
typename T,
|
|
857
|
+
bool MayBlock,
|
|
858
|
+
size_t LgSegmentSize = 8,
|
|
859
|
+
size_t LgAlign = constexpr_log2(hardware_destructive_interference_size),
|
|
860
|
+
template <typename> class Atom = std::atomic>
|
|
861
|
+
using USPSCQueue =
|
|
862
|
+
UnboundedQueue<T, true, true, MayBlock, LgSegmentSize, LgAlign, Atom>;
|
|
863
|
+
|
|
864
|
+
template <
|
|
865
|
+
typename T,
|
|
866
|
+
bool MayBlock,
|
|
867
|
+
size_t LgSegmentSize = 8,
|
|
868
|
+
size_t LgAlign = constexpr_log2(hardware_destructive_interference_size),
|
|
869
|
+
template <typename> class Atom = std::atomic>
|
|
870
|
+
using UMPSCQueue =
|
|
871
|
+
UnboundedQueue<T, false, true, MayBlock, LgSegmentSize, LgAlign, Atom>;
|
|
872
|
+
|
|
873
|
+
template <
|
|
874
|
+
typename T,
|
|
875
|
+
bool MayBlock,
|
|
876
|
+
size_t LgSegmentSize = 8,
|
|
877
|
+
size_t LgAlign = constexpr_log2(hardware_destructive_interference_size),
|
|
878
|
+
template <typename> class Atom = std::atomic>
|
|
879
|
+
using USPMCQueue =
|
|
880
|
+
UnboundedQueue<T, true, false, MayBlock, LgSegmentSize, LgAlign, Atom>;
|
|
881
|
+
|
|
882
|
+
template <
|
|
883
|
+
typename T,
|
|
884
|
+
bool MayBlock,
|
|
885
|
+
size_t LgSegmentSize = 8,
|
|
886
|
+
size_t LgAlign = constexpr_log2(hardware_destructive_interference_size),
|
|
887
|
+
template <typename> class Atom = std::atomic>
|
|
888
|
+
using UMPMCQueue =
|
|
889
|
+
UnboundedQueue<T, false, false, MayBlock, LgSegmentSize, LgAlign, Atom>;
|
|
890
|
+
|
|
891
|
+
} // namespace folly
|