react-native-windows 0.85.0-preview.1 → 0.85.0

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.
Files changed (910) hide show
  1. package/Directory.Build.props +1 -1
  2. package/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.cpp +28 -46
  3. package/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.h +0 -3
  4. package/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.cpp +19 -13
  5. package/Microsoft.ReactNative/Fabric/Composition/Modal/WindowsModalHostViewComponentView.cpp +107 -0
  6. package/Microsoft.ReactNative/Fabric/Composition/SelectionItemAutomationEvent.h +73 -0
  7. package/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.cpp +105 -32
  8. package/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.h +7 -2
  9. package/PropertySheets/CIBuildOptimizations.props +2 -2
  10. package/PropertySheets/Generated/PackageVersion.g.props +2 -2
  11. package/PropertySheets/JSEngine.props +1 -1
  12. package/PropertySheets/NuGet.LockFile.props +2 -9
  13. package/Scripts/NuGetRestoreForceEvaluateAllSolutions.ps1 +54 -5
  14. package/Scripts/UpdateNightlyDependencies.ps1 +47 -0
  15. package/Scripts/creaternwapp.cmd +29 -9
  16. package/Scripts/creaternwlib.cmd +31 -15
  17. package/external/.clang-format +1 -0
  18. package/external/External.vcxitems +10 -0
  19. package/external/fast-float/.syncignore +10 -0
  20. package/external/fast-float/LICENSE-APACHE +190 -0
  21. package/external/fast-float/LICENSE-BOOST +23 -0
  22. package/external/fast-float/LICENSE-MIT +27 -0
  23. package/external/fast-float/README.md +545 -0
  24. package/external/fast-float/cgmanifest.json +15 -0
  25. package/external/fast-float/fast-float.vcxitems +14 -0
  26. package/external/fast-float/include/fast_float/ascii_number.h +588 -0
  27. package/external/fast-float/include/fast_float/bigint.h +638 -0
  28. package/external/fast-float/include/fast_float/constexpr_feature_detect.h +46 -0
  29. package/external/fast-float/include/fast_float/decimal_to_binary.h +212 -0
  30. package/external/fast-float/include/fast_float/digit_comparison.h +457 -0
  31. package/external/fast-float/include/fast_float/fast_float.h +59 -0
  32. package/external/fast-float/include/fast_float/fast_table.h +708 -0
  33. package/external/fast-float/include/fast_float/float_common.h +1240 -0
  34. package/external/fast-float/include/fast_float/parse_number.h +399 -0
  35. package/external/fast-float/sync-config.json +8 -0
  36. package/external/fmt/.syncignore +10 -0
  37. package/external/fmt/CONTRIBUTING.md +20 -0
  38. package/external/fmt/LICENSE +27 -0
  39. package/external/fmt/README.md +484 -0
  40. package/external/fmt/cgmanifest.json +15 -0
  41. package/external/fmt/doc/ChangeLog-old.md +3290 -0
  42. package/external/fmt/doc/api.md +650 -0
  43. package/external/fmt/doc/fmt.css +61 -0
  44. package/external/fmt/doc/fmt.js +4 -0
  45. package/external/fmt/doc/get-started.md +222 -0
  46. package/external/fmt/doc/index.md +151 -0
  47. package/external/fmt/doc/perf.svg +1 -0
  48. package/external/fmt/doc/python-license.txt +290 -0
  49. package/external/fmt/doc/syntax.md +887 -0
  50. package/external/fmt/fmt.vcxitems +28 -0
  51. package/external/fmt/include/fmt/args.h +228 -0
  52. package/external/fmt/include/fmt/base.h +3077 -0
  53. package/external/fmt/include/fmt/chrono.h +2432 -0
  54. package/external/fmt/include/fmt/color.h +612 -0
  55. package/external/fmt/include/fmt/compile.h +529 -0
  56. package/external/fmt/include/fmt/core.h +5 -0
  57. package/external/fmt/include/fmt/format-inl.h +1928 -0
  58. package/external/fmt/include/fmt/format.h +4427 -0
  59. package/external/fmt/include/fmt/os.h +439 -0
  60. package/external/fmt/include/fmt/ostream.h +211 -0
  61. package/external/fmt/include/fmt/printf.h +656 -0
  62. package/external/fmt/include/fmt/ranges.h +882 -0
  63. package/external/fmt/include/fmt/std.h +699 -0
  64. package/external/fmt/include/fmt/xchar.h +322 -0
  65. package/external/fmt/src/fmt.cc +135 -0
  66. package/external/fmt/src/format.cc +43 -0
  67. package/external/fmt/src/os.cc +403 -0
  68. package/external/fmt/sync-config.json +8 -0
  69. package/external/folly/.syncignore +60 -0
  70. package/external/folly/Folly.natvis +25 -0
  71. package/external/folly/LICENSE +200 -0
  72. package/external/folly/README.md +263 -0
  73. package/external/folly/cgmanifest.json +25 -0
  74. package/external/folly/folly/.clang-format +1 -0
  75. package/external/folly/folly/AtomicHashArray-inl.h +546 -0
  76. package/external/folly/folly/AtomicHashArray.h +431 -0
  77. package/external/folly/folly/AtomicHashMap-inl.h +653 -0
  78. package/external/folly/folly/AtomicHashMap.h +484 -0
  79. package/external/folly/folly/AtomicIntrusiveLinkedList.h +206 -0
  80. package/external/folly/folly/AtomicLinkedList.h +110 -0
  81. package/external/folly/folly/AtomicUnorderedMap.h +522 -0
  82. package/external/folly/folly/BUCK +1631 -0
  83. package/external/folly/folly/BUILD_MODE.bzl +72 -0
  84. package/external/folly/folly/Benchmark.cpp +986 -0
  85. package/external/folly/folly/Benchmark.h +680 -0
  86. package/external/folly/folly/BenchmarkUtil.h +47 -0
  87. package/external/folly/folly/Bits.h +17 -0
  88. package/external/folly/folly/CMakeLists.txt +110 -0
  89. package/external/folly/folly/CPortability.h +338 -0
  90. package/external/folly/folly/CancellationToken-inl.h +449 -0
  91. package/external/folly/folly/CancellationToken.cpp +250 -0
  92. package/external/folly/folly/CancellationToken.h +365 -0
  93. package/external/folly/folly/Chrono.h +132 -0
  94. package/external/folly/folly/ClockGettimeWrappers.cpp +93 -0
  95. package/external/folly/folly/ClockGettimeWrappers.h +29 -0
  96. package/external/folly/folly/ConcurrentBitSet.h +157 -0
  97. package/external/folly/folly/ConcurrentLazy.h +74 -0
  98. package/external/folly/folly/ConcurrentSkipList-inl.h +341 -0
  99. package/external/folly/folly/ConcurrentSkipList.h +824 -0
  100. package/external/folly/folly/ConstexprMath.h +978 -0
  101. package/external/folly/folly/ConstructorCallbackList.h +158 -0
  102. package/external/folly/folly/Conv.cpp +1205 -0
  103. package/external/folly/folly/Conv.h +2026 -0
  104. package/external/folly/folly/CppAttributes.h +170 -0
  105. package/external/folly/folly/CpuId.h +297 -0
  106. package/external/folly/folly/DefaultKeepAliveExecutor.h +172 -0
  107. package/external/folly/folly/Demangle.cpp +255 -0
  108. package/external/folly/folly/Demangle.h +73 -0
  109. package/external/folly/folly/DiscriminatedPtr.h +236 -0
  110. package/external/folly/folly/DynamicConverter.h +17 -0
  111. package/external/folly/folly/Exception.h +150 -0
  112. package/external/folly/folly/ExceptionString.cpp +51 -0
  113. package/external/folly/folly/ExceptionString.h +33 -0
  114. package/external/folly/folly/ExceptionWrapper-inl.h +264 -0
  115. package/external/folly/folly/ExceptionWrapper.cpp +37 -0
  116. package/external/folly/folly/ExceptionWrapper.h +377 -0
  117. package/external/folly/folly/Executor.cpp +111 -0
  118. package/external/folly/folly/Executor.h +351 -0
  119. package/external/folly/folly/Expected.h +1725 -0
  120. package/external/folly/folly/FBString.h +2888 -0
  121. package/external/folly/folly/FBVector.h +17 -0
  122. package/external/folly/folly/File.cpp +180 -0
  123. package/external/folly/folly/File.h +177 -0
  124. package/external/folly/folly/FileUtil.cpp +378 -0
  125. package/external/folly/folly/FileUtil.h +332 -0
  126. package/external/folly/folly/Fingerprint.cpp +135 -0
  127. package/external/folly/folly/Fingerprint.h +289 -0
  128. package/external/folly/folly/FixedString.h +2965 -0
  129. package/external/folly/folly/FollyMemcpy.cpp +30 -0
  130. package/external/folly/folly/FollyMemcpy.h +23 -0
  131. package/external/folly/folly/FollyMemset.cpp +29 -0
  132. package/external/folly/folly/FollyMemset.h +25 -0
  133. package/external/folly/folly/Format-inl.h +1152 -0
  134. package/external/folly/folly/Format.cpp +429 -0
  135. package/external/folly/folly/Format.h +463 -0
  136. package/external/folly/folly/FormatArg.h +285 -0
  137. package/external/folly/folly/FormatTraits.h +65 -0
  138. package/external/folly/folly/Function.h +1159 -0
  139. package/external/folly/folly/GLog.h +85 -0
  140. package/external/folly/folly/GroupVarint.cpp +153 -0
  141. package/external/folly/folly/GroupVarint.h +630 -0
  142. package/external/folly/folly/Hash.h +20 -0
  143. package/external/folly/folly/IPAddress.cpp +490 -0
  144. package/external/folly/folly/IPAddress.h +667 -0
  145. package/external/folly/folly/IPAddressException.h +82 -0
  146. package/external/folly/folly/IPAddressV4.cpp +305 -0
  147. package/external/folly/folly/IPAddressV4.h +495 -0
  148. package/external/folly/folly/IPAddressV6.cpp +541 -0
  149. package/external/folly/folly/IPAddressV6.h +627 -0
  150. package/external/folly/folly/Indestructible.h +164 -0
  151. package/external/folly/folly/IndexedMemPool.h +550 -0
  152. package/external/folly/folly/IntrusiveList.h +17 -0
  153. package/external/folly/folly/Lazy.h +142 -0
  154. package/external/folly/folly/Likely.h +76 -0
  155. package/external/folly/folly/MPMCPipeline.h +280 -0
  156. package/external/folly/folly/MPMCQueue.h +1556 -0
  157. package/external/folly/folly/MacAddress.cpp +188 -0
  158. package/external/folly/folly/MacAddress.h +260 -0
  159. package/external/folly/folly/MapUtil.h +17 -0
  160. package/external/folly/folly/Math.h +258 -0
  161. package/external/folly/folly/MaybeManagedPtr.h +120 -0
  162. package/external/folly/folly/Memory.h +900 -0
  163. package/external/folly/folly/MicroLock.cpp +76 -0
  164. package/external/folly/folly/MicroLock.h +354 -0
  165. package/external/folly/folly/MicroSpinLock.h +17 -0
  166. package/external/folly/folly/MoveWrapper.h +76 -0
  167. package/external/folly/folly/ObserverContainer.h +1026 -0
  168. package/external/folly/folly/Optional.h +743 -0
  169. package/external/folly/folly/Overload.h +325 -0
  170. package/external/folly/folly/PackedSyncPtr.h +147 -0
  171. package/external/folly/folly/Padded.h +464 -0
  172. package/external/folly/folly/Poly-inl.h +230 -0
  173. package/external/folly/folly/Poly.h +1095 -0
  174. package/external/folly/folly/PolyException.h +43 -0
  175. package/external/folly/folly/Portability.h +644 -0
  176. package/external/folly/folly/Preprocessor.h +236 -0
  177. package/external/folly/folly/ProducerConsumerQueue.h +182 -0
  178. package/external/folly/folly/RWSpinLock.h +17 -0
  179. package/external/folly/folly/Random-inl.h +86 -0
  180. package/external/folly/folly/Random.cpp +184 -0
  181. package/external/folly/folly/Random.h +434 -0
  182. package/external/folly/folly/Range.h +1772 -0
  183. package/external/folly/folly/Replaceable.h +636 -0
  184. package/external/folly/folly/ScopeGuard.cpp +29 -0
  185. package/external/folly/folly/ScopeGuard.h +420 -0
  186. package/external/folly/folly/SharedMutex.cpp +81 -0
  187. package/external/folly/folly/SharedMutex.h +1751 -0
  188. package/external/folly/folly/Singleton-inl.h +332 -0
  189. package/external/folly/folly/Singleton.cpp +512 -0
  190. package/external/folly/folly/Singleton.h +891 -0
  191. package/external/folly/folly/SingletonThreadLocal.cpp +53 -0
  192. package/external/folly/folly/SingletonThreadLocal.h +263 -0
  193. package/external/folly/folly/SocketAddress.cpp +786 -0
  194. package/external/folly/folly/SocketAddress.h +768 -0
  195. package/external/folly/folly/SpinLock.h +55 -0
  196. package/external/folly/folly/String-inl.h +668 -0
  197. package/external/folly/folly/String.cpp +777 -0
  198. package/external/folly/folly/String.h +767 -0
  199. package/external/folly/folly/Subprocess.cpp +1142 -0
  200. package/external/folly/folly/Subprocess.h +1055 -0
  201. package/external/folly/folly/Synchronized.h +1833 -0
  202. package/external/folly/folly/SynchronizedPtr.h +106 -0
  203. package/external/folly/folly/ThreadCachedInt.h +175 -0
  204. package/external/folly/folly/ThreadLocal.h +478 -0
  205. package/external/folly/folly/TimeoutQueue.cpp +78 -0
  206. package/external/folly/folly/TimeoutQueue.h +123 -0
  207. package/external/folly/folly/TokenBucket.h +673 -0
  208. package/external/folly/folly/Traits.h +1442 -0
  209. package/external/folly/folly/Try-inl.h +372 -0
  210. package/external/folly/folly/Try.cpp +23 -0
  211. package/external/folly/folly/Try.h +728 -0
  212. package/external/folly/folly/UTF8String.h +56 -0
  213. package/external/folly/folly/Unicode.cpp +201 -0
  214. package/external/folly/folly/Unicode.h +94 -0
  215. package/external/folly/folly/Unit.h +65 -0
  216. package/external/folly/folly/Uri-inl.h +101 -0
  217. package/external/folly/folly/Uri.cpp +190 -0
  218. package/external/folly/folly/Uri.h +142 -0
  219. package/external/folly/folly/Utility.h +932 -0
  220. package/external/folly/folly/VERSION +1 -0
  221. package/external/folly/folly/Varint.h +230 -0
  222. package/external/folly/folly/VirtualExecutor.h +17 -0
  223. package/external/folly/folly/algorithm/simd/BUCK +47 -0
  224. package/external/folly/folly/algorithm/simd/Contains.cpp +42 -0
  225. package/external/folly/folly/algorithm/simd/Contains.h +116 -0
  226. package/external/folly/folly/algorithm/simd/FindFixed.h +301 -0
  227. package/external/folly/folly/algorithm/simd/Ignore.h +52 -0
  228. package/external/folly/folly/algorithm/simd/Movemask.h +207 -0
  229. package/external/folly/folly/algorithm/simd/detail/BUCK +70 -0
  230. package/external/folly/folly/algorithm/simd/detail/ContainsImpl.h +91 -0
  231. package/external/folly/folly/algorithm/simd/detail/SimdAnyOf.h +83 -0
  232. package/external/folly/folly/algorithm/simd/detail/SimdForEach.h +209 -0
  233. package/external/folly/folly/algorithm/simd/detail/SimdPlatform.h +445 -0
  234. package/external/folly/folly/algorithm/simd/detail/Traits.h +125 -0
  235. package/external/folly/folly/algorithm/simd/detail/UnrollUtils.h +126 -0
  236. package/external/folly/folly/base64.h +264 -0
  237. package/external/folly/folly/chrono/BUCK +29 -0
  238. package/external/folly/folly/chrono/Clock.h +65 -0
  239. package/external/folly/folly/chrono/Conv.h +712 -0
  240. package/external/folly/folly/chrono/Hardware.h +155 -0
  241. package/external/folly/folly/chrono/test/BUCK +26 -0
  242. package/external/folly/folly/chrono/test/ClockTest.cpp +68 -0
  243. package/external/folly/folly/chrono/test/ConvTest.cpp +652 -0
  244. package/external/folly/folly/concurrency/AtomicSharedPtr.h +387 -0
  245. package/external/folly/folly/concurrency/BUCK +170 -0
  246. package/external/folly/folly/concurrency/CacheLocality.cpp +633 -0
  247. package/external/folly/folly/concurrency/CacheLocality.h +460 -0
  248. package/external/folly/folly/concurrency/ConcurrentHashMap.h +822 -0
  249. package/external/folly/folly/concurrency/CoreCachedSharedPtr.h +232 -0
  250. package/external/folly/folly/concurrency/DeadlockDetector.cpp +27 -0
  251. package/external/folly/folly/concurrency/DeadlockDetector.h +44 -0
  252. package/external/folly/folly/concurrency/DynamicBoundedQueue.h +751 -0
  253. package/external/folly/folly/concurrency/PriorityUnboundedQueueSet.h +207 -0
  254. package/external/folly/folly/concurrency/ProcessLocalUniqueId.cpp +46 -0
  255. package/external/folly/folly/concurrency/ProcessLocalUniqueId.h +38 -0
  256. package/external/folly/folly/concurrency/SingletonRelaxedCounter.h +325 -0
  257. package/external/folly/folly/concurrency/ThreadCachedSynchronized.h +227 -0
  258. package/external/folly/folly/concurrency/UnboundedQueue.h +891 -0
  259. package/external/folly/folly/concurrency/container/BUCK +77 -0
  260. package/external/folly/folly/concurrency/container/FlatCombiningPriorityQueue.h +426 -0
  261. package/external/folly/folly/concurrency/container/LockFreeRingBuffer.h +306 -0
  262. package/external/folly/folly/concurrency/container/RelaxedConcurrentPriorityQueue.h +1212 -0
  263. package/external/folly/folly/concurrency/container/SingleWriterFixedHashMap.h +322 -0
  264. package/external/folly/folly/concurrency/container/atomic_grow_array.h +564 -0
  265. package/external/folly/folly/concurrency/container/test/BUCK +75 -0
  266. package/external/folly/folly/concurrency/container/test/FlatCombiningPriorityQueueTest.cpp +570 -0
  267. package/external/folly/folly/concurrency/container/test/LockFreeRingBufferTest.cpp +276 -0
  268. package/external/folly/folly/concurrency/container/test/RelaxedConcurrentPriorityQueueTest.cpp +1570 -0
  269. package/external/folly/folly/concurrency/container/test/SingleWriterFixedHashMapTest.cpp +401 -0
  270. package/external/folly/folly/concurrency/container/test/atomic_grow_array_test.cpp +187 -0
  271. package/external/folly/folly/concurrency/detail/AtomicSharedPtr-detail.h +212 -0
  272. package/external/folly/folly/concurrency/detail/ConcurrentHashMap-detail.h +1911 -0
  273. package/external/folly/folly/concurrency/memory/AtomicReadMostlyMainPtr.cpp +43 -0
  274. package/external/folly/folly/concurrency/memory/AtomicReadMostlyMainPtr.h +190 -0
  275. package/external/folly/folly/concurrency/memory/BUCK +53 -0
  276. package/external/folly/folly/concurrency/memory/PrimaryPtr.h +338 -0
  277. package/external/folly/folly/concurrency/memory/ReadMostlySharedPtr.h +511 -0
  278. package/external/folly/folly/concurrency/memory/TLRefCount.h +228 -0
  279. package/external/folly/folly/concurrency/memory/test/AtomicReadMostlyMainPtrBenchmark.cpp +56 -0
  280. package/external/folly/folly/concurrency/memory/test/AtomicReadMostlyMainPtrTest.cpp +454 -0
  281. package/external/folly/folly/concurrency/memory/test/BUCK +95 -0
  282. package/external/folly/folly/concurrency/memory/test/PrimaryPtrTest.cpp +303 -0
  283. package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrBenchmark.cpp +138 -0
  284. package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrStressTest.cpp +75 -0
  285. package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrTest.cpp +378 -0
  286. package/external/folly/folly/concurrency/memory/test/RefCountBenchmark.cpp +90 -0
  287. package/external/folly/folly/concurrency/memory/test/RefCountTest.cpp +168 -0
  288. package/external/folly/folly/concurrency/test/AtomicSharedPtrCounted.h +156 -0
  289. package/external/folly/folly/concurrency/test/AtomicSharedPtrPerformance.cpp +255 -0
  290. package/external/folly/folly/concurrency/test/AtomicSharedPtrTest.cpp +257 -0
  291. package/external/folly/folly/concurrency/test/BUCK +229 -0
  292. package/external/folly/folly/concurrency/test/CacheLocalityBenchmark.cpp +392 -0
  293. package/external/folly/folly/concurrency/test/CacheLocalityTest.cpp +1229 -0
  294. package/external/folly/folly/concurrency/test/ConcurrentHashMapBench.cpp +260 -0
  295. package/external/folly/folly/concurrency/test/ConcurrentHashMapTest.cpp +1242 -0
  296. package/external/folly/folly/concurrency/test/CoreCachedSharedPtrTest.cpp +408 -0
  297. package/external/folly/folly/concurrency/test/DynamicBoundedQueueTest.cpp +984 -0
  298. package/external/folly/folly/concurrency/test/PriorityUnboundedQueueSetTest.cpp +73 -0
  299. package/external/folly/folly/concurrency/test/ProcessLocalUniqueIdTest.cpp +66 -0
  300. package/external/folly/folly/concurrency/test/SingletonRelaxedCounterBench.cpp +101 -0
  301. package/external/folly/folly/concurrency/test/SingletonRelaxedCounterTest.cpp +185 -0
  302. package/external/folly/folly/concurrency/test/ThreadCachedSynchronizedBench.cpp +76 -0
  303. package/external/folly/folly/concurrency/test/ThreadCachedSynchronizedTest.cpp +93 -0
  304. package/external/folly/folly/concurrency/test/UnboundedQueueTest.cpp +1302 -0
  305. package/external/folly/folly/container/Access.h +57 -0
  306. package/external/folly/folly/container/Array.h +87 -0
  307. package/external/folly/folly/container/BUCK +353 -0
  308. package/external/folly/folly/container/BitIterator.h +203 -0
  309. package/external/folly/folly/container/Enumerate.h +162 -0
  310. package/external/folly/folly/container/EvictingCacheMap.h +730 -0
  311. package/external/folly/folly/container/F14.md +300 -0
  312. package/external/folly/folly/container/F14Map-fwd.h +113 -0
  313. package/external/folly/folly/container/F14Map.h +2108 -0
  314. package/external/folly/folly/container/F14Set-fwd.h +95 -0
  315. package/external/folly/folly/container/F14Set.h +1603 -0
  316. package/external/folly/folly/container/FBVector.h +1711 -0
  317. package/external/folly/folly/container/Foreach-inl.h +316 -0
  318. package/external/folly/folly/container/Foreach.h +209 -0
  319. package/external/folly/folly/container/HeterogeneousAccess-fwd.h +33 -0
  320. package/external/folly/folly/container/HeterogeneousAccess.h +171 -0
  321. package/external/folly/folly/container/IntrusiveHeap.h +268 -0
  322. package/external/folly/folly/container/IntrusiveList.h +131 -0
  323. package/external/folly/folly/container/Iterator.h +843 -0
  324. package/external/folly/folly/container/MapUtil.h +376 -0
  325. package/external/folly/folly/container/Merge.h +90 -0
  326. package/external/folly/folly/container/RegexMatchCache.cpp +521 -0
  327. package/external/folly/folly/container/RegexMatchCache.h +699 -0
  328. package/external/folly/folly/container/Reserve.h +109 -0
  329. package/external/folly/folly/container/SparseByteSet.h +123 -0
  330. package/external/folly/folly/container/View.h +81 -0
  331. package/external/folly/folly/container/WeightedEvictingCacheMap.h +651 -0
  332. package/external/folly/folly/container/detail/BUCK +115 -0
  333. package/external/folly/folly/container/detail/BitIteratorDetail.h +87 -0
  334. package/external/folly/folly/container/detail/F14Defaults.h +34 -0
  335. package/external/folly/folly/container/detail/F14IntrinsicsAvailability.h +67 -0
  336. package/external/folly/folly/container/detail/F14MapFallback.h +717 -0
  337. package/external/folly/folly/container/detail/F14Mask.h +235 -0
  338. package/external/folly/folly/container/detail/F14Policy.h +1523 -0
  339. package/external/folly/folly/container/detail/F14SetFallback.h +528 -0
  340. package/external/folly/folly/container/detail/F14Table.cpp +71 -0
  341. package/external/folly/folly/container/detail/F14Table.h +2680 -0
  342. package/external/folly/folly/container/detail/Util.h +303 -0
  343. package/external/folly/folly/container/detail/tape_detail.h +135 -0
  344. package/external/folly/folly/container/detail/test/BUCK +14 -0
  345. package/external/folly/folly/container/detail/test/F14DetailTest.cpp +47 -0
  346. package/external/folly/folly/container/heap_vector_types.h +1683 -0
  347. package/external/folly/folly/container/range_traits.h +81 -0
  348. package/external/folly/folly/container/small_vector.h +1476 -0
  349. package/external/folly/folly/container/sorted_vector_types.h +1652 -0
  350. package/external/folly/folly/container/span.h +408 -0
  351. package/external/folly/folly/container/tape.h +608 -0
  352. package/external/folly/folly/container/test/.clang-tidy +12 -0
  353. package/external/folly/folly/container/test/AccessTest.cpp +138 -0
  354. package/external/folly/folly/container/test/ArrayTest.cpp +84 -0
  355. package/external/folly/folly/container/test/BUCK +568 -0
  356. package/external/folly/folly/container/test/BitIteratorBench.cpp +112 -0
  357. package/external/folly/folly/container/test/BitIteratorTest.cpp +109 -0
  358. package/external/folly/folly/container/test/EnumerateTest.cpp +294 -0
  359. package/external/folly/folly/container/test/EvictingCacheMapBench.cpp +80 -0
  360. package/external/folly/folly/container/test/EvictingCacheMapTest.cpp +842 -0
  361. package/external/folly/folly/container/test/F14AsanSupportTest.cpp +143 -0
  362. package/external/folly/folly/container/test/F14FwdTest.cpp +37 -0
  363. package/external/folly/folly/container/test/F14InterprocessTest.cpp +404 -0
  364. package/external/folly/folly/container/test/F14MapTest.cpp +2543 -0
  365. package/external/folly/folly/container/test/F14PolicyTest.cpp +49 -0
  366. package/external/folly/folly/container/test/F14SetTest.cpp +1738 -0
  367. package/external/folly/folly/container/test/F14SmallOverheads.cpp +215 -0
  368. package/external/folly/folly/container/test/F14TestUtil.h +117 -0
  369. package/external/folly/folly/container/test/FBVectorBenchmark.cpp +380 -0
  370. package/external/folly/folly/container/test/FBVectorBenchmarks.cpp.h +100 -0
  371. package/external/folly/folly/container/test/FBVectorTest.cpp +326 -0
  372. package/external/folly/folly/container/test/FBVectorTests.cpp.h +304 -0
  373. package/external/folly/folly/container/test/ForeachBenchmark.cpp +388 -0
  374. package/external/folly/folly/container/test/ForeachTest.cpp +338 -0
  375. package/external/folly/folly/container/test/HashMapsBench.cpp +458 -0
  376. package/external/folly/folly/container/test/HeterogeneousAccessTest.cpp +242 -0
  377. package/external/folly/folly/container/test/IntrusiveHeapTest.cpp +262 -0
  378. package/external/folly/folly/container/test/IteratorTest.cpp +989 -0
  379. package/external/folly/folly/container/test/MapUtilTest.cpp +365 -0
  380. package/external/folly/folly/container/test/MergeTest.cpp +66 -0
  381. package/external/folly/folly/container/test/RegexMatchCacheTest.cpp +634 -0
  382. package/external/folly/folly/container/test/ReserveTest.cpp +173 -0
  383. package/external/folly/folly/container/test/SparseByteSetBenchmark.cpp +153 -0
  384. package/external/folly/folly/container/test/SparseByteSetTest.cpp +117 -0
  385. package/external/folly/folly/container/test/TrackingTypes.h +584 -0
  386. package/external/folly/folly/container/test/UtilTest.cpp +609 -0
  387. package/external/folly/folly/container/test/WeightedEvictingCacheMapTest.cpp +800 -0
  388. package/external/folly/folly/container/test/heap_vector_types_test.cpp +1774 -0
  389. package/external/folly/folly/container/test/range_traits_test.cpp +59 -0
  390. package/external/folly/folly/container/test/small_vector_test.cpp +1571 -0
  391. package/external/folly/folly/container/test/sorted_vector_test.cpp +1589 -0
  392. package/external/folly/folly/container/test/span_test.cpp +520 -0
  393. package/external/folly/folly/container/test/tape_bench.cpp +200 -0
  394. package/external/folly/folly/container/test/tape_test.cpp +590 -0
  395. package/external/folly/folly/defs.bzl +238 -0
  396. package/external/folly/folly/detail/AsyncTrace.cpp +36 -0
  397. package/external/folly/folly/detail/AsyncTrace.h +44 -0
  398. package/external/folly/folly/detail/AtomicHashUtils.h +42 -0
  399. package/external/folly/folly/detail/AtomicUnorderedMapUtils.h +80 -0
  400. package/external/folly/folly/detail/BUCK +406 -0
  401. package/external/folly/folly/detail/DiscriminatedPtrDetail.h +172 -0
  402. package/external/folly/folly/detail/FileUtilDetail.cpp +63 -0
  403. package/external/folly/folly/detail/FileUtilDetail.h +85 -0
  404. package/external/folly/folly/detail/FileUtilVectorDetail.h +81 -0
  405. package/external/folly/folly/detail/FingerprintPolynomial.h +132 -0
  406. package/external/folly/folly/detail/Futex-inl.h +123 -0
  407. package/external/folly/folly/detail/Futex.cpp +273 -0
  408. package/external/folly/folly/detail/Futex.h +109 -0
  409. package/external/folly/folly/detail/GroupVarintDetail.h +101 -0
  410. package/external/folly/folly/detail/IPAddress.cpp +37 -0
  411. package/external/folly/folly/detail/IPAddress.h +57 -0
  412. package/external/folly/folly/detail/IPAddressSource.h +278 -0
  413. package/external/folly/folly/detail/Iterators.h +156 -0
  414. package/external/folly/folly/detail/MPMCPipelineDetail.h +122 -0
  415. package/external/folly/folly/detail/MemoryIdler.cpp +233 -0
  416. package/external/folly/folly/detail/MemoryIdler.h +216 -0
  417. package/external/folly/folly/detail/PerfScoped.cpp +112 -0
  418. package/external/folly/folly/detail/PerfScoped.h +70 -0
  419. package/external/folly/folly/detail/PolyDetail.h +921 -0
  420. package/external/folly/folly/detail/RangeCommon.cpp +55 -0
  421. package/external/folly/folly/detail/RangeCommon.h +93 -0
  422. package/external/folly/folly/detail/RangeSse42.cpp +198 -0
  423. package/external/folly/folly/detail/RangeSse42.h +30 -0
  424. package/external/folly/folly/detail/SimpleSimdStringUtils.cpp +31 -0
  425. package/external/folly/folly/detail/SimpleSimdStringUtils.h +27 -0
  426. package/external/folly/folly/detail/SimpleSimdStringUtilsImpl.h +63 -0
  427. package/external/folly/folly/detail/Singleton.h +34 -0
  428. package/external/folly/folly/detail/SlowFingerprint.h +90 -0
  429. package/external/folly/folly/detail/SocketFastOpen.cpp +175 -0
  430. package/external/folly/folly/detail/SocketFastOpen.h +89 -0
  431. package/external/folly/folly/detail/SplitStringSimd.cpp +84 -0
  432. package/external/folly/folly/detail/SplitStringSimd.h +151 -0
  433. package/external/folly/folly/detail/SplitStringSimdImpl.h +149 -0
  434. package/external/folly/folly/detail/Sse.cpp +35 -0
  435. package/external/folly/folly/detail/Sse.h +45 -0
  436. package/external/folly/folly/detail/StaticSingletonManager.cpp +119 -0
  437. package/external/folly/folly/detail/StaticSingletonManager.h +298 -0
  438. package/external/folly/folly/detail/ThreadLocalDetail.cpp +492 -0
  439. package/external/folly/folly/detail/ThreadLocalDetail.h +800 -0
  440. package/external/folly/folly/detail/TrapOnAvx512.cpp +41 -0
  441. package/external/folly/folly/detail/TrapOnAvx512.h +21 -0
  442. package/external/folly/folly/detail/TurnSequencer.h +295 -0
  443. package/external/folly/folly/detail/TypeList.h +551 -0
  444. package/external/folly/folly/detail/UniqueInstance.cpp +136 -0
  445. package/external/folly/folly/detail/UniqueInstance.h +68 -0
  446. package/external/folly/folly/detail/base64_detail/BUCK +102 -0
  447. package/external/folly/folly/detail/base64_detail/Base64Api.cpp +40 -0
  448. package/external/folly/folly/detail/base64_detail/Base64Api.h +101 -0
  449. package/external/folly/folly/detail/base64_detail/Base64Common.h +80 -0
  450. package/external/folly/folly/detail/base64_detail/Base64Constants.h +79 -0
  451. package/external/folly/folly/detail/base64_detail/Base64HiddenConstants.h +129 -0
  452. package/external/folly/folly/detail/base64_detail/Base64SWAR.cpp +161 -0
  453. package/external/folly/folly/detail/base64_detail/Base64SWAR.h +32 -0
  454. package/external/folly/folly/detail/base64_detail/Base64Scalar.h +262 -0
  455. package/external/folly/folly/detail/base64_detail/Base64Simd.h +102 -0
  456. package/external/folly/folly/detail/base64_detail/Base64_SSE4_2.cpp +42 -0
  457. package/external/folly/folly/detail/base64_detail/Base64_SSE4_2.h +33 -0
  458. package/external/folly/folly/detail/base64_detail/Base64_SSE4_2_Platform.h +167 -0
  459. package/external/folly/folly/detail/base64_detail/README.md +392 -0
  460. package/external/folly/folly/detail/base64_detail/tests/BUCK +36 -0
  461. package/external/folly/folly/detail/base64_detail/tests/Base64AgainstScalarTest.cpp +141 -0
  462. package/external/folly/folly/detail/base64_detail/tests/Base64PlatformTest.cpp +273 -0
  463. package/external/folly/folly/detail/base64_detail/tests/Base64SpecialCasesTest.cpp +555 -0
  464. package/external/folly/folly/detail/test/AsyncTraceTest.cpp +43 -0
  465. package/external/folly/folly/detail/test/BUCK +118 -0
  466. package/external/folly/folly/detail/test/FileUtilDetailTest.cpp +56 -0
  467. package/external/folly/folly/detail/test/PerfScopedTest.cpp +107 -0
  468. package/external/folly/folly/detail/test/SimpleSimdStringUtilsTest.cpp +92 -0
  469. package/external/folly/folly/detail/test/SplitStringSimdTest.cpp +242 -0
  470. package/external/folly/folly/detail/test/StaticSingletonManagerTest.cpp +121 -0
  471. package/external/folly/folly/detail/test/ThreadLocalBenchmark.cpp +116 -0
  472. package/external/folly/folly/detail/test/ThreadLocalDetailTest.cpp +194 -0
  473. package/external/folly/folly/detail/test/TrapOnAvx512TestNegative.cpp +29 -0
  474. package/external/folly/folly/detail/test/UniqueInstanceTest.cpp +60 -0
  475. package/external/folly/folly/detail/thread_local_globals.cpp +69 -0
  476. package/external/folly/folly/detail/thread_local_globals.h +36 -0
  477. package/external/folly/folly/docs/AtomicHashMap.md +134 -0
  478. package/external/folly/folly/docs/Benchmark.md +310 -0
  479. package/external/folly/folly/docs/Conv.md +291 -0
  480. package/external/folly/folly/docs/Dynamic.md +220 -0
  481. package/external/folly/folly/docs/DynamicConverter.md +71 -0
  482. package/external/folly/folly/docs/Executors.md +63 -0
  483. package/external/folly/folly/docs/FBString.md +46 -0
  484. package/external/folly/folly/docs/FBVector.md +200 -0
  485. package/external/folly/folly/docs/Fbvector--graphical_solutions.png +0 -0
  486. package/external/folly/folly/docs/Format.md +177 -0
  487. package/external/folly/folly/docs/Function.md +92 -0
  488. package/external/folly/folly/docs/Futures.md +263 -0
  489. package/external/folly/folly/docs/GroupVarint.md +46 -0
  490. package/external/folly/folly/docs/Histogram.md +104 -0
  491. package/external/folly/folly/docs/MapUtils.md +80 -0
  492. package/external/folly/folly/docs/Overview.md +263 -0
  493. package/external/folly/folly/docs/PackedSyncPtr.md +77 -0
  494. package/external/folly/folly/docs/Poly.md +500 -0
  495. package/external/folly/folly/docs/ProducerConsumerQueue.md +82 -0
  496. package/external/folly/folly/docs/Rcu.md +218 -0
  497. package/external/folly/folly/docs/SmallLocks.md +24 -0
  498. package/external/folly/folly/docs/Synchronized.md +793 -0
  499. package/external/folly/folly/docs/ThreadCachedInt.md +98 -0
  500. package/external/folly/folly/docs/ThreadLocal.md +105 -0
  501. package/external/folly/folly/docs/Traits.md +161 -0
  502. package/external/folly/folly/docs/small_vector.md +64 -0
  503. package/external/folly/folly/docs/style.css +23 -0
  504. package/external/folly/folly/dynamic-inl.h +17 -0
  505. package/external/folly/folly/dynamic.h +17 -0
  506. package/external/folly/folly/folly_extended_library.bzl +28 -0
  507. package/external/folly/folly/functional/ApplyTuple.h +204 -0
  508. package/external/folly/folly/functional/BUCK +57 -0
  509. package/external/folly/folly/functional/Invoke.h +880 -0
  510. package/external/folly/folly/functional/Partial.h +130 -0
  511. package/external/folly/folly/functional/protocol.h +203 -0
  512. package/external/folly/folly/functional/test/ApplyTupleTest.cpp +549 -0
  513. package/external/folly/folly/functional/test/BUCK +57 -0
  514. package/external/folly/folly/functional/test/InvokeTest.cpp +483 -0
  515. package/external/folly/folly/functional/test/PartialTest.cpp +141 -0
  516. package/external/folly/folly/functional/test/protocol_test.cpp +177 -0
  517. package/external/folly/folly/functional/test/traits_test.cpp +551 -0
  518. package/external/folly/folly/functional/traits.h +675 -0
  519. package/external/folly/folly/hash/BUCK +86 -0
  520. package/external/folly/folly/hash/Checksum.cpp +275 -0
  521. package/external/folly/folly/hash/Checksum.h +94 -0
  522. package/external/folly/folly/hash/FarmHash.h +46 -0
  523. package/external/folly/folly/hash/Hash.h +1045 -0
  524. package/external/folly/folly/hash/MurmurHash.h +86 -0
  525. package/external/folly/folly/hash/SpookyHashV1.cpp +391 -0
  526. package/external/folly/folly/hash/SpookyHashV1.h +307 -0
  527. package/external/folly/folly/hash/SpookyHashV2.cpp +392 -0
  528. package/external/folly/folly/hash/SpookyHashV2.h +339 -0
  529. package/external/folly/folly/hash/detail/BUCK +26 -0
  530. package/external/folly/folly/hash/detail/ChecksumDetail.cpp +296 -0
  531. package/external/folly/folly/hash/detail/ChecksumDetail.h +137 -0
  532. package/external/folly/folly/hash/detail/Crc32CombineDetail.cpp +191 -0
  533. package/external/folly/folly/hash/detail/Crc32cDetail.cpp +303 -0
  534. package/external/folly/folly/hash/test/BUCK +132 -0
  535. package/external/folly/folly/hash/test/ChecksumBenchmark.cpp +91 -0
  536. package/external/folly/folly/hash/test/ChecksumTest.cpp +587 -0
  537. package/external/folly/folly/hash/test/FarmHashTest.cpp +41 -0
  538. package/external/folly/folly/hash/test/HashBenchmark.cpp +238 -0
  539. package/external/folly/folly/hash/test/HashTest.cpp +997 -0
  540. package/external/folly/folly/hash/test/MurmurHashTest.cpp +76 -0
  541. package/external/folly/folly/hash/test/SpookyHashV1Test.cpp +559 -0
  542. package/external/folly/folly/hash/test/SpookyHashV2Test.cpp +549 -0
  543. package/external/folly/folly/hash/test/traits_test.cpp +69 -0
  544. package/external/folly/folly/hash/traits.h +115 -0
  545. package/external/folly/folly/json/BUCK +155 -0
  546. package/external/folly/folly/json/DynamicConverter.h +464 -0
  547. package/external/folly/folly/json/DynamicParser-inl.h +316 -0
  548. package/external/folly/folly/json/DynamicParser.cpp +198 -0
  549. package/external/folly/folly/json/DynamicParser.h +394 -0
  550. package/external/folly/folly/json/JSONSchema.cpp +1030 -0
  551. package/external/folly/folly/json/JSONSchema.h +73 -0
  552. package/external/folly/folly/json/JsonMockUtil.h +73 -0
  553. package/external/folly/folly/json/JsonTestUtil.cpp +167 -0
  554. package/external/folly/folly/json/JsonTestUtil.h +88 -0
  555. package/external/folly/folly/json/bser/BUCK +24 -0
  556. package/external/folly/folly/json/bser/Bser.h +107 -0
  557. package/external/folly/folly/json/bser/Dump.cpp +253 -0
  558. package/external/folly/folly/json/bser/Load.cpp +246 -0
  559. package/external/folly/folly/json/bser/test/BUCK +14 -0
  560. package/external/folly/folly/json/bser/test/BserTest.cpp +149 -0
  561. package/external/folly/folly/json/dynamic-inl.h +1438 -0
  562. package/external/folly/folly/json/dynamic.cpp +552 -0
  563. package/external/folly/folly/json/dynamic.h +1346 -0
  564. package/external/folly/folly/json/json.cpp +1118 -0
  565. package/external/folly/folly/json/json.h +238 -0
  566. package/external/folly/folly/json/json_patch.cpp +325 -0
  567. package/external/folly/folly/json/json_patch.h +126 -0
  568. package/external/folly/folly/json/json_pointer.cpp +114 -0
  569. package/external/folly/folly/json/json_pointer.h +87 -0
  570. package/external/folly/folly/json/test/BUCK +147 -0
  571. package/external/folly/folly/json/test/DynamicBenchmark.cpp +146 -0
  572. package/external/folly/folly/json/test/DynamicConverterTest.cpp +518 -0
  573. package/external/folly/folly/json/test/DynamicOtherTest.cpp +344 -0
  574. package/external/folly/folly/json/test/DynamicParserTest.cpp +443 -0
  575. package/external/folly/folly/json/test/DynamicTest.cpp +1647 -0
  576. package/external/folly/folly/json/test/JSONSchemaTest.cpp +450 -0
  577. package/external/folly/folly/json/test/JsonBenchmark.cpp +264 -0
  578. package/external/folly/folly/json/test/JsonOtherTest.cpp +51 -0
  579. package/external/folly/folly/json/test/JsonTest.cpp +1153 -0
  580. package/external/folly/folly/json/test/JsonTestUtilTest.cpp +97 -0
  581. package/external/folly/folly/json/test/json_patch_test.cpp +361 -0
  582. package/external/folly/folly/json/test/json_pointer_test.cpp +58 -0
  583. package/external/folly/folly/json/tool/BUCK +13 -0
  584. package/external/folly/folly/json/tool/JSONSchemaTester.cpp +58 -0
  585. package/external/folly/folly/json.h +17 -0
  586. package/external/folly/folly/json_patch.h +17 -0
  587. package/external/folly/folly/json_pointer.h +17 -0
  588. package/external/folly/folly/lang/Access.h +29 -0
  589. package/external/folly/folly/lang/Align.h +240 -0
  590. package/external/folly/folly/lang/Aligned.h +92 -0
  591. package/external/folly/folly/lang/Assume.h +82 -0
  592. package/external/folly/folly/lang/BUCK +287 -0
  593. package/external/folly/folly/lang/Badge.h +108 -0
  594. package/external/folly/folly/lang/Bits.h +570 -0
  595. package/external/folly/folly/lang/BitsClass.h +312 -0
  596. package/external/folly/folly/lang/Builtin.h +74 -0
  597. package/external/folly/folly/lang/CArray.h +34 -0
  598. package/external/folly/folly/lang/CString.cpp +86 -0
  599. package/external/folly/folly/lang/CString.h +55 -0
  600. package/external/folly/folly/lang/Cast.h +51 -0
  601. package/external/folly/folly/lang/CheckedMath.h +253 -0
  602. package/external/folly/folly/lang/CustomizationPoint.h +58 -0
  603. package/external/folly/folly/lang/Exception.cpp +822 -0
  604. package/external/folly/folly/lang/Exception.h +716 -0
  605. package/external/folly/folly/lang/Extern.h +55 -0
  606. package/external/folly/folly/lang/Hint-inl.h +144 -0
  607. package/external/folly/folly/lang/Hint.h +238 -0
  608. package/external/folly/folly/lang/Keep.h +98 -0
  609. package/external/folly/folly/lang/New.h +124 -0
  610. package/external/folly/folly/lang/Ordering.h +140 -0
  611. package/external/folly/folly/lang/Pretty.h +159 -0
  612. package/external/folly/folly/lang/PropagateConst.h +413 -0
  613. package/external/folly/folly/lang/RValueReferenceWrapper.h +152 -0
  614. package/external/folly/folly/lang/SafeAssert.cpp +589 -0
  615. package/external/folly/folly/lang/SafeAssert.h +188 -0
  616. package/external/folly/folly/lang/StaticConst.h +33 -0
  617. package/external/folly/folly/lang/Thunk.h +100 -0
  618. package/external/folly/folly/lang/ToAscii.cpp +348 -0
  619. package/external/folly/folly/lang/ToAscii.h +182 -0
  620. package/external/folly/folly/lang/TypeInfo.h +58 -0
  621. package/external/folly/folly/lang/UncaughtExceptions.cpp +17 -0
  622. package/external/folly/folly/lang/UncaughtExceptions.h +19 -0
  623. package/external/folly/folly/lang/test/AlignTest.cpp +87 -0
  624. package/external/folly/folly/lang/test/AlignedTest.cpp +130 -0
  625. package/external/folly/folly/lang/test/BUCK +258 -0
  626. package/external/folly/folly/lang/test/BadgeTest.cpp +89 -0
  627. package/external/folly/folly/lang/test/BitsBenchmark.cpp +164 -0
  628. package/external/folly/folly/lang/test/BitsClassBenchmark.cpp +122 -0
  629. package/external/folly/folly/lang/test/BitsClassTest.cpp +379 -0
  630. package/external/folly/folly/lang/test/BitsTest.cpp +577 -0
  631. package/external/folly/folly/lang/test/CStringTest.cpp +60 -0
  632. package/external/folly/folly/lang/test/CastTest.cpp +47 -0
  633. package/external/folly/folly/lang/test/CheckedMathTest.cpp +394 -0
  634. package/external/folly/folly/lang/test/ExceptionBench.cpp +427 -0
  635. package/external/folly/folly/lang/test/ExceptionTest.cpp +413 -0
  636. package/external/folly/folly/lang/test/ExternTest.cpp +39 -0
  637. package/external/folly/folly/lang/test/HintTest.cpp +100 -0
  638. package/external/folly/folly/lang/test/NewTest.cpp +38 -0
  639. package/external/folly/folly/lang/test/OrderingTest.cpp +105 -0
  640. package/external/folly/folly/lang/test/PrettyTest.cpp +44 -0
  641. package/external/folly/folly/lang/test/PropagateConstTest.cpp +356 -0
  642. package/external/folly/folly/lang/test/RValueReferenceWrapperTest.cpp +85 -0
  643. package/external/folly/folly/lang/test/SafeAssertTest.cpp +75 -0
  644. package/external/folly/folly/lang/test/ThunkTest.cpp +105 -0
  645. package/external/folly/folly/lang/test/ToAsciiBench.cpp +466 -0
  646. package/external/folly/folly/lang/test/ToAsciiTest.cpp +266 -0
  647. package/external/folly/folly/lang/test/TypeInfoTest.cpp +56 -0
  648. package/external/folly/folly/memcpy.S +292 -0
  649. package/external/folly/folly/memcpy_select_aarch64.cpp +145 -0
  650. package/external/folly/folly/memory/Arena-inl.h +83 -0
  651. package/external/folly/folly/memory/Arena.h +325 -0
  652. package/external/folly/folly/memory/BUCK +191 -0
  653. package/external/folly/folly/memory/JemallocHugePageAllocator.cpp +449 -0
  654. package/external/folly/folly/memory/JemallocHugePageAllocator.h +105 -0
  655. package/external/folly/folly/memory/JemallocHugePageAllocatorTest.cpp +341 -0
  656. package/external/folly/folly/memory/JemallocNodumpAllocator.cpp +176 -0
  657. package/external/folly/folly/memory/JemallocNodumpAllocator.h +119 -0
  658. package/external/folly/folly/memory/JemallocNodumpAllocatorTest.cpp +61 -0
  659. package/external/folly/folly/memory/MallctlHelper.cpp +37 -0
  660. package/external/folly/folly/memory/MallctlHelper.h +167 -0
  661. package/external/folly/folly/memory/Malloc.h +551 -0
  662. package/external/folly/folly/memory/MemoryResource.h +57 -0
  663. package/external/folly/folly/memory/ReentrantAllocator.cpp +162 -0
  664. package/external/folly/folly/memory/ReentrantAllocator.h +261 -0
  665. package/external/folly/folly/memory/SanitizeAddress.cpp +75 -0
  666. package/external/folly/folly/memory/SanitizeAddress.h +117 -0
  667. package/external/folly/folly/memory/SanitizeLeak.cpp +119 -0
  668. package/external/folly/folly/memory/SanitizeLeak.h +108 -0
  669. package/external/folly/folly/memory/ThreadCachedArena.cpp +53 -0
  670. package/external/folly/folly/memory/ThreadCachedArena.h +90 -0
  671. package/external/folly/folly/memory/UninitializedMemoryHacks.h +426 -0
  672. package/external/folly/folly/memory/detail/BUCK +10 -0
  673. package/external/folly/folly/memory/detail/MallocImpl.cpp +52 -0
  674. package/external/folly/folly/memory/detail/MallocImpl.h +97 -0
  675. package/external/folly/folly/memory/not_null-inl.h +522 -0
  676. package/external/folly/folly/memory/not_null.h +449 -0
  677. package/external/folly/folly/memory/test/ArenaTest.cpp +354 -0
  678. package/external/folly/folly/memory/test/BUCK +146 -0
  679. package/external/folly/folly/memory/test/MallctlHelperTest.cpp +169 -0
  680. package/external/folly/folly/memory/test/MallocBenchmark.cpp +91 -0
  681. package/external/folly/folly/memory/test/MallocTest.cpp +78 -0
  682. package/external/folly/folly/memory/test/MemoryResourceTest.cpp +31 -0
  683. package/external/folly/folly/memory/test/ReentrantAllocatorTest.cpp +144 -0
  684. package/external/folly/folly/memory/test/SanitizeAddressTest.cpp +67 -0
  685. package/external/folly/folly/memory/test/SanitizeLeakTest.cpp +139 -0
  686. package/external/folly/folly/memory/test/ThreadCachedArenaTest.cpp +276 -0
  687. package/external/folly/folly/memory/test/UninitializedMemoryHacksODR.cpp +21 -0
  688. package/external/folly/folly/memory/test/UninitializedMemoryHacksTest.cpp +327 -0
  689. package/external/folly/folly/memory/test/not_null_test.cpp +608 -0
  690. package/external/folly/folly/memset.S +245 -0
  691. package/external/folly/folly/memset_select_aarch64.cpp +72 -0
  692. package/external/folly/folly/portability/Asm.h +50 -0
  693. package/external/folly/folly/portability/Atomic.h +31 -0
  694. package/external/folly/folly/portability/BUCK +456 -0
  695. package/external/folly/folly/portability/Builtins.cpp +31 -0
  696. package/external/folly/folly/portability/Builtins.h +161 -0
  697. package/external/folly/folly/portability/Config.h +43 -0
  698. package/external/folly/folly/portability/Constexpr.h +145 -0
  699. package/external/folly/folly/portability/Dirent.cpp +140 -0
  700. package/external/folly/folly/portability/Dirent.h +41 -0
  701. package/external/folly/folly/portability/Event.h +44 -0
  702. package/external/folly/folly/portability/Fcntl.cpp +120 -0
  703. package/external/folly/folly/portability/Fcntl.h +67 -0
  704. package/external/folly/folly/portability/Filesystem.cpp +67 -0
  705. package/external/folly/folly/portability/Filesystem.h +114 -0
  706. package/external/folly/folly/portability/FmtCompile.h +40 -0
  707. package/external/folly/folly/portability/GFlags.h +139 -0
  708. package/external/folly/folly/portability/GMock.h +35 -0
  709. package/external/folly/folly/portability/GTest.h +35 -0
  710. package/external/folly/folly/portability/IOVec.h +34 -0
  711. package/external/folly/folly/portability/Libgen.cpp +59 -0
  712. package/external/folly/folly/portability/Libgen.h +29 -0
  713. package/external/folly/folly/portability/Libunwind.h +21 -0
  714. package/external/folly/folly/portability/Malloc.cpp +31 -0
  715. package/external/folly/folly/portability/Malloc.h +53 -0
  716. package/external/folly/folly/portability/Math.h +90 -0
  717. package/external/folly/folly/portability/Memory.h +26 -0
  718. package/external/folly/folly/portability/OpenSSL.cpp +17 -0
  719. package/external/folly/folly/portability/OpenSSL.h +102 -0
  720. package/external/folly/folly/portability/PThread.cpp +697 -0
  721. package/external/folly/folly/portability/PThread.h +148 -0
  722. package/external/folly/folly/portability/README.md +21 -0
  723. package/external/folly/folly/portability/Sched.cpp +41 -0
  724. package/external/folly/folly/portability/Sched.h +45 -0
  725. package/external/folly/folly/portability/Sockets.cpp +245 -0
  726. package/external/folly/folly/portability/Sockets.h +155 -0
  727. package/external/folly/folly/portability/SourceLocation.h +49 -0
  728. package/external/folly/folly/portability/Stdio.cpp +77 -0
  729. package/external/folly/folly/portability/Stdio.h +32 -0
  730. package/external/folly/folly/portability/Stdlib.cpp +172 -0
  731. package/external/folly/folly/portability/Stdlib.h +64 -0
  732. package/external/folly/folly/portability/String.cpp +53 -0
  733. package/external/folly/folly/portability/String.h +39 -0
  734. package/external/folly/folly/portability/SysFile.cpp +46 -0
  735. package/external/folly/folly/portability/SysFile.h +27 -0
  736. package/external/folly/folly/portability/SysMembarrier.cpp +104 -0
  737. package/external/folly/folly/portability/SysMembarrier.h +26 -0
  738. package/external/folly/folly/portability/SysMman.cpp +242 -0
  739. package/external/folly/folly/portability/SysMman.h +68 -0
  740. package/external/folly/folly/portability/SysResource.cpp +108 -0
  741. package/external/folly/folly/portability/SysResource.h +71 -0
  742. package/external/folly/folly/portability/SysStat.cpp +66 -0
  743. package/external/folly/folly/portability/SysStat.h +52 -0
  744. package/external/folly/folly/portability/SysSyscall.h +73 -0
  745. package/external/folly/folly/portability/SysTime.cpp +62 -0
  746. package/external/folly/folly/portability/SysTime.h +50 -0
  747. package/external/folly/folly/portability/SysTypes.h +44 -0
  748. package/external/folly/folly/portability/SysUio.cpp +179 -0
  749. package/external/folly/folly/portability/SysUio.h +51 -0
  750. package/external/folly/folly/portability/Syslog.h +39 -0
  751. package/external/folly/folly/portability/Time.cpp +357 -0
  752. package/external/folly/folly/portability/Time.h +74 -0
  753. package/external/folly/folly/portability/Unistd.cpp +33 -0
  754. package/external/folly/folly/portability/Unistd.h +111 -0
  755. package/external/folly/folly/portability/Windows.h +108 -0
  756. package/external/folly/folly/portability/openat2.c +30 -0
  757. package/external/folly/folly/portability/openat2.h +39 -0
  758. package/external/folly/folly/portability/test/BUCK +59 -0
  759. package/external/folly/folly/portability/test/ConstexprTest.cpp +102 -0
  760. package/external/folly/folly/portability/test/FilesystemTest.cpp +35 -0
  761. package/external/folly/folly/portability/test/LibgenTest.cpp +35 -0
  762. package/external/folly/folly/portability/test/OpenSSLPortabilityTest.cpp +108 -0
  763. package/external/folly/folly/portability/test/PThreadTest.cpp +80 -0
  764. package/external/folly/folly/portability/test/TimeTest.cpp +90 -0
  765. package/external/folly/folly/small_vector.h +17 -0
  766. package/external/folly/folly/somerge_defs.bzl +399 -0
  767. package/external/folly/folly/sorted_vector_types.h +17 -0
  768. package/external/folly/folly/stop_watch.h +317 -0
  769. package/external/folly/folly/synchronization/AsymmetricThreadFence.cpp +91 -0
  770. package/external/folly/folly/synchronization/AsymmetricThreadFence.h +60 -0
  771. package/external/folly/folly/synchronization/AtomicNotification-inl.h +146 -0
  772. package/external/folly/folly/synchronization/AtomicNotification.cpp +34 -0
  773. package/external/folly/folly/synchronization/AtomicNotification.h +117 -0
  774. package/external/folly/folly/synchronization/AtomicRef.h +181 -0
  775. package/external/folly/folly/synchronization/AtomicStruct.h +150 -0
  776. package/external/folly/folly/synchronization/AtomicUtil-inl.h +482 -0
  777. package/external/folly/folly/synchronization/AtomicUtil.h +179 -0
  778. package/external/folly/folly/synchronization/BUCK +418 -0
  779. package/external/folly/folly/synchronization/Baton.h +419 -0
  780. package/external/folly/folly/synchronization/CallOnce.h +263 -0
  781. package/external/folly/folly/synchronization/DelayedInit.h +179 -0
  782. package/external/folly/folly/synchronization/DistributedMutex-inl.h +1744 -0
  783. package/external/folly/folly/synchronization/DistributedMutex.cpp +27 -0
  784. package/external/folly/folly/synchronization/DistributedMutex.h +342 -0
  785. package/external/folly/folly/synchronization/EventCount.h +200 -0
  786. package/external/folly/folly/synchronization/FlatCombining.h +629 -0
  787. package/external/folly/folly/synchronization/Hazptr-fwd.h +217 -0
  788. package/external/folly/folly/synchronization/Hazptr.cpp +36 -0
  789. package/external/folly/folly/synchronization/Hazptr.h +209 -0
  790. package/external/folly/folly/synchronization/HazptrDomain.cpp +68 -0
  791. package/external/folly/folly/synchronization/HazptrDomain.h +832 -0
  792. package/external/folly/folly/synchronization/HazptrHolder.h +431 -0
  793. package/external/folly/folly/synchronization/HazptrObj.h +533 -0
  794. package/external/folly/folly/synchronization/HazptrObjLinked.h +315 -0
  795. package/external/folly/folly/synchronization/HazptrRec.h +68 -0
  796. package/external/folly/folly/synchronization/HazptrThrLocal.h +180 -0
  797. package/external/folly/folly/synchronization/HazptrThreadPoolExecutor.cpp +46 -0
  798. package/external/folly/folly/synchronization/HazptrThreadPoolExecutor.h +25 -0
  799. package/external/folly/folly/synchronization/Latch.h +160 -0
  800. package/external/folly/folly/synchronization/LifoSem.h +767 -0
  801. package/external/folly/folly/synchronization/Lock.h +887 -0
  802. package/external/folly/folly/synchronization/MicroSpinLock.h +154 -0
  803. package/external/folly/folly/synchronization/NativeSemaphore.h +187 -0
  804. package/external/folly/folly/synchronization/ParkingLot.cpp +37 -0
  805. package/external/folly/folly/synchronization/ParkingLot.h +330 -0
  806. package/external/folly/folly/synchronization/PicoSpinLock.h +167 -0
  807. package/external/folly/folly/synchronization/RWSpinLock.h +549 -0
  808. package/external/folly/folly/synchronization/Rcu.cpp +26 -0
  809. package/external/folly/folly/synchronization/Rcu.h +553 -0
  810. package/external/folly/folly/synchronization/RelaxedAtomic.h +336 -0
  811. package/external/folly/folly/synchronization/SanitizeThread.cpp +141 -0
  812. package/external/folly/folly/synchronization/SanitizeThread.h +166 -0
  813. package/external/folly/folly/synchronization/SaturatingSemaphore.h +324 -0
  814. package/external/folly/folly/synchronization/SmallLocks.h +36 -0
  815. package/external/folly/folly/synchronization/ThrottledLifoSem.h +362 -0
  816. package/external/folly/folly/synchronization/WaitOptions.cpp +25 -0
  817. package/external/folly/folly/synchronization/WaitOptions.h +75 -0
  818. package/external/folly/folly/synchronization/detail/AtomicUtils.h +59 -0
  819. package/external/folly/folly/synchronization/detail/BUCK +104 -0
  820. package/external/folly/folly/synchronization/detail/Hardware.cpp +192 -0
  821. package/external/folly/folly/synchronization/detail/Hardware.h +75 -0
  822. package/external/folly/folly/synchronization/detail/HazptrUtils.h +339 -0
  823. package/external/folly/folly/synchronization/detail/InlineFunctionRef.h +229 -0
  824. package/external/folly/folly/synchronization/detail/Sleeper.cpp +27 -0
  825. package/external/folly/folly/synchronization/detail/Sleeper.h +62 -0
  826. package/external/folly/folly/synchronization/detail/Spin.h +96 -0
  827. package/external/folly/folly/synchronization/detail/ThreadCachedLists.h +174 -0
  828. package/external/folly/folly/synchronization/detail/ThreadCachedReaders.h +189 -0
  829. package/external/folly/folly/synchronization/detail/ThreadCachedTag.h +26 -0
  830. package/external/folly/folly/synchronization/detail/test/BUCK +28 -0
  831. package/external/folly/folly/synchronization/detail/test/HardwareTest.cpp +74 -0
  832. package/external/folly/folly/synchronization/detail/test/InlineFunctionRefTest.cpp +286 -0
  833. package/external/folly/folly/synchronization/example/BUCK +27 -0
  834. package/external/folly/folly/synchronization/example/HazptrLockFreeLIFO.h +88 -0
  835. package/external/folly/folly/synchronization/example/HazptrSWMRSet.h +133 -0
  836. package/external/folly/folly/synchronization/example/HazptrWideCAS.h +62 -0
  837. package/external/folly/folly/synchronization/test/AtomicNotificationTest.cpp +236 -0
  838. package/external/folly/folly/synchronization/test/AtomicRefTest.cpp +170 -0
  839. package/external/folly/folly/synchronization/test/AtomicStructTest.cpp +65 -0
  840. package/external/folly/folly/synchronization/test/AtomicUtilBench.cpp +457 -0
  841. package/external/folly/folly/synchronization/test/AtomicUtilTest.cpp +650 -0
  842. package/external/folly/folly/synchronization/test/BUCK +495 -0
  843. package/external/folly/folly/synchronization/test/Barrier.h +52 -0
  844. package/external/folly/folly/synchronization/test/BarrierTest.cpp +56 -0
  845. package/external/folly/folly/synchronization/test/BatonBenchmark.cpp +77 -0
  846. package/external/folly/folly/synchronization/test/BatonTest.cpp +164 -0
  847. package/external/folly/folly/synchronization/test/BatonTestHelpers.h +118 -0
  848. package/external/folly/folly/synchronization/test/CallOnceBenchmark.cpp +72 -0
  849. package/external/folly/folly/synchronization/test/CallOnceTest.cpp +153 -0
  850. package/external/folly/folly/synchronization/test/DelayedInitTest.cpp +281 -0
  851. package/external/folly/folly/synchronization/test/DistributedMutexTest.cpp +2074 -0
  852. package/external/folly/folly/synchronization/test/EventCountTest.cpp +124 -0
  853. package/external/folly/folly/synchronization/test/FlatCombiningBenchmark.cpp +1789 -0
  854. package/external/folly/folly/synchronization/test/FlatCombiningExamples.h +222 -0
  855. package/external/folly/folly/synchronization/test/FlatCombiningTest.cpp +121 -0
  856. package/external/folly/folly/synchronization/test/FlatCombiningTestHelpers.h +227 -0
  857. package/external/folly/folly/synchronization/test/HazptrTest.cpp +1689 -0
  858. package/external/folly/folly/synchronization/test/LatchTest.cpp +224 -0
  859. package/external/folly/folly/synchronization/test/LifoSemBench.cpp +185 -0
  860. package/external/folly/folly/synchronization/test/LifoSemTests.cpp +353 -0
  861. package/external/folly/folly/synchronization/test/LockTest.cpp +1239 -0
  862. package/external/folly/folly/synchronization/test/NativeSemaphoreTest.cpp +37 -0
  863. package/external/folly/folly/synchronization/test/ParkingLotBenchmark.cpp +239 -0
  864. package/external/folly/folly/synchronization/test/ParkingLotTest.cpp +170 -0
  865. package/external/folly/folly/synchronization/test/RWSpinLockTest.cpp +235 -0
  866. package/external/folly/folly/synchronization/test/RcuBench.cpp +66 -0
  867. package/external/folly/folly/synchronization/test/RcuTest.cpp +330 -0
  868. package/external/folly/folly/synchronization/test/RelaxedAtomicTest.cpp +389 -0
  869. package/external/folly/folly/synchronization/test/SaturatingSemaphoreTest.cpp +166 -0
  870. package/external/folly/folly/synchronization/test/Semaphore.h +242 -0
  871. package/external/folly/folly/synchronization/test/SemaphoreTest.cpp +271 -0
  872. package/external/folly/folly/synchronization/test/SmallLocksBenchmark.cpp +1296 -0
  873. package/external/folly/folly/synchronization/test/SmallLocksTest.cpp +510 -0
  874. package/external/folly/folly/synchronization/test/ThreadCachedEpochBench.h +67 -0
  875. package/external/folly/folly/synchronization/test/ThreadCachedReadersBench.cpp +42 -0
  876. package/external/folly/folly/synchronization/test/ThreadCachedReadersTest.cpp +52 -0
  877. package/external/folly/folly/synchronization/test/ThrottledLifoSemTest.cpp +243 -0
  878. package/external/folly/folly/system/AtFork.cpp +205 -0
  879. package/external/folly/folly/system/AtFork.h +116 -0
  880. package/external/folly/folly/system/AuxVector.h +198 -0
  881. package/external/folly/folly/system/BUCK +144 -0
  882. package/external/folly/folly/system/EnvUtil.cpp +93 -0
  883. package/external/folly/folly/system/EnvUtil.h +113 -0
  884. package/external/folly/folly/system/HardwareConcurrency.cpp +39 -0
  885. package/external/folly/folly/system/HardwareConcurrency.h +23 -0
  886. package/external/folly/folly/system/MemoryMapping.cpp +477 -0
  887. package/external/folly/folly/system/MemoryMapping.h +287 -0
  888. package/external/folly/folly/system/Pid.cpp +87 -0
  889. package/external/folly/folly/system/Pid.h +34 -0
  890. package/external/folly/folly/system/Shell.cpp +33 -0
  891. package/external/folly/folly/system/Shell.h +93 -0
  892. package/external/folly/folly/system/ThreadId.cpp +89 -0
  893. package/external/folly/folly/system/ThreadId.h +62 -0
  894. package/external/folly/folly/system/ThreadName.cpp +330 -0
  895. package/external/folly/folly/system/ThreadName.h +72 -0
  896. package/external/folly/folly/system/test/AtForkTest.cpp +309 -0
  897. package/external/folly/folly/system/test/AuxVectorTest.cpp +55 -0
  898. package/external/folly/folly/system/test/BUCK +120 -0
  899. package/external/folly/folly/system/test/EnvUtilSubprocess.cpp +26 -0
  900. package/external/folly/folly/system/test/EnvUtilTest.cpp +197 -0
  901. package/external/folly/folly/system/test/MemoryMappingTest.cpp +179 -0
  902. package/external/folly/folly/system/test/PidTest.cpp +46 -0
  903. package/external/folly/folly/system/test/ShellTest.cpp +66 -0
  904. package/external/folly/folly/system/test/ThreadIdTest.cpp +114 -0
  905. package/external/folly/folly/system/test/ThreadNameTest.cpp +85 -0
  906. package/external/folly/folly.vcxitems +164 -0
  907. package/external/folly/static/logo.svg +1 -0
  908. package/external/folly/sync-config.json +8 -0
  909. package/package.json +8 -8
  910. package/templates/cpp-lib/example/metro.config.js +18 -2
