react-native-windows 0.81.32 → 0.81.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Directory.Build.props +2 -17
- package/Folly/ThreadNameStub.cpp +4 -6
- package/Microsoft.ReactNative/Fabric/Composition/BorderPrimitive.cpp +1 -1
- package/Microsoft.ReactNative/Fabric/Composition/CompositionEventHandler.cpp +27 -4
- package/Microsoft.ReactNative/Fabric/Composition/ScrollViewComponentView.cpp +8 -4
- package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp +7 -3
- package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj +2 -8
- package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj.filters +0 -3
- package/Microsoft.ReactNative.Cxx/Microsoft.ReactNative.Cxx.vcxitems +2 -2
- package/PropertySheets/Bundle.props +3 -3
- package/PropertySheets/CIBuildOptimizations.props +2 -2
- package/PropertySheets/Generated/PackageVersion.g.props +3 -3
- package/PropertySheets/JSEngine.props +1 -1
- package/PropertySheets/NuGet.LockFile.props +2 -1
- package/PropertySheets/React.Cpp.props +4 -4
- package/ReactCommon/ReactCommon.vcxproj +0 -10
- package/ReactCommon/packages.lock.win32.json +0 -10
- package/Scripts/NuGetRestoreForceEvaluateAllSolutions.ps1 +61 -6
- package/Scripts/Tfs/Layout-Desktop-Headers.ps1 +4 -37
- package/Scripts/Warm-RnwFeedCache.ps1 +413 -0
- package/Scripts/creaternwapp.cmd +5 -1
- package/Scripts/creaternwlib.cmd +8 -2
- package/Shared/Shared.vcxitems +2 -0
- package/{Folly → external}/.clang-format +0 -1
- package/external/External.vcxitems +10 -0
- package/external/fast-float/.syncignore +11 -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/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 +12 -0
- package/external/fmt/CONTRIBUTING.md +20 -0
- package/external/fmt/LICENSE +27 -0
- package/{fmt → external/fmt}/cgmanifest.json +1 -1
- package/external/fmt/fmt.vcxitems +28 -0
- package/external/fmt/include/fmt/args.h +228 -0
- package/{fmt/TEMP_UntilFmtUpdate/core.h → external/fmt/include/fmt/base.h} +1188 -1036
- 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 +61 -0
- package/external/folly/LICENSE +200 -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/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/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/hash/SpookyHashV2.h +6 -1
- 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/sync-config.json +8 -0
- package/package.json +6 -6
- package/template/cpp-app/proj/MyApp.sln +0 -33
- package/template/cpp-lib/proj/MyLib.sln +0 -33
- package/template/cs-app/proj/MyApp.sln +0 -33
- package/template/cs-lib/proj/MyLib.sln +0 -33
- package/templates/cpp-app/windows/MyApp.sln +0 -33
- package/templates/cpp-lib/windows/MyLib.sln +0 -33
- package/Folly/Folly.vcxproj +0 -383
- package/Folly/Folly.vcxproj.filters +0 -558
- package/Folly/Folly.win32.vcxproj +0 -11
- package/Folly/packages.lock.win32.json +0 -20
- package/fmt/fmt.vcxproj +0 -163
- package/fmt/fmt.vcxproj.filters +0 -59
- package/fmt/fmt.win32.vcxproj +0 -10
- package/fmt/pch.cpp +0 -4
- package/fmt/pch.h +0 -2
- /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,484 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/*
|
|
18
|
+
* AtomicHashMap --
|
|
19
|
+
*
|
|
20
|
+
* A high-performance concurrent hash map with int32_t or int64_t keys. Supports
|
|
21
|
+
* insert, find(key), findAt(index), erase(key), size, and more. Memory cannot
|
|
22
|
+
* be freed or reclaimed by erase. Can grow to a maximum of about 18 times the
|
|
23
|
+
* initial capacity, but performance degrades linearly with growth. Can also be
|
|
24
|
+
* used as an object store with unique 32-bit references directly into the
|
|
25
|
+
* internal storage (retrieved with iterator::getIndex()).
|
|
26
|
+
*
|
|
27
|
+
* Advantages:
|
|
28
|
+
* - High-performance (~2-4x tbb::concurrent_hash_map in heavily
|
|
29
|
+
* multi-threaded environments).
|
|
30
|
+
* - Efficient memory usage if initial capacity is not over estimated
|
|
31
|
+
* (especially for small keys and values).
|
|
32
|
+
* - Good fragmentation properties (only allocates in large slabs which can
|
|
33
|
+
* be reused with clear() and never move).
|
|
34
|
+
* - Can generate unique, long-lived 32-bit references for efficient lookup
|
|
35
|
+
* (see findAt()).
|
|
36
|
+
*
|
|
37
|
+
* Disadvantages:
|
|
38
|
+
* - Keys must be native int32_t or int64_t, or explicitly converted.
|
|
39
|
+
* - Must be able to specify unique empty, locked, and erased keys
|
|
40
|
+
* - Performance degrades linearly as size grows beyond initialization
|
|
41
|
+
* capacity.
|
|
42
|
+
* - Max size limit of ~18x initial size (dependent on max load factor).
|
|
43
|
+
* - Memory is not freed or reclaimed by erase.
|
|
44
|
+
*
|
|
45
|
+
* Usage and Operation Details:
|
|
46
|
+
* Simple performance/memory tradeoff with maxLoadFactor. Higher load factors
|
|
47
|
+
* give better memory utilization but probe lengths increase, reducing
|
|
48
|
+
* performance.
|
|
49
|
+
*
|
|
50
|
+
* Implementation and Performance Details:
|
|
51
|
+
* AHArray is a fixed size contiguous block of value_type cells. When
|
|
52
|
+
* writing a cell, the key is locked while the rest of the record is
|
|
53
|
+
* written. Once done, the cell is unlocked by setting the key. find()
|
|
54
|
+
* is completely wait-free and doesn't require any non-relaxed atomic
|
|
55
|
+
* operations. AHA cannot grow beyond initialization capacity, but is
|
|
56
|
+
* faster because of reduced data indirection.
|
|
57
|
+
*
|
|
58
|
+
* AHMap is a wrapper around AHArray sub-maps that allows growth and provides
|
|
59
|
+
* an interface closer to the STL UnorderedAssociativeContainer concept. These
|
|
60
|
+
* sub-maps are allocated on the fly and are processed in series, so the more
|
|
61
|
+
* there are (from growing past initial capacity), the worse the performance.
|
|
62
|
+
*
|
|
63
|
+
* Insert returns false if there is a key collision and throws if the max size
|
|
64
|
+
* of the map is exceeded.
|
|
65
|
+
*
|
|
66
|
+
* Benchmark performance with 8 simultaneous threads processing 1 million
|
|
67
|
+
* unique <int64_t, int64_t> entries on a 4-core, 2.5 GHz machine:
|
|
68
|
+
*
|
|
69
|
+
* Load Factor Mem Efficiency usec/Insert usec/Find
|
|
70
|
+
* 50% 50% 0.19 0.05
|
|
71
|
+
* 85% 85% 0.20 0.06
|
|
72
|
+
* 90% 90% 0.23 0.08
|
|
73
|
+
* 95% 95% 0.27 0.10
|
|
74
|
+
*
|
|
75
|
+
* See folly/tests/AtomicHashMapTest.cpp for more benchmarks.
|
|
76
|
+
*/
|
|
77
|
+
|
|
78
|
+
#pragma once
|
|
79
|
+
#define FOLLY_ATOMICHASHMAP_H_
|
|
80
|
+
|
|
81
|
+
#include <atomic>
|
|
82
|
+
#include <functional>
|
|
83
|
+
#include <stdexcept>
|
|
84
|
+
|
|
85
|
+
#include <folly/AtomicHashArray.h>
|
|
86
|
+
#include <folly/CPortability.h>
|
|
87
|
+
#include <folly/Likely.h>
|
|
88
|
+
#include <folly/ThreadCachedInt.h>
|
|
89
|
+
#include <folly/container/Foreach.h>
|
|
90
|
+
#include <folly/hash/Hash.h>
|
|
91
|
+
|
|
92
|
+
namespace folly {
|
|
93
|
+
|
|
94
|
+
/*
|
|
95
|
+
* AtomicHashMap provides an interface somewhat similar to the
|
|
96
|
+
* UnorderedAssociativeContainer concept in C++. This does not
|
|
97
|
+
* exactly match this concept (or even the basic Container concept),
|
|
98
|
+
* because of some restrictions imposed by our datastructure.
|
|
99
|
+
*
|
|
100
|
+
* Specific differences (there are quite a few):
|
|
101
|
+
*
|
|
102
|
+
* - Efficiently thread safe for inserts (main point of this stuff),
|
|
103
|
+
* wait-free for lookups.
|
|
104
|
+
*
|
|
105
|
+
* - You can erase from this container, but the cell containing the key will
|
|
106
|
+
* not be free or reclaimed.
|
|
107
|
+
*
|
|
108
|
+
* - You can erase everything by calling clear() (and you must guarantee only
|
|
109
|
+
* one thread can be using the container to do that).
|
|
110
|
+
*
|
|
111
|
+
* - We aren't DefaultConstructible, CopyConstructible, Assignable, or
|
|
112
|
+
* EqualityComparable. (Most of these are probably not something
|
|
113
|
+
* you actually want to do with this anyway.)
|
|
114
|
+
*
|
|
115
|
+
* - We don't support the various bucket functions, rehash(),
|
|
116
|
+
* reserve(), or equal_range(). Also no constructors taking
|
|
117
|
+
* iterators, although this could change.
|
|
118
|
+
*
|
|
119
|
+
* - Several insertion functions, notably operator[], are not
|
|
120
|
+
* implemented. It is a little too easy to misuse these functions
|
|
121
|
+
* with this container, where part of the point is that when an
|
|
122
|
+
* insertion happens for a new key, it will atomically have the
|
|
123
|
+
* desired value.
|
|
124
|
+
*
|
|
125
|
+
* - The map has no templated insert() taking an iterator range, but
|
|
126
|
+
* we do provide an insert(key, value). The latter seems more
|
|
127
|
+
* frequently useful for this container (to avoid sprinkling
|
|
128
|
+
* make_pair everywhere), and providing both can lead to some gross
|
|
129
|
+
* template error messages.
|
|
130
|
+
*
|
|
131
|
+
* - The Allocator must not be stateful (a new instance will be spun up for
|
|
132
|
+
* each allocation), and its allocate() method must take a raw number of
|
|
133
|
+
* bytes.
|
|
134
|
+
*
|
|
135
|
+
* - KeyT must be a 32 bit or 64 bit atomic integer type, and you must
|
|
136
|
+
* define special 'locked' and 'empty' key values in the ctor
|
|
137
|
+
*
|
|
138
|
+
* - We don't take the Hash function object as an instance in the
|
|
139
|
+
* constructor.
|
|
140
|
+
*
|
|
141
|
+
*/
|
|
142
|
+
|
|
143
|
+
// Thrown when insertion fails due to running out of space for
|
|
144
|
+
// submaps.
|
|
145
|
+
struct FOLLY_EXPORT AtomicHashMapFullError : std::runtime_error {
|
|
146
|
+
explicit AtomicHashMapFullError()
|
|
147
|
+
: std::runtime_error("AtomicHashMap is full") {}
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
template <
|
|
151
|
+
class KeyT,
|
|
152
|
+
class ValueT,
|
|
153
|
+
class HashFcn,
|
|
154
|
+
class EqualFcn,
|
|
155
|
+
class Allocator,
|
|
156
|
+
class ProbeFcn,
|
|
157
|
+
class KeyConvertFcn>
|
|
158
|
+
class AtomicHashMap {
|
|
159
|
+
typedef AtomicHashArray<
|
|
160
|
+
KeyT,
|
|
161
|
+
ValueT,
|
|
162
|
+
HashFcn,
|
|
163
|
+
EqualFcn,
|
|
164
|
+
Allocator,
|
|
165
|
+
ProbeFcn,
|
|
166
|
+
KeyConvertFcn>
|
|
167
|
+
SubMap;
|
|
168
|
+
|
|
169
|
+
public:
|
|
170
|
+
typedef KeyT key_type;
|
|
171
|
+
typedef ValueT mapped_type;
|
|
172
|
+
typedef std::pair<const KeyT, ValueT> value_type;
|
|
173
|
+
typedef HashFcn hasher;
|
|
174
|
+
typedef EqualFcn key_equal;
|
|
175
|
+
typedef KeyConvertFcn key_convert;
|
|
176
|
+
typedef value_type* pointer;
|
|
177
|
+
typedef value_type& reference;
|
|
178
|
+
typedef const value_type& const_reference;
|
|
179
|
+
typedef std::ptrdiff_t difference_type;
|
|
180
|
+
typedef std::size_t size_type;
|
|
181
|
+
typedef typename SubMap::Config Config;
|
|
182
|
+
|
|
183
|
+
template <class ContT, class IterVal, class SubIt>
|
|
184
|
+
struct ahm_iterator;
|
|
185
|
+
|
|
186
|
+
typedef ahm_iterator<
|
|
187
|
+
const AtomicHashMap,
|
|
188
|
+
const value_type,
|
|
189
|
+
typename SubMap::const_iterator>
|
|
190
|
+
const_iterator;
|
|
191
|
+
typedef ahm_iterator<AtomicHashMap, value_type, typename SubMap::iterator>
|
|
192
|
+
iterator;
|
|
193
|
+
|
|
194
|
+
public:
|
|
195
|
+
const float kGrowthFrac_; // How much to grow when we run out of capacity.
|
|
196
|
+
|
|
197
|
+
// The constructor takes a finalSizeEst which is the optimal
|
|
198
|
+
// number of elements to maximize space utilization and performance,
|
|
199
|
+
// and a Config object to specify more advanced options.
|
|
200
|
+
explicit AtomicHashMap(size_t finalSizeEst, const Config& c = Config());
|
|
201
|
+
|
|
202
|
+
AtomicHashMap(const AtomicHashMap&) = delete;
|
|
203
|
+
AtomicHashMap& operator=(const AtomicHashMap&) = delete;
|
|
204
|
+
|
|
205
|
+
~AtomicHashMap() {
|
|
206
|
+
const unsigned int numMaps =
|
|
207
|
+
numMapsAllocated_.load(std::memory_order_relaxed);
|
|
208
|
+
FOR_EACH_RANGE (i, 0, numMaps) {
|
|
209
|
+
SubMap* thisMap = subMaps_[i].load(std::memory_order_relaxed);
|
|
210
|
+
DCHECK(thisMap);
|
|
211
|
+
SubMap::destroy(thisMap);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
key_equal key_eq() const { return key_equal(); }
|
|
216
|
+
hasher hash_function() const { return hasher(); }
|
|
217
|
+
|
|
218
|
+
/*
|
|
219
|
+
* insert --
|
|
220
|
+
*
|
|
221
|
+
* Returns a pair with iterator to the element at r.first and
|
|
222
|
+
* success. Retrieve the index with ret.first.getIndex().
|
|
223
|
+
*
|
|
224
|
+
* Does not overwrite on key collision, but returns an iterator to
|
|
225
|
+
* the existing element (since this could due to a race with
|
|
226
|
+
* another thread, it is often important to check this return
|
|
227
|
+
* value).
|
|
228
|
+
*
|
|
229
|
+
* Allocates new sub maps as the existing ones become full. If
|
|
230
|
+
* all sub maps are full, no element is inserted, and
|
|
231
|
+
* AtomicHashMapFullError is thrown.
|
|
232
|
+
*/
|
|
233
|
+
std::pair<iterator, bool> insert(const value_type& r) {
|
|
234
|
+
return emplace(r.first, r.second);
|
|
235
|
+
}
|
|
236
|
+
std::pair<iterator, bool> insert(key_type k, const mapped_type& v) {
|
|
237
|
+
return emplace(k, v);
|
|
238
|
+
}
|
|
239
|
+
std::pair<iterator, bool> insert(value_type&& r) {
|
|
240
|
+
return emplace(r.first, std::move(r.second));
|
|
241
|
+
}
|
|
242
|
+
std::pair<iterator, bool> insert(key_type k, mapped_type&& v) {
|
|
243
|
+
return emplace(k, std::move(v));
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/*
|
|
247
|
+
* emplace --
|
|
248
|
+
*
|
|
249
|
+
* Same contract as insert(), but performs in-place construction
|
|
250
|
+
* of the value type using the specified arguments.
|
|
251
|
+
*
|
|
252
|
+
* Also, like find(), this method optionally allows 'key_in' to have a type
|
|
253
|
+
* different from that stored in the table; see find(). If and only if no
|
|
254
|
+
* equal key is already present, this method converts 'key_in' to a key of
|
|
255
|
+
* type KeyT using the provided LookupKeyToKeyFcn.
|
|
256
|
+
*/
|
|
257
|
+
template <
|
|
258
|
+
typename LookupKeyT = key_type,
|
|
259
|
+
typename LookupHashFcn = hasher,
|
|
260
|
+
typename LookupEqualFcn = key_equal,
|
|
261
|
+
typename LookupKeyToKeyFcn = key_convert,
|
|
262
|
+
typename... ArgTs>
|
|
263
|
+
std::pair<iterator, bool> emplace(LookupKeyT k, ArgTs&&... vCtorArg);
|
|
264
|
+
|
|
265
|
+
/*
|
|
266
|
+
* find --
|
|
267
|
+
*
|
|
268
|
+
* Returns the iterator to the element if found, otherwise end().
|
|
269
|
+
*
|
|
270
|
+
* As an optional feature, the type of the key to look up (LookupKeyT) is
|
|
271
|
+
* allowed to be different from the type of keys actually stored (KeyT).
|
|
272
|
+
*
|
|
273
|
+
* This enables use cases where materializing the key is costly and usually
|
|
274
|
+
* redundant, e.g., canonicalizing/interning a set of strings and being able
|
|
275
|
+
* to look up by StringPiece. To use this feature, LookupHashFcn must take
|
|
276
|
+
* a LookupKeyT, and LookupEqualFcn must take KeyT and LookupKeyT as first
|
|
277
|
+
* and second parameter, respectively.
|
|
278
|
+
*
|
|
279
|
+
* See folly/test/ArrayHashMapTest.cpp for sample usage.
|
|
280
|
+
*/
|
|
281
|
+
template <
|
|
282
|
+
typename LookupKeyT = key_type,
|
|
283
|
+
typename LookupHashFcn = hasher,
|
|
284
|
+
typename LookupEqualFcn = key_equal>
|
|
285
|
+
iterator find(LookupKeyT k);
|
|
286
|
+
|
|
287
|
+
template <
|
|
288
|
+
typename LookupKeyT = key_type,
|
|
289
|
+
typename LookupHashFcn = hasher,
|
|
290
|
+
typename LookupEqualFcn = key_equal>
|
|
291
|
+
const_iterator find(LookupKeyT k) const;
|
|
292
|
+
|
|
293
|
+
/*
|
|
294
|
+
* erase --
|
|
295
|
+
*
|
|
296
|
+
* Erases key k from the map
|
|
297
|
+
*
|
|
298
|
+
* Returns 1 iff the key is found and erased, and 0 otherwise.
|
|
299
|
+
*/
|
|
300
|
+
size_type erase(key_type k);
|
|
301
|
+
|
|
302
|
+
/*
|
|
303
|
+
* clear --
|
|
304
|
+
*
|
|
305
|
+
* Wipes all keys and values from primary map and destroys all secondary
|
|
306
|
+
* maps. Primary map remains allocated and thus the memory can be reused
|
|
307
|
+
* in place. Not thread safe.
|
|
308
|
+
*
|
|
309
|
+
*/
|
|
310
|
+
void clear();
|
|
311
|
+
|
|
312
|
+
/*
|
|
313
|
+
* size --
|
|
314
|
+
*
|
|
315
|
+
* Returns the exact size of the map. Note this is not as cheap as typical
|
|
316
|
+
* size() implementations because, for each AtomicHashArray in this AHM, we
|
|
317
|
+
* need to grab a lock and accumulate the values from all the thread local
|
|
318
|
+
* counters. See folly/ThreadCachedInt.h for more details.
|
|
319
|
+
*/
|
|
320
|
+
size_t size() const;
|
|
321
|
+
|
|
322
|
+
bool empty() const { return size() == 0; }
|
|
323
|
+
|
|
324
|
+
size_type count(key_type k) const { return find(k) == end() ? 0 : 1; }
|
|
325
|
+
|
|
326
|
+
/*
|
|
327
|
+
* findAt --
|
|
328
|
+
*
|
|
329
|
+
* Returns an iterator into the map.
|
|
330
|
+
*
|
|
331
|
+
* idx should only be an unmodified value returned by calling getIndex() on
|
|
332
|
+
* a valid iterator returned by find() or insert(). If idx is invalid you
|
|
333
|
+
* have a bug and the process aborts.
|
|
334
|
+
*/
|
|
335
|
+
iterator findAt(uint32_t idx) {
|
|
336
|
+
SimpleRetT ret = findAtInternal(idx);
|
|
337
|
+
DCHECK_LT(ret.i, numSubMaps());
|
|
338
|
+
return iterator(
|
|
339
|
+
this,
|
|
340
|
+
ret.i,
|
|
341
|
+
subMaps_[ret.i].load(std::memory_order_relaxed)->makeIter(ret.j));
|
|
342
|
+
}
|
|
343
|
+
const_iterator findAt(uint32_t idx) const {
|
|
344
|
+
return const_cast<AtomicHashMap*>(this)->findAt(idx);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// Total capacity - summation of capacities of all submaps.
|
|
348
|
+
size_t capacity() const;
|
|
349
|
+
|
|
350
|
+
// Number of new insertions until current submaps are all at max load factor.
|
|
351
|
+
size_t spaceRemaining() const;
|
|
352
|
+
|
|
353
|
+
void setEntryCountThreadCacheSize(int32_t newSize) {
|
|
354
|
+
const int numMaps = numMapsAllocated_.load(std::memory_order_acquire);
|
|
355
|
+
for (int i = 0; i < numMaps; ++i) {
|
|
356
|
+
SubMap* map = subMaps_[i].load(std::memory_order_relaxed);
|
|
357
|
+
map->setEntryCountThreadCacheSize(newSize);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// Number of sub maps allocated so far to implement this map. The more there
|
|
362
|
+
// are, the worse the performance.
|
|
363
|
+
int numSubMaps() const {
|
|
364
|
+
return numMapsAllocated_.load(std::memory_order_acquire);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
iterator begin() {
|
|
368
|
+
iterator it(this, 0, subMaps_[0].load(std::memory_order_relaxed)->begin());
|
|
369
|
+
it.checkAdvanceToNextSubmap();
|
|
370
|
+
return it;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
const_iterator begin() const {
|
|
374
|
+
const_iterator it(
|
|
375
|
+
this, 0, subMaps_[0].load(std::memory_order_relaxed)->begin());
|
|
376
|
+
it.checkAdvanceToNextSubmap();
|
|
377
|
+
return it;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
iterator end() { return iterator(); }
|
|
381
|
+
|
|
382
|
+
const_iterator end() const { return const_iterator(); }
|
|
383
|
+
|
|
384
|
+
/* Advanced functions for direct access: */
|
|
385
|
+
|
|
386
|
+
inline uint32_t recToIdx(const value_type& r, bool mayInsert = true) {
|
|
387
|
+
SimpleRetT ret =
|
|
388
|
+
mayInsert ? insertInternal(r.first, r.second) : findInternal(r.first);
|
|
389
|
+
return encodeIndex(ret.i, ret.j);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
inline uint32_t recToIdx(value_type&& r, bool mayInsert = true) {
|
|
393
|
+
SimpleRetT ret = mayInsert ? insertInternal(r.first, std::move(r.second))
|
|
394
|
+
: findInternal(r.first);
|
|
395
|
+
return encodeIndex(ret.i, ret.j);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
inline uint32_t recToIdx(
|
|
399
|
+
key_type k, const mapped_type& v, bool mayInsert = true) {
|
|
400
|
+
SimpleRetT ret = mayInsert ? insertInternal(k, v) : findInternal(k);
|
|
401
|
+
return encodeIndex(ret.i, ret.j);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
inline uint32_t recToIdx(key_type k, mapped_type&& v, bool mayInsert = true) {
|
|
405
|
+
SimpleRetT ret =
|
|
406
|
+
mayInsert ? insertInternal(k, std::move(v)) : findInternal(k);
|
|
407
|
+
return encodeIndex(ret.i, ret.j);
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
inline uint32_t keyToIdx(const KeyT k, bool mayInsert = false) {
|
|
411
|
+
return recToIdx(value_type(k), mayInsert);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
inline const value_type& idxToRec(uint32_t idx) const {
|
|
415
|
+
SimpleRetT ret = findAtInternal(idx);
|
|
416
|
+
return subMaps_[ret.i].load(std::memory_order_relaxed)->idxToRec(ret.j);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/* Private data and helper functions... */
|
|
420
|
+
|
|
421
|
+
private:
|
|
422
|
+
// This limits primary submap size to 2^31 ~= 2 billion, secondary submap
|
|
423
|
+
// size to 2^(32 - kNumSubMapBits_ - 1) = 2^27 ~= 130 million, and num subMaps
|
|
424
|
+
// to 2^kNumSubMapBits_ = 16.
|
|
425
|
+
static const uint32_t kNumSubMapBits_ = 4;
|
|
426
|
+
static const uint32_t kSecondaryMapBit_ = 1u << 31; // Highest bit
|
|
427
|
+
static const uint32_t kSubMapIndexShift_ = 32 - kNumSubMapBits_ - 1;
|
|
428
|
+
static const uint32_t kSubMapIndexMask_ = (1 << kSubMapIndexShift_) - 1;
|
|
429
|
+
static const uint32_t kNumSubMaps_ = 1 << kNumSubMapBits_;
|
|
430
|
+
static const uintptr_t kLockedPtr_ = 0x88ULL << 48; // invalid pointer
|
|
431
|
+
|
|
432
|
+
struct SimpleRetT {
|
|
433
|
+
uint32_t i;
|
|
434
|
+
size_t j;
|
|
435
|
+
bool success;
|
|
436
|
+
SimpleRetT(uint32_t ii, size_t jj, bool s) : i(ii), j(jj), success(s) {}
|
|
437
|
+
SimpleRetT() = default;
|
|
438
|
+
};
|
|
439
|
+
|
|
440
|
+
template <
|
|
441
|
+
typename LookupKeyT = key_type,
|
|
442
|
+
typename LookupHashFcn = hasher,
|
|
443
|
+
typename LookupEqualFcn = key_equal,
|
|
444
|
+
typename LookupKeyToKeyFcn = key_convert,
|
|
445
|
+
typename... ArgTs>
|
|
446
|
+
SimpleRetT insertInternal(LookupKeyT key, ArgTs&&... value);
|
|
447
|
+
|
|
448
|
+
template <
|
|
449
|
+
typename LookupKeyT = key_type,
|
|
450
|
+
typename LookupHashFcn = hasher,
|
|
451
|
+
typename LookupEqualFcn = key_equal>
|
|
452
|
+
SimpleRetT findInternal(const LookupKeyT k) const;
|
|
453
|
+
|
|
454
|
+
SimpleRetT findAtInternal(uint32_t idx) const;
|
|
455
|
+
|
|
456
|
+
std::atomic<SubMap*> subMaps_[kNumSubMaps_];
|
|
457
|
+
std::atomic<uint32_t> numMapsAllocated_;
|
|
458
|
+
|
|
459
|
+
inline bool tryLockMap(unsigned int idx) {
|
|
460
|
+
SubMap* val = nullptr;
|
|
461
|
+
return subMaps_[idx].compare_exchange_strong(
|
|
462
|
+
val, (SubMap*)kLockedPtr_, std::memory_order_acquire);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
static inline uint32_t encodeIndex(uint32_t subMap, uint32_t subMapIdx);
|
|
466
|
+
|
|
467
|
+
}; // AtomicHashMap
|
|
468
|
+
|
|
469
|
+
template <
|
|
470
|
+
class KeyT,
|
|
471
|
+
class ValueT,
|
|
472
|
+
class HashFcn = std::hash<KeyT>,
|
|
473
|
+
class EqualFcn = std::equal_to<KeyT>,
|
|
474
|
+
class Allocator = std::allocator<char>>
|
|
475
|
+
using QuadraticProbingAtomicHashMap = AtomicHashMap<
|
|
476
|
+
KeyT,
|
|
477
|
+
ValueT,
|
|
478
|
+
HashFcn,
|
|
479
|
+
EqualFcn,
|
|
480
|
+
Allocator,
|
|
481
|
+
AtomicHashArrayQuadraticProbeFcn>;
|
|
482
|
+
} // namespace folly
|
|
483
|
+
|
|
484
|
+
#include <folly/AtomicHashMap-inl.h>
|
|
@@ -0,0 +1,206 @@
|
|
|
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 <cassert>
|
|
21
|
+
#include <utility>
|
|
22
|
+
|
|
23
|
+
namespace folly {
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* A very simple atomic single-linked list primitive.
|
|
27
|
+
*
|
|
28
|
+
* Usage:
|
|
29
|
+
*
|
|
30
|
+
* class MyClass {
|
|
31
|
+
* AtomicIntrusiveLinkedListHook<MyClass> hook_;
|
|
32
|
+
* }
|
|
33
|
+
*
|
|
34
|
+
* AtomicIntrusiveLinkedList<MyClass, &MyClass::hook_> list;
|
|
35
|
+
* list.insert(&a);
|
|
36
|
+
* list.sweep([] (MyClass* c) { doSomething(c); }
|
|
37
|
+
*/
|
|
38
|
+
template <class T>
|
|
39
|
+
struct AtomicIntrusiveLinkedListHook {
|
|
40
|
+
T* next{nullptr};
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
template <class T, AtomicIntrusiveLinkedListHook<T> T::*HookMember>
|
|
44
|
+
class AtomicIntrusiveLinkedList {
|
|
45
|
+
public:
|
|
46
|
+
AtomicIntrusiveLinkedList() {}
|
|
47
|
+
|
|
48
|
+
AtomicIntrusiveLinkedList(const AtomicIntrusiveLinkedList&) = delete;
|
|
49
|
+
AtomicIntrusiveLinkedList& operator=(const AtomicIntrusiveLinkedList&) =
|
|
50
|
+
delete;
|
|
51
|
+
|
|
52
|
+
AtomicIntrusiveLinkedList(AtomicIntrusiveLinkedList&& other) noexcept
|
|
53
|
+
: head_(other.head_.exchange(nullptr, std::memory_order_acq_rel)) {}
|
|
54
|
+
|
|
55
|
+
// Absent because would be too error-prone to use correctly because of
|
|
56
|
+
// the requirement that lists are empty upon destruction.
|
|
57
|
+
AtomicIntrusiveLinkedList& operator=(
|
|
58
|
+
AtomicIntrusiveLinkedList&& other) noexcept = delete;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Move the currently held elements to a new list.
|
|
62
|
+
* The current list becomes empty, but concurrent threads
|
|
63
|
+
* might still add new elements to it.
|
|
64
|
+
*
|
|
65
|
+
* Equivalent to calling a move constructor, but more linter-friendly
|
|
66
|
+
* in case you still need the old list.
|
|
67
|
+
*/
|
|
68
|
+
AtomicIntrusiveLinkedList spliceAll() { return std::move(*this); }
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Move-assign the current list to `other`, then reverse-sweep
|
|
72
|
+
* the old list with the provided callback `func`.
|
|
73
|
+
*
|
|
74
|
+
* A safe replacement for the move assignment operator, which is absent
|
|
75
|
+
* because of the resource leak concerns.
|
|
76
|
+
*/
|
|
77
|
+
template <typename F>
|
|
78
|
+
void reverseSweepAndAssign(AtomicIntrusiveLinkedList&& other, F&& func) {
|
|
79
|
+
auto otherHead = other.head_.exchange(nullptr, std::memory_order_acq_rel);
|
|
80
|
+
auto head = head_.exchange(otherHead, std::memory_order_acq_rel);
|
|
81
|
+
unlinkAll(head, std::forward<F>(func));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Note: The list must be empty on destruction.
|
|
86
|
+
*/
|
|
87
|
+
~AtomicIntrusiveLinkedList() { assert(empty()); }
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Returns the current head of the list.
|
|
91
|
+
*
|
|
92
|
+
* WARNING: The returned pointer might not be valid if the list
|
|
93
|
+
* is modified concurrently!
|
|
94
|
+
*/
|
|
95
|
+
T* unsafeHead() const { return head_.load(std::memory_order_acquire); }
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Returns true if the list is empty.
|
|
99
|
+
*
|
|
100
|
+
* WARNING: This method's return value is only valid for a snapshot
|
|
101
|
+
* of the state, it might become stale as soon as it's returned.
|
|
102
|
+
*/
|
|
103
|
+
bool empty() const { return unsafeHead() == nullptr; }
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Atomically insert t at the head of the list.
|
|
107
|
+
* @return True if the inserted element is the only one in the list
|
|
108
|
+
* after the call.
|
|
109
|
+
*/
|
|
110
|
+
bool insertHead(T* t) {
|
|
111
|
+
assert(next(t) == nullptr);
|
|
112
|
+
|
|
113
|
+
auto oldHead = head_.load(std::memory_order_relaxed);
|
|
114
|
+
do {
|
|
115
|
+
next(t) = oldHead;
|
|
116
|
+
/* oldHead is updated by the call below.
|
|
117
|
+
|
|
118
|
+
NOTE: we don't use next(t) instead of oldHead directly due to
|
|
119
|
+
compiler bugs (GCC prior to 4.8.3 (bug 60272), clang (bug 18899),
|
|
120
|
+
MSVC (bug 819819); source:
|
|
121
|
+
http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange */
|
|
122
|
+
} while (!head_.compare_exchange_weak(
|
|
123
|
+
oldHead, t, std::memory_order_release, std::memory_order_relaxed));
|
|
124
|
+
|
|
125
|
+
return oldHead == nullptr;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Replaces the head with nullptr,
|
|
130
|
+
* and calls func() on the removed elements in the order from tail to head.
|
|
131
|
+
* Returns false if the list was empty.
|
|
132
|
+
*/
|
|
133
|
+
template <typename F>
|
|
134
|
+
bool sweepOnce(F&& func) {
|
|
135
|
+
if (auto head = head_.exchange(nullptr, std::memory_order_acq_rel)) {
|
|
136
|
+
auto rhead = reverse(head);
|
|
137
|
+
unlinkAll(rhead, std::forward<F>(func));
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Repeatedly replaces the head with nullptr,
|
|
145
|
+
* and calls func() on the removed elements in the order from tail to head.
|
|
146
|
+
* Stops when the list is empty.
|
|
147
|
+
*/
|
|
148
|
+
template <typename F>
|
|
149
|
+
void sweep(F&& func) {
|
|
150
|
+
while (sweepOnce(func)) {
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Similar to sweep() but calls func() on elements in LIFO order.
|
|
156
|
+
*
|
|
157
|
+
* func() is called for all elements in the list at the moment
|
|
158
|
+
* reverseSweep() is called. Unlike sweep() it does not loop to ensure the
|
|
159
|
+
* list is empty at some point after the last invocation. This way callers
|
|
160
|
+
* can reason about the ordering: elements inserted since the last call to
|
|
161
|
+
* reverseSweep() will be provided in LIFO order.
|
|
162
|
+
*
|
|
163
|
+
* Example: if elements are inserted in the order 1-2-3, the callback is
|
|
164
|
+
* invoked 3-2-1. If the callback moves elements onto a stack, popping off
|
|
165
|
+
* the stack will produce the original insertion order 1-2-3.
|
|
166
|
+
*/
|
|
167
|
+
template <typename F>
|
|
168
|
+
void reverseSweep(F&& func) {
|
|
169
|
+
// We don't loop like sweep() does because the overall order of callbacks
|
|
170
|
+
// would be strand-wise LIFO which is meaningless to callers.
|
|
171
|
+
auto head = head_.exchange(nullptr, std::memory_order_acq_rel);
|
|
172
|
+
unlinkAll(head, std::forward<F>(func));
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
private:
|
|
176
|
+
std::atomic<T*> head_{nullptr};
|
|
177
|
+
|
|
178
|
+
static T*& next(T* t) { return (t->*HookMember).next; }
|
|
179
|
+
|
|
180
|
+
/* Reverses a linked list, returning the pointer to the new head
|
|
181
|
+
(old tail) */
|
|
182
|
+
static T* reverse(T* head) {
|
|
183
|
+
T* rhead = nullptr;
|
|
184
|
+
while (head != nullptr) {
|
|
185
|
+
auto t = head;
|
|
186
|
+
head = next(t);
|
|
187
|
+
next(t) = rhead;
|
|
188
|
+
rhead = t;
|
|
189
|
+
}
|
|
190
|
+
return rhead;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/* Unlinks all elements in the linked list fragment pointed to by `head',
|
|
194
|
+
* calling func() on every element */
|
|
195
|
+
template <typename F>
|
|
196
|
+
static void unlinkAll(T* head, F&& func) {
|
|
197
|
+
while (head != nullptr) {
|
|
198
|
+
auto t = head;
|
|
199
|
+
head = next(t);
|
|
200
|
+
next(t) = nullptr;
|
|
201
|
+
func(t);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
} // namespace folly
|