@@ -0,0 +1,1212 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ #pragma once
18
+
19
+ #include <algorithm>
20
+ #include <atomic>
21
+ #include <climits>
22
+ #include <cmath>
23
+ #include <iomanip>
24
+ #include <iostream>
25
+ #include <mutex>
26
+
27
+ #include <folly/Random.h>
28
+ #include <folly/SpinLock.h>
29
+ #include <folly/ThreadLocal.h>
30
+ #include <folly/detail/Futex.h>
31
+ #include <folly/lang/Align.h>
32
+ #include <folly/synchronization/Hazptr.h>
33
+ #include <folly/synchronization/WaitOptions.h>
34
+ #include <folly/synchronization/detail/Spin.h>
35
+
36
+ /// ------ Concurrent Priority Queue Implementation ------
37
+ // The concurrent priority queue implementation is based on the
38
+ // Mound data structure (Mounds: Array-Based Concurrent Priority Queues
39
+ // by Yujie Liu and Michael Spear, ICPP 2012)
40
+ //
41
+ /// --- Overview ---
42
+ // This relaxed implementation extends the Mound algorithm, and provides
43
+ // following features:
44
+ // - Arbitrary priorities.
45
+ // - Unbounded size.
46
+ // - Push, pop, empty, size functions. [TODO: Non-waiting and timed wait pop]
47
+ // - Supports blocking.
48
+ // - Fast and Scalable.
49
+ //
50
+ /// --- Mound ---
51
+ // A Mound is a heap where each element is a sorted linked list.
52
+ // First nodes in the lists maintain the heap property. Push randomly
53
+ // selects a leaf at the bottom level, then uses binary search to find
54
+ // a place to insert the new node to the head of the list. Pop gets
55
+ // the node from the head of the list at the root, then swap the
56
+ // list down until the heap feature holds. To use Mound in our
57
+ // implementation, we need to solve the following problems:
58
+ // - 1. Lack of general relaxed implementations. Mound is appealing
59
+ // for relaxed priority queue implementation because pop the whole
60
+ // list from the root is straightforward. One thread pops the list
61
+ // and following threads can pop from the list until its empty.
62
+ // Those pops only trigger one swap done operation. Thus reduce
63
+ // the latency for pop and reduce the contention for Mound.
64
+ // The difficulty is to provide a scalable and fast mechanism
65
+ // to let threads concurrently get elements from the list.
66
+ // - 2. Lack of control of list length. The length for every
67
+ // lists is critical for the performance. Mound suffers from not
68
+ // only the extreme cases(Push with increasing priorities, Mound
69
+ // becomes a sorted linked list; Push with decreasing priorities,
70
+ // Mound becomes to a regular heap), but also the common case(for
71
+ // random generated priorities, Mound degrades to the regular heap
72
+ // after millions of push/pop operations). The difficulty is to
73
+ // stabilize the list length without losing the accuracy and performance.
74
+ // - 3. Does not support blocking. Blocking is an important feature.
75
+ // Mound paper does not mention it. Designing the new algorithm for
76
+ // efficient blocking is challenging.
77
+ // - 4. Memory management. Mound allows optimistic reads. We need to
78
+ // protect the node from been reclaimed.
79
+ //
80
+ /// --- Design ---
81
+ // Our implementation extends Mound algorithm to support
82
+ // efficient relaxed pop. We employ a shared buffer algorithm to
83
+ // share the popped list. Our algorithm makes popping from shared
84
+ // buffer as fast as fetch_and_add. We improve the performance
85
+ // and compact the heap structure by stabilizing the size of each list.
86
+ // The implementation exposes the template parameter to set the
87
+ // preferred list length. Under the hood, we provide algorithms for
88
+ // fast inserting, pruning, and merging. The blocking algorithm is
89
+ // tricky. It allows one producer only wakes one consumer at a time.
90
+ // It also does not block the producer. For optimistic read, we use
91
+ // hazard pointer to protect the node from been reclaimed. We optimize the
92
+ // check-lock-check pattern by using test-test-and-set spin lock.
93
+
94
+ /// --- Template Parameters: ---
95
+ // 1. PopBatch could be 0 or a positive integer.
96
+ // If it is 0, only pop one node at a time.
97
+ // This is the strict implementation. It guarantees the return
98
+ // priority is alway the highest. If it is > 0, we keep
99
+ // up to that number of nodes in a shared buffer to be consumed by
100
+ // subsequent pop operations.
101
+ //
102
+ // 2. ListTargetSize represents the minimal length for the list. It
103
+ // solves the problem when inserting to Mound with
104
+ // decreasing priority order (degrade to a heap). Moreover,
105
+ // it maintains the Mound structure stable after trillions of
106
+ // operations, which causes unbalanced problem in the original
107
+ // Mound algorithm. We set the prunning length and merging lengtyh
108
+ // based on this parameter.
109
+ //
110
+ /// --- Interface ---
111
+ // void push(const T& val)
112
+ // void pop(T& val)
113
+ // size_t size()
114
+ // bool empty()
115
+
116
+ namespace folly {
117
+
118
+ template <
119
+ typename T,
120
+ bool MayBlock = false,
121
+ bool SupportsSize = false,
122
+ size_t PopBatch = 16,
123
+ size_t ListTargetSize = 25,
124
+ typename Mutex = folly::SpinLock,
125
+ template <typename> class Atom = std::atomic>
126
+ class RelaxedConcurrentPriorityQueue {
127
+ // Max height of the tree
128
+ static constexpr uint32_t MAX_LEVELS = 32;
129
+ // The default minimum value
130
+ static constexpr T MIN_VALUE = std::numeric_limits<T>::min();
131
+
132
+ // Align size for the shared buffer node
133
+ static constexpr size_t Align = 1u << 7;
134
+ static constexpr int LevelForForceInsert = 3;
135
+ static constexpr int LevelForTraverseParent = 7;
136
+
137
+ static_assert(PopBatch <= 256, "PopBatch must be <= 256");
138
+ static_assert(
139
+ ListTargetSize >= 1 && ListTargetSize <= 256,
140
+ "TargetSize must be in the range [1, 256]");
141
+
142
+ // The maximal length for the list
143
+ static constexpr size_t PruningSize = ListTargetSize * 2;
144
+ // When pop from Mound, tree elements near the leaf
145
+ // level are likely be very small (the length of the list). When
146
+ // swapping down after pop a list, we check the size of the
147
+ // children to decide whether to merge them to their parent.
148
+ static constexpr size_t MergingSize = ListTargetSize;
149
+
150
+ /// List Node structure
151
+ struct Node : public folly::hazptr_obj_base<Node, Atom> {
152
+ Node* next;
153
+ T val;
154
+ };
155
+
156
+ /// Mound Element (Tree node), head points to a linked list
157
+ struct MoundElement {
158
+ // Reading (head, size) without acquiring the lock
159
+ Atom<Node*> head;
160
+ Atom<size_t> size;
161
+ alignas(Align) Mutex lock;
162
+ MoundElement() { // initializer
163
+ head.store(nullptr, std::memory_order_relaxed);
164
+ size.store(0, std::memory_order_relaxed);
165
+ }
166
+ };
167
+
168
+ /// The pos strcture simplify the implementation
169
+ struct Position {
170
+ uint32_t level;
171
+ uint32_t index;
172
+ };
173
+
174
+ /// Node for shared buffer should be aligned
175
+ struct BufferNode {
176
+ alignas(Align) Atom<Node*> pnode;
177
+ };
178
+
179
+ /// Data members
180
+
181
+ // Mound structure -> 2D array to represent a tree
182
+ MoundElement* levels_[MAX_LEVELS];
183
+ // Record the current leaf level (root is 0)
184
+ Atom<uint32_t> bottom_;
185
+ // It is used when expanding the tree
186
+ Atom<uint32_t> guard_;
187
+
188
+ // Mound with shared buffer
189
+ // Following two members are accessed by consumers
190
+ std::unique_ptr<BufferNode[]> shared_buffer_;
191
+ alignas(Align) Atom<int> top_loc_;
192
+
193
+ /// Blocking algorithm
194
+ // Numbers of futexs in the array
195
+ static constexpr size_t NumFutex = 128;
196
+ // The index gap for accessing futex in the array
197
+ static constexpr size_t Stride = 33;
198
+ std::unique_ptr<folly::detail::Futex<Atom>[]> futex_array_;
199
+ alignas(Align) Atom<uint32_t> cticket_;
200
+ alignas(Align) Atom<uint32_t> pticket_;
201
+
202
+ // Two counters to calculate size of the queue
203
+ alignas(Align) Atom<size_t> counter_p_;
204
+ alignas(Align) Atom<size_t> counter_c_;
205
+
206
+ public:
207
+ /// Constructor
208
+ RelaxedConcurrentPriorityQueue()
209
+ : cticket_(1), pticket_(1), counter_p_(0), counter_c_(0) {
210
+ if (MayBlock) {
211
+ futex_array_.reset(new folly::detail::Futex<Atom>[NumFutex]);
212
+ }
213
+
214
+ if (PopBatch > 0) {
215
+ top_loc_ = -1;
216
+ shared_buffer_.reset(new BufferNode[PopBatch]);
217
+ for (size_t i = 0; i < PopBatch; i++) {
218
+ shared_buffer_[i].pnode = nullptr;
219
+ }
220
+ }
221
+ bottom_.store(0, std::memory_order_relaxed);
222
+ guard_.store(0, std::memory_order_relaxed);
223
+ // allocate the root MoundElement and initialize Mound
224
+ levels_[0] = new MoundElement[1]; // default MM for MoundElement
225
+ for (uint32_t i = 1; i < MAX_LEVELS; i++) {
226
+ levels_[i] = nullptr;
227
+ }
228
+ }
229
+
230
+ ~RelaxedConcurrentPriorityQueue() {
231
+ if (PopBatch > 0) {
232
+ deleteSharedBuffer();
233
+ }
234
+ if (MayBlock) {
235
+ futex_array_.reset();
236
+ }
237
+ Position pos;
238
+ pos.level = pos.index = 0;
239
+ deleteAllNodes(pos);
240
+ // default MM for MoundElement
241
+ for (int i = getBottomLevel(); i >= 0; i--) {
242
+ delete[] levels_[i];
243
+ }
244
+ }
245
+
246
+ void push(const T& val) {
247
+ moundPush(val);
248
+ if (SupportsSize) {
249
+ counter_p_.fetch_add(1, std::memory_order_relaxed);
250
+ }
251
+ }
252
+
253
+ void pop(T& val) {
254
+ moundPop(val);
255
+ if (SupportsSize) {
256
+ counter_c_.fetch_add(1, std::memory_order_relaxed);
257
+ }
258
+ }
259
+
260
+ /// Note: size() and empty() are guaranteed to be accurate only if
261
+ /// the queue is not changed concurrently.
262
+ /// Returns an estimate of the size of the queue
263
+ size_t size() {
264
+ DCHECK(SupportsSize);
265
+ size_t p = counter_p_.load(std::memory_order_acquire);
266
+ size_t c = counter_c_.load(std::memory_order_acquire);
267
+ return (p > c) ? p - c : 0;
268
+ }
269
+
270
+ /// Returns true only if the queue was empty during the call.
271
+ bool empty() { return isEmpty(); }
272
+
273
+ private:
274
+ uint32_t getBottomLevel() { return bottom_.load(std::memory_order_acquire); }
275
+
276
+ /// This function is only called by the destructor
277
+ void deleteSharedBuffer() {
278
+ DCHECK(PopBatch > 0);
279
+ // delete nodes in the buffer
280
+ int loc = top_loc_.load(std::memory_order_relaxed);
281
+ while (loc >= 0) {
282
+ Node* n = shared_buffer_[loc--].pnode.load(std::memory_order_relaxed);
283
+ delete n;
284
+ }
285
+ // delete buffer
286
+ shared_buffer_.reset();
287
+ }
288
+
289
+ /// This function is only called by the destructor
290
+ void deleteAllNodes(const Position& pos) {
291
+ if (getElementSize(pos) == 0) {
292
+ // current list is empty, do not need to check
293
+ // its children again.
294
+ return;
295
+ }
296
+
297
+ Node* curList = getList(pos);
298
+ setTreeNode(pos, nullptr);
299
+ while (curList != nullptr) { // reclaim nodes
300
+ Node* n = curList;
301
+ curList = curList->next;
302
+ delete n;
303
+ }
304
+
305
+ if (!isLeaf(pos)) {
306
+ deleteAllNodes(leftOf(pos));
307
+ deleteAllNodes(rightOf(pos));
308
+ }
309
+ }
310
+
311
+ /// Check the first node in TreeElement keeps the heap structure.
312
+ bool isHeap(const Position& pos) {
313
+ if (isLeaf(pos)) {
314
+ return true;
315
+ }
316
+ Position lchild = leftOf(pos);
317
+ Position rchild = rightOf(pos);
318
+ return isHeap(lchild) && isHeap(rchild) &&
319
+ readValue(pos) >= readValue(lchild) &&
320
+ readValue(pos) >= readValue(rchild);
321
+ }
322
+
323
+ /// Current position is leaf?
324
+ FOLLY_ALWAYS_INLINE bool isLeaf(const Position& pos) {
325
+ return pos.level == getBottomLevel();
326
+ }
327
+
328
+ /// Current element is the root?
329
+ FOLLY_ALWAYS_INLINE bool isRoot(const Position& pos) {
330
+ return pos.level == 0;
331
+ }
332
+
333
+ /// Locate the parent node
334
+ FOLLY_ALWAYS_INLINE Position parentOf(const Position& pos) {
335
+ Position res;
336
+ res.level = pos.level - 1;
337
+ res.index = pos.index / 2;
338
+ return res;
339
+ }
340
+
341
+ /// Locate the left child
342
+ FOLLY_ALWAYS_INLINE Position leftOf(const Position& pos) {
343
+ Position res;
344
+ res.level = pos.level + 1;
345
+ res.index = pos.index * 2;
346
+ return res;
347
+ }
348
+
349
+ /// Locate the right child
350
+ FOLLY_ALWAYS_INLINE Position rightOf(const Position& pos) {
351
+ Position res;
352
+ res.level = pos.level + 1;
353
+ res.index = pos.index * 2 + 1;
354
+ return res;
355
+ }
356
+
357
+ /// get the list size in current MoundElement
358
+ FOLLY_ALWAYS_INLINE size_t getElementSize(const Position& pos) {
359
+ return levels_[pos.level][pos.index].size.load(std::memory_order_relaxed);
360
+ }
361
+
362
+ /// Set the size of current MoundElement
363
+ FOLLY_ALWAYS_INLINE void setElementSize(
364
+ const Position& pos, const uint32_t& v) {
365
+ levels_[pos.level][pos.index].size.store(v, std::memory_order_relaxed);
366
+ }
367
+
368
+ /// Extend the tree level
369
+ void grow(uint32_t btm) {
370
+ while (true) {
371
+ if (guard_.fetch_add(1, std::memory_order_acq_rel) == 0) {
372
+ break;
373
+ }
374
+ // someone already expanded the tree
375
+ if (btm != getBottomLevel()) {
376
+ return;
377
+ }
378
+ std::this_thread::yield();
379
+ }
380
+ // double check the bottom has not changed yet
381
+ if (btm != getBottomLevel()) {
382
+ guard_.store(0, std::memory_order_release);
383
+ return;
384
+ }
385
+ // create and initialize the new level
386
+ uint32_t tmp_btm = getBottomLevel();
387
+ uint32_t size = 1 << (tmp_btm + 1);
388
+ MoundElement* new_level = new MoundElement[size]; // MM
389
+ levels_[tmp_btm + 1] = new_level;
390
+ bottom_.store(tmp_btm + 1, std::memory_order_release);
391
+ guard_.store(0, std::memory_order_release);
392
+ }
393
+
394
+ /// TODO: optimization
395
+ // This function is important, it selects a position to insert the
396
+ // node, there are two execution paths when this function returns.
397
+ // 1. It returns a position with head node has lower priority than the target.
398
+ // Thus it could be potentially used as the starting element to do the binary
399
+ // search to find the fit position. (slow path)
400
+ // 2. It returns a position, which is not the best fit.
401
+ // But it prevents aggressively grow the Mound. (fast path)
402
+ Position selectPosition(
403
+ const T& val,
404
+ bool& path,
405
+ uint32_t& seed,
406
+ folly::hazptr_holder<Atom>& hptr) {
407
+ while (true) {
408
+ uint32_t b = getBottomLevel();
409
+ int bound = 1 << b; // number of elements in this level
410
+ int steps = 1 + b * b; // probe the length
411
+ ++seed;
412
+ uint32_t index = seed % bound;
413
+
414
+ for (int i = 0; i < steps; i++) {
415
+ int loc = (index + i) % bound;
416
+ Position pos;
417
+ pos.level = b;
418
+ pos.index = loc;
419
+ // the first round, we do the quick check
420
+ if (optimisticReadValue(pos, hptr) <= val) {
421
+ path = false;
422
+ seed = ++loc;
423
+ return pos;
424
+ } else if (
425
+ b > LevelForForceInsert && getElementSize(pos) < ListTargetSize) {
426
+ // [fast path] conservative implementation
427
+ // it makes sure every tree element should
428
+ // have more than the given number of nodes.
429
+ seed = ++loc;
430
+ path = true;
431
+ return pos;
432
+ }
433
+ if (b != getBottomLevel()) {
434
+ break;
435
+ }
436
+ }
437
+ // failed too many times grow
438
+ if (b == getBottomLevel()) {
439
+ grow(b);
440
+ }
441
+ }
442
+ }
443
+
444
+ /// Swap two Tree Elements (head, size)
445
+ void swapList(const Position& a, const Position& b) {
446
+ Node* tmp = getList(a);
447
+ setTreeNode(a, getList(b));
448
+ setTreeNode(b, tmp);
449
+
450
+ // need to swap the tree node meta-data
451
+ uint32_t sa = getElementSize(a);
452
+ uint32_t sb = getElementSize(b);
453
+ setElementSize(a, sb);
454
+ setElementSize(b, sa);
455
+ }
456
+
457
+ FOLLY_ALWAYS_INLINE void lockNode(const Position& pos) {
458
+ levels_[pos.level][pos.index].lock.lock();
459
+ }
460
+
461
+ FOLLY_ALWAYS_INLINE void unlockNode(const Position& pos) {
462
+ levels_[pos.level][pos.index].lock.unlock();
463
+ }
464
+
465
+ FOLLY_ALWAYS_INLINE bool trylockNode(const Position& pos) {
466
+ return levels_[pos.level][pos.index].lock.try_lock();
467
+ }
468
+
469
+ FOLLY_ALWAYS_INLINE T
470
+ optimisticReadValue(const Position& pos, folly::hazptr_holder<Atom>& hptr) {
471
+ Node* tmp = hptr.protect(levels_[pos.level][pos.index].head);
472
+ return (tmp == nullptr) ? MIN_VALUE : tmp->val;
473
+ }
474
+
475
+ // Get the value from the head of the list as the elementvalue
476
+ FOLLY_ALWAYS_INLINE T readValue(const Position& pos) {
477
+ Node* tmp = getList(pos);
478
+ return (tmp == nullptr) ? MIN_VALUE : tmp->val;
479
+ }
480
+
481
+ FOLLY_ALWAYS_INLINE Node* getList(const Position& pos) {
482
+ return levels_[pos.level][pos.index].head.load(std::memory_order_acquire);
483
+ }
484
+
485
+ FOLLY_ALWAYS_INLINE void setTreeNode(const Position& pos, Node* t) {
486
+ levels_[pos.level][pos.index].head.store(t, std::memory_order_release);
487
+ }
488
+
489
+ // Merge two sorted lists
490
+ Node* mergeList(Node* base, Node* source) {
491
+ if (base == nullptr) {
492
+ return source;
493
+ } else if (source == nullptr) {
494
+ return base;
495
+ }
496
+
497
+ Node *res, *p;
498
+ // choose the head node
499
+ if (base->val >= source->val) {
500
+ res = base;
501
+ base = base->next;
502
+ p = res;
503
+ } else {
504
+ res = source;
505
+ source = source->next;
506
+ p = res;
507
+ }
508
+
509
+ while (base != nullptr && source != nullptr) {
510
+ if (base->val >= source->val) {
511
+ p->next = base;
512
+ base = base->next;
513
+ } else {
514
+ p->next = source;
515
+ source = source->next;
516
+ }
517
+ p = p->next;
518
+ }
519
+ if (base == nullptr) {
520
+ p->next = source;
521
+ } else {
522
+ p->next = base;
523
+ }
524
+ return res;
525
+ }
526
+
527
+ /// Merge list t to the Element Position
528
+ void mergeListTo(const Position& pos, Node* t, const size_t& list_length) {
529
+ Node* head = getList(pos);
530
+ setTreeNode(pos, mergeList(head, t));
531
+ uint32_t ns = getElementSize(pos) + list_length;
532
+ setElementSize(pos, ns);
533
+ }
534
+
535
+ bool pruningLeaf(const Position& pos) {
536
+ if (getElementSize(pos) <= PruningSize) {
537
+ unlockNode(pos);
538
+ return true;
539
+ }
540
+
541
+ int b = getBottomLevel();
542
+ int leaves = 1 << b;
543
+ int cnodes = 0;
544
+ for (int i = 0; i < leaves; i++) {
545
+ Position tmp;
546
+ tmp.level = b;
547
+ tmp.index = i;
548
+ if (getElementSize(tmp) != 0) {
549
+ cnodes++;
550
+ }
551
+ if (cnodes > leaves * 2 / 3) {
552
+ break;
553
+ }
554
+ }
555
+
556
+ if (cnodes <= leaves * 2 / 3) {
557
+ unlockNode(pos);
558
+ return true;
559
+ }
560
+ return false;
561
+ }
562
+
563
+ /// Split the current list into two lists,
564
+ /// then split the tail list and merge to two children.
565
+ void startPruning(const Position& pos) {
566
+ if (isLeaf(pos) && pruningLeaf(pos)) {
567
+ return;
568
+ }
569
+
570
+ // split the list, record the tail
571
+ Node* pruning_head = getList(pos);
572
+ int steps = ListTargetSize; // keep in the original list
573
+ for (int i = 0; i < steps - 1; i++) {
574
+ pruning_head = pruning_head->next;
575
+ }
576
+ Node* t = pruning_head;
577
+ pruning_head = pruning_head->next;
578
+ t->next = nullptr;
579
+ int tail_length = getElementSize(pos) - steps;
580
+ setElementSize(pos, steps);
581
+
582
+ // split the tail list into two lists
583
+ // evenly merge to two children
584
+ if (pos.level != getBottomLevel()) {
585
+ // split the rest into two lists
586
+ int left_length = (tail_length + 1) / 2;
587
+ int right_length = tail_length - left_length;
588
+ Node *to_right, *to_left = pruning_head;
589
+ for (int i = 0; i < left_length - 1; i++) {
590
+ pruning_head = pruning_head->next;
591
+ }
592
+ to_right = pruning_head->next;
593
+ pruning_head->next = nullptr;
594
+
595
+ Position lchild = leftOf(pos);
596
+ Position rchild = rightOf(pos);
597
+ if (left_length != 0) {
598
+ lockNode(lchild);
599
+ mergeListTo(lchild, to_left, left_length);
600
+ }
601
+ if (right_length != 0) {
602
+ lockNode(rchild);
603
+ mergeListTo(rchild, to_right, right_length);
604
+ }
605
+ unlockNode(pos);
606
+ if (left_length != 0 && getElementSize(lchild) > PruningSize) {
607
+ startPruning(lchild);
608
+ } else if (left_length != 0) {
609
+ unlockNode(lchild);
610
+ }
611
+ if (right_length != 0 && getElementSize(rchild) > PruningSize) {
612
+ startPruning(rchild);
613
+ } else if (right_length != 0) {
614
+ unlockNode(rchild);
615
+ }
616
+ } else { // time to grow the Mound
617
+ grow(pos.level);
618
+ // randomly choose a child to insert
619
+ if (steps % 2 == 1) {
620
+ Position rchild = rightOf(pos);
621
+ lockNode(rchild);
622
+ mergeListTo(rchild, pruning_head, tail_length);
623
+ unlockNode(pos);
624
+ unlockNode(rchild);
625
+ } else {
626
+ Position lchild = leftOf(pos);
627
+ lockNode(lchild);
628
+ mergeListTo(lchild, pruning_head, tail_length);
629
+ unlockNode(pos);
630
+ unlockNode(lchild);
631
+ }
632
+ }
633
+ }
634
+
635
+ // This function insert the new node (always) at the head of the
636
+ // current list. It needs to lock the parent & current
637
+ // This function may cause the list becoming tooooo long, so we
638
+ // provide pruning algorithm.
639
+ bool regularInsert(const Position& pos, const T& val, Node* newNode) {
640
+ // insert to the root node
641
+ if (isRoot(pos)) {
642
+ lockNode(pos);
643
+ T nv = readValue(pos);
644
+ if (FOLLY_LIKELY(nv <= val)) {
645
+ newNode->next = getList(pos);
646
+ setTreeNode(pos, newNode);
647
+ uint32_t sz = getElementSize(pos);
648
+ setElementSize(pos, sz + 1);
649
+ if (FOLLY_UNLIKELY(sz > PruningSize)) {
650
+ startPruning(pos);
651
+ } else {
652
+ unlockNode(pos);
653
+ }
654
+ return true;
655
+ }
656
+ unlockNode(pos);
657
+ return false;
658
+ }
659
+
660
+ // insert to an inner node
661
+ Position parent = parentOf(pos);
662
+ if (!trylockNode(parent)) {
663
+ return false;
664
+ }
665
+ if (!trylockNode(pos)) {
666
+ unlockNode(parent);
667
+ return false;
668
+ }
669
+ T pv = readValue(parent);
670
+ T nv = readValue(pos);
671
+ if (FOLLY_LIKELY(pv > val && nv <= val)) {
672
+ // improve the accuracy by getting the node(R) with less priority than the
673
+ // new value from parent level, insert the new node to the parent list
674
+ // and insert R to the current list.
675
+ // It only happens at >= LevelForTraverseParent for reducing contention
676
+ uint32_t sz = getElementSize(pos);
677
+ if (pos.level >= LevelForTraverseParent) {
678
+ Node* start = getList(parent);
679
+ while (start->next != nullptr && start->next->val >= val) {
680
+ start = start->next;
681
+ }
682
+ if (start->next != nullptr) {
683
+ newNode->next = start->next;
684
+ start->next = newNode;
685
+ while (start->next->next != nullptr) {
686
+ start = start->next;
687
+ }
688
+ newNode = start->next;
689
+ start->next = nullptr;
690
+ }
691
+ unlockNode(parent);
692
+
693
+ Node* curList = getList(pos);
694
+ if (curList == nullptr) {
695
+ newNode->next = nullptr;
696
+ setTreeNode(pos, newNode);
697
+ } else {
698
+ Node* p = curList;
699
+ if (p->val <= newNode->val) {
700
+ newNode->next = curList;
701
+ setTreeNode(pos, newNode);
702
+ } else {
703
+ while (p->next != nullptr && p->next->val >= newNode->val) {
704
+ p = p->next;
705
+ }
706
+ newNode->next = p->next;
707
+ p->next = newNode;
708
+ }
709
+ }
710
+ setElementSize(pos, sz + 1);
711
+ } else {
712
+ unlockNode(parent);
713
+ newNode->next = getList(pos);
714
+ setTreeNode(pos, newNode);
715
+ setElementSize(pos, sz + 1);
716
+ }
717
+ if (FOLLY_UNLIKELY(sz > PruningSize)) {
718
+ startPruning(pos);
719
+ } else {
720
+ unlockNode(pos);
721
+ }
722
+ return true;
723
+ }
724
+ unlockNode(parent);
725
+ unlockNode(pos);
726
+ return false;
727
+ }
728
+
729
+ bool forceInsertToRoot(Node* newNode) {
730
+ Position pos;
731
+ pos.level = pos.index = 0;
732
+ std::unique_lock<Mutex> lck(
733
+ levels_[pos.level][pos.index].lock, std::try_to_lock);
734
+ if (!lck.owns_lock()) {
735
+ return false;
736
+ }
737
+ uint32_t sz = getElementSize(pos);
738
+ if (sz >= ListTargetSize) {
739
+ return false;
740
+ }
741
+
742
+ Node* curList = getList(pos);
743
+ if (curList == nullptr) {
744
+ newNode->next = nullptr;
745
+ setTreeNode(pos, newNode);
746
+ } else {
747
+ Node* p = curList;
748
+ if (p->val <= newNode->val) {
749
+ newNode->next = curList;
750
+ setTreeNode(pos, newNode);
751
+ } else {
752
+ while (p->next != nullptr && p->next->val >= newNode->val) {
753
+ p = p->next;
754
+ }
755
+ newNode->next = p->next;
756
+ p->next = newNode;
757
+ }
758
+ }
759
+ setElementSize(pos, sz + 1);
760
+ return true;
761
+ }
762
+
763
+ // This function forces the new node inserting to the current position
764
+ // if the element does not hold the enough nodes. It is safe to
765
+ // lock just one position to insert, because it won't be the first
766
+ // node to sustain the heap structure.
767
+ bool forceInsert(const Position& pos, const T& val, Node* newNode) {
768
+ if (isRoot(pos)) {
769
+ return forceInsertToRoot(newNode);
770
+ }
771
+
772
+ while (true) {
773
+ std::unique_lock<Mutex> lck(
774
+ levels_[pos.level][pos.index].lock, std::try_to_lock);
775
+ if (!lck.owns_lock()) {
776
+ if (getElementSize(pos) < ListTargetSize && readValue(pos) >= val) {
777
+ continue;
778
+ } else {
779
+ return false;
780
+ }
781
+ }
782
+ T nv = readValue(pos);
783
+ uint32_t sz = getElementSize(pos);
784
+ // do not allow the new node to be the first one
785
+ // do not allow the list size tooooo big
786
+ if (FOLLY_UNLIKELY(nv < val || sz >= ListTargetSize)) {
787
+ return false;
788
+ }
789
+
790
+ Node* p = getList(pos);
791
+ // find a place to insert the node
792
+ while (p->next != nullptr && p->next->val > val) {
793
+ p = p->next;
794
+ }
795
+ newNode->next = p->next;
796
+ p->next = newNode;
797
+ // do not forget to change the metadata
798
+ setElementSize(pos, sz + 1);
799
+ return true;
800
+ }
801
+ }
802
+
803
+ void binarySearchPosition(
804
+ Position& cur, const T& val, folly::hazptr_holder<Atom>& hptr) {
805
+ Position parent, mid;
806
+ if (cur.level == 0) {
807
+ return;
808
+ }
809
+ // start from the root
810
+ parent.level = parent.index = 0;
811
+
812
+ while (true) { // binary search
813
+ mid.level = (cur.level + parent.level) / 2;
814
+ mid.index = cur.index >> (cur.level - mid.level);
815
+
816
+ T mv = optimisticReadValue(mid, hptr);
817
+ if (val < mv) {
818
+ parent = mid;
819
+ } else {
820
+ cur = mid;
821
+ }
822
+
823
+ if (mid.level == 0 || // the root
824
+ ((parent.level + 1 == cur.level) && parent.level != 0)) {
825
+ return;
826
+ }
827
+ }
828
+ }
829
+
830
+ // The push keeps the length of each element stable
831
+ void moundPush(const T& val) {
832
+ Position cur;
833
+ folly::hazptr_holder<Atom> hptr = folly::make_hazard_pointer<Atom>();
834
+ Node* newNode = new Node;
835
+ newNode->val = val;
836
+ uint32_t seed = folly::Random::rand32() % (1 << 21);
837
+
838
+ while (true) {
839
+ // shell we go the fast path?
840
+ bool go_fast_path = false;
841
+ // chooice the right node to start
842
+ cur = selectPosition(val, go_fast_path, seed, hptr);
843
+ if (go_fast_path) {
844
+ if (FOLLY_LIKELY(forceInsert(cur, val, newNode))) {
845
+ if (MayBlock) {
846
+ blockingPushImpl();
847
+ }
848
+ return;
849
+ } else {
850
+ continue;
851
+ }
852
+ }
853
+
854
+ binarySearchPosition(cur, val, hptr);
855
+ if (FOLLY_LIKELY(regularInsert(cur, val, newNode))) {
856
+ if (MayBlock) {
857
+ blockingPushImpl();
858
+ }
859
+ return;
860
+ }
861
+ }
862
+ }
863
+
864
+ int popToSharedBuffer(const uint32_t rsize, Node* head) {
865
+ Position pos;
866
+ pos.level = pos.index = 0;
867
+
868
+ int num = std::min(rsize, (uint32_t)PopBatch);
869
+ for (int i = num - 1; i >= 0; i--) {
870
+ // wait until this block is empty
871
+ while (shared_buffer_[i].pnode.load(std::memory_order_relaxed) != nullptr)
872
+ ;
873
+ shared_buffer_[i].pnode.store(head, std::memory_order_relaxed);
874
+ head = head->next;
875
+ }
876
+ if (num > 0) {
877
+ top_loc_.store(num - 1, std::memory_order_release);
878
+ }
879
+ setTreeNode(pos, head);
880
+ return rsize - num;
881
+ }
882
+
883
+ void mergeDown(const Position& pos) {
884
+ if (isLeaf(pos)) {
885
+ unlockNode(pos);
886
+ return;
887
+ }
888
+
889
+ // acquire locks for L and R and compare
890
+ Position lchild = leftOf(pos);
891
+ Position rchild = rightOf(pos);
892
+ lockNode(lchild);
893
+ lockNode(rchild);
894
+ // read values
895
+ T nv = readValue(pos);
896
+ T lv = readValue(lchild);
897
+ T rv = readValue(rchild);
898
+ if (nv >= lv && nv >= rv) {
899
+ unlockNode(pos);
900
+ unlockNode(lchild);
901
+ unlockNode(rchild);
902
+ return;
903
+ }
904
+
905
+ // If two children contains nodes less than the
906
+ // threshold, we merge two children to the parent
907
+ // and do merge down on both of them.
908
+ size_t sum =
909
+ getElementSize(rchild) + getElementSize(lchild) + getElementSize(pos);
910
+ if (sum <= MergingSize) {
911
+ Node* l1 = mergeList(getList(rchild), getList(lchild));
912
+ setTreeNode(pos, mergeList(l1, getList(pos)));
913
+ setElementSize(pos, sum);
914
+ setTreeNode(lchild, nullptr);
915
+ setElementSize(lchild, 0);
916
+ setTreeNode(rchild, nullptr);
917
+ setElementSize(rchild, 0);
918
+ unlockNode(pos);
919
+ mergeDown(lchild);
920
+ mergeDown(rchild);
921
+ return;
922
+ }
923
+ // pull from right
924
+ if (rv >= lv && rv > nv) {
925
+ swapList(rchild, pos);
926
+ unlockNode(pos);
927
+ unlockNode(lchild);
928
+ mergeDown(rchild);
929
+ } else if (lv >= rv && lv > nv) {
930
+ // pull from left
931
+ swapList(lchild, pos);
932
+ unlockNode(pos);
933
+ unlockNode(rchild);
934
+ mergeDown(lchild);
935
+ }
936
+ }
937
+
938
+ bool deferSettingRootSize(Position& pos) {
939
+ if (isLeaf(pos)) {
940
+ setElementSize(pos, 0);
941
+ unlockNode(pos);
942
+ return true;
943
+ }
944
+
945
+ // acquire locks for L and R and compare
946
+ Position lchild = leftOf(pos);
947
+ Position rchild = rightOf(pos);
948
+ lockNode(lchild);
949
+ lockNode(rchild);
950
+ if (getElementSize(lchild) == 0 && getElementSize(rchild) == 0) {
951
+ setElementSize(pos, 0);
952
+ unlockNode(pos);
953
+ unlockNode(lchild);
954
+ unlockNode(rchild);
955
+ return true;
956
+ } else {
957
+ // read values
958
+ T lv = readValue(lchild);
959
+ T rv = readValue(rchild);
960
+ if (lv >= rv) {
961
+ swapList(lchild, pos);
962
+ setElementSize(lchild, 0);
963
+ unlockNode(pos);
964
+ unlockNode(rchild);
965
+ pos = lchild;
966
+ } else {
967
+ swapList(rchild, pos);
968
+ setElementSize(rchild, 0);
969
+ unlockNode(pos);
970
+ unlockNode(lchild);
971
+ pos = rchild;
972
+ }
973
+ return false;
974
+ }
975
+ }
976
+
977
+ bool moundPopMany(T& val) {
978
+ // pop from the root
979
+ Position pos;
980
+ pos.level = pos.index = 0;
981
+ // the root is nullptr, return false
982
+ Node* head = getList(pos);
983
+ if (head == nullptr) {
984
+ unlockNode(pos);
985
+ return false;
986
+ }
987
+
988
+ // shared buffer already filled by other threads
989
+ if (PopBatch > 0 && top_loc_.load(std::memory_order_acquire) >= 0) {
990
+ unlockNode(pos);
991
+ return false;
992
+ }
993
+
994
+ uint32_t sz = getElementSize(pos);
995
+ // get the one node first
996
+ val = head->val;
997
+ Node* p = head;
998
+ head = head->next;
999
+ sz--;
1000
+
1001
+ if (PopBatch > 0) {
1002
+ sz = popToSharedBuffer(sz, head);
1003
+ } else {
1004
+ setTreeNode(pos, head);
1005
+ }
1006
+
1007
+ bool done = false;
1008
+ if (FOLLY_LIKELY(sz == 0)) {
1009
+ done = deferSettingRootSize(pos);
1010
+ } else {
1011
+ setElementSize(pos, sz);
1012
+ }
1013
+
1014
+ if (FOLLY_LIKELY(!done)) {
1015
+ mergeDown(pos);
1016
+ }
1017
+
1018
+ p->retire();
1019
+ return true;
1020
+ }
1021
+
1022
+ void blockingPushImpl() {
1023
+ auto p = pticket_.fetch_add(1, std::memory_order_acq_rel);
1024
+ auto loc = getFutexArrayLoc(p);
1025
+ uint32_t curfutex = futex_array_[loc].load(std::memory_order_acquire);
1026
+
1027
+ while (true) {
1028
+ uint32_t ready = p << 1; // get the lower 31 bits
1029
+ // avoid the situation that push has larger ticket already set the value
1030
+ if (FOLLY_UNLIKELY(
1031
+ ready + 1 < curfutex ||
1032
+ ((curfutex > ready) && (curfutex - ready > 0x40000000)))) {
1033
+ return;
1034
+ }
1035
+
1036
+ if (futex_array_[loc].compare_exchange_strong(curfutex, ready)) {
1037
+ if (curfutex &
1038
+ 1) { // One or more consumers may be blocked on this futex
1039
+ detail::futexWake(&futex_array_[loc]);
1040
+ }
1041
+ return;
1042
+ } else {
1043
+ curfutex = futex_array_[loc].load(std::memory_order_acquire);
1044
+ }
1045
+ }
1046
+ }
1047
+
1048
+ // This could guarentee the Mound is empty
1049
+ FOLLY_ALWAYS_INLINE bool isMoundEmpty() {
1050
+ Position pos;
1051
+ pos.level = pos.index = 0;
1052
+ return getElementSize(pos) == 0;
1053
+ }
1054
+
1055
+ // Return true if the shared buffer is empty
1056
+ FOLLY_ALWAYS_INLINE bool isSharedBufferEmpty() {
1057
+ return top_loc_.load(std::memory_order_acquire) < 0;
1058
+ }
1059
+
1060
+ FOLLY_ALWAYS_INLINE bool isEmpty() {
1061
+ if (PopBatch > 0) {
1062
+ return isMoundEmpty() && isSharedBufferEmpty();
1063
+ }
1064
+ return isMoundEmpty();
1065
+ }
1066
+
1067
+ FOLLY_ALWAYS_INLINE bool futexIsReady(const size_t& curticket) {
1068
+ auto loc = getFutexArrayLoc(curticket);
1069
+ auto curfutex = futex_array_[loc].load(std::memory_order_acquire);
1070
+ uint32_t short_cticket = curticket & 0x7FFFFFFF;
1071
+ uint32_t futex_ready = curfutex >> 1;
1072
+ // handle unsigned 31 bits overflow
1073
+ return futex_ready >= short_cticket ||
1074
+ short_cticket - futex_ready > 0x40000000;
1075
+ }
1076
+
1077
+ template <typename Clock, typename Duration>
1078
+ FOLLY_NOINLINE bool trySpinBeforeBlock(
1079
+ const size_t& curticket,
1080
+ const std::chrono::time_point<Clock, Duration>& deadline,
1081
+ const folly::WaitOptions& opt = wait_options()) {
1082
+ return folly::detail::spin_pause_until(deadline, opt, [=] {
1083
+ return futexIsReady(curticket);
1084
+ }) == folly::detail::spin_result::success;
1085
+ }
1086
+
1087
+ void tryBlockingPop(const size_t& curticket) {
1088
+ auto loc = getFutexArrayLoc(curticket);
1089
+ auto curfutex = futex_array_[loc].load(std::memory_order_acquire);
1090
+ if (curfutex &
1091
+ 1) { /// The last round consumers are still waiting, go to sleep
1092
+ detail::futexWait(&futex_array_[loc], curfutex);
1093
+ }
1094
+ if (trySpinBeforeBlock(
1095
+ curticket,
1096
+ std::chrono::time_point<std::chrono::steady_clock>::max())) {
1097
+ return; /// Spin until the push ticket is ready
1098
+ }
1099
+ while (true) {
1100
+ curfutex = futex_array_[loc].load(std::memory_order_acquire);
1101
+ if (curfutex &
1102
+ 1) { /// The last round consumers are still waiting, go to sleep
1103
+ detail::futexWait(&futex_array_[loc], curfutex);
1104
+ } else if (!futexIsReady(curticket)) { // current ticket < pop ticket
1105
+ uint32_t blocking_futex = curfutex + 1;
1106
+ if (futex_array_[loc].compare_exchange_strong(
1107
+ curfutex, blocking_futex)) {
1108
+ detail::futexWait(&futex_array_[loc], blocking_futex);
1109
+ }
1110
+ } else {
1111
+ return;
1112
+ }
1113
+ }
1114
+ }
1115
+
1116
+ void blockingPopImpl() {
1117
+ auto ct = cticket_.fetch_add(1, std::memory_order_acq_rel);
1118
+ // fast path check
1119
+ if (futexIsReady(ct)) {
1120
+ return;
1121
+ }
1122
+ // Blocking
1123
+ tryBlockingPop(ct);
1124
+ }
1125
+
1126
+ bool tryPopFromMound(T& val) {
1127
+ if (isMoundEmpty()) {
1128
+ return false;
1129
+ }
1130
+ Position pos;
1131
+ pos.level = pos.index = 0;
1132
+
1133
+ // lock the root
1134
+ if (trylockNode(pos)) {
1135
+ return moundPopMany(val);
1136
+ }
1137
+ return false;
1138
+ }
1139
+
1140
+ FOLLY_ALWAYS_INLINE static folly::WaitOptions wait_options() { return {}; }
1141
+
1142
+ template <typename Clock, typename Duration>
1143
+ FOLLY_NOINLINE bool tryWait(
1144
+ const std::chrono::time_point<Clock, Duration>& deadline,
1145
+ const folly::WaitOptions& opt = wait_options()) {
1146
+ // Fast path, by quick check the status
1147
+ switch (folly::detail::spin_pause_until(
1148
+ deadline, opt, [=] { return !isEmpty(); })) {
1149
+ case folly::detail::spin_result::success:
1150
+ return true;
1151
+ case folly::detail::spin_result::timeout:
1152
+ return false;
1153
+ case folly::detail::spin_result::advance:
1154
+ break;
1155
+ }
1156
+
1157
+ // Spinning strategy
1158
+ while (true) {
1159
+ auto res =
1160
+ folly::detail::spin_yield_until(deadline, [=] { return !isEmpty(); });
1161
+ if (res == folly::detail::spin_result::success) {
1162
+ return true;
1163
+ } else if (res == folly::detail::spin_result::timeout) {
1164
+ return false;
1165
+ }
1166
+ }
1167
+ return true;
1168
+ }
1169
+
1170
+ bool tryPopFromSharedBuffer(T& val) {
1171
+ int get_or = -1;
1172
+ if (!isSharedBufferEmpty()) {
1173
+ get_or = top_loc_.fetch_sub(1, std::memory_order_acq_rel);
1174
+ if (get_or >= 0) {
1175
+ Node* c = shared_buffer_[get_or].pnode.load(std::memory_order_relaxed);
1176
+ shared_buffer_[get_or].pnode.store(nullptr, std::memory_order_release);
1177
+ val = c->val;
1178
+ c->retire();
1179
+ return true;
1180
+ }
1181
+ }
1182
+ return false;
1183
+ }
1184
+
1185
+ size_t getFutexArrayLoc(size_t s) {
1186
+ return ((s - 1) * Stride) & (NumFutex - 1);
1187
+ }
1188
+
1189
+ void moundPop(T& val) {
1190
+ if (MayBlock) {
1191
+ blockingPopImpl();
1192
+ }
1193
+
1194
+ if (PopBatch > 0) {
1195
+ if (tryPopFromSharedBuffer(val)) {
1196
+ return;
1197
+ }
1198
+ }
1199
+
1200
+ while (true) {
1201
+ if (FOLLY_LIKELY(tryPopFromMound(val))) {
1202
+ return;
1203
+ }
1204
+ tryWait(std::chrono::time_point<std::chrono::steady_clock>::max());
1205
+ if (PopBatch > 0 && tryPopFromSharedBuffer(val)) {
1206
+ return;
1207
+ }
1208
+ }
1209
+ }
1210
+ };
1211
+
1212
+ } // namespace folly