react-native-windows 0.81.32 → 0.81.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (891) hide show
  1. package/Directory.Build.props +2 -17
  2. package/Folly/ThreadNameStub.cpp +4 -6
  3. package/Microsoft.ReactNative/Fabric/Composition/BorderPrimitive.cpp +1 -1
  4. package/Microsoft.ReactNative/Fabric/Composition/CompositionEventHandler.cpp +27 -4
  5. package/Microsoft.ReactNative/Fabric/Composition/ScrollViewComponentView.cpp +8 -4
  6. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp +7 -3
  7. package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj +2 -8
  8. package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj.filters +0 -3
  9. package/Microsoft.ReactNative.Cxx/Microsoft.ReactNative.Cxx.vcxitems +2 -2
  10. package/PropertySheets/Bundle.props +3 -3
  11. package/PropertySheets/CIBuildOptimizations.props +2 -2
  12. package/PropertySheets/Generated/PackageVersion.g.props +3 -3
  13. package/PropertySheets/JSEngine.props +1 -1
  14. package/PropertySheets/NuGet.LockFile.props +2 -1
  15. package/PropertySheets/React.Cpp.props +4 -4
  16. package/ReactCommon/ReactCommon.vcxproj +0 -10
  17. package/ReactCommon/packages.lock.win32.json +0 -10
  18. package/Scripts/NuGetRestoreForceEvaluateAllSolutions.ps1 +61 -6
  19. package/Scripts/Tfs/Layout-Desktop-Headers.ps1 +4 -37
  20. package/Scripts/Warm-RnwFeedCache.ps1 +413 -0
  21. package/Scripts/creaternwapp.cmd +5 -1
  22. package/Scripts/creaternwlib.cmd +8 -2
  23. package/Shared/Shared.vcxitems +2 -0
  24. package/{Folly → external}/.clang-format +0 -1
  25. package/external/External.vcxitems +10 -0
  26. package/external/fast-float/.syncignore +11 -0
  27. package/external/fast-float/LICENSE-APACHE +190 -0
  28. package/external/fast-float/LICENSE-BOOST +23 -0
  29. package/external/fast-float/LICENSE-MIT +27 -0
  30. package/external/fast-float/cgmanifest.json +15 -0
  31. package/external/fast-float/fast-float.vcxitems +14 -0
  32. package/external/fast-float/include/fast_float/ascii_number.h +588 -0
  33. package/external/fast-float/include/fast_float/bigint.h +638 -0
  34. package/external/fast-float/include/fast_float/constexpr_feature_detect.h +46 -0
  35. package/external/fast-float/include/fast_float/decimal_to_binary.h +212 -0
  36. package/external/fast-float/include/fast_float/digit_comparison.h +457 -0
  37. package/external/fast-float/include/fast_float/fast_float.h +59 -0
  38. package/external/fast-float/include/fast_float/fast_table.h +708 -0
  39. package/external/fast-float/include/fast_float/float_common.h +1240 -0
  40. package/external/fast-float/include/fast_float/parse_number.h +399 -0
  41. package/external/fast-float/sync-config.json +8 -0
  42. package/external/fmt/.syncignore +12 -0
  43. package/external/fmt/CONTRIBUTING.md +20 -0
  44. package/external/fmt/LICENSE +27 -0
  45. package/{fmt → external/fmt}/cgmanifest.json +1 -1
  46. package/external/fmt/fmt.vcxitems +28 -0
  47. package/external/fmt/include/fmt/args.h +228 -0
  48. package/{fmt/TEMP_UntilFmtUpdate/core.h → external/fmt/include/fmt/base.h} +1188 -1036
  49. package/external/fmt/include/fmt/chrono.h +2432 -0
  50. package/external/fmt/include/fmt/color.h +612 -0
  51. package/external/fmt/include/fmt/compile.h +529 -0
  52. package/external/fmt/include/fmt/core.h +5 -0
  53. package/external/fmt/include/fmt/format-inl.h +1928 -0
  54. package/external/fmt/include/fmt/format.h +4427 -0
  55. package/external/fmt/include/fmt/os.h +439 -0
  56. package/external/fmt/include/fmt/ostream.h +211 -0
  57. package/external/fmt/include/fmt/printf.h +656 -0
  58. package/external/fmt/include/fmt/ranges.h +882 -0
  59. package/external/fmt/include/fmt/std.h +699 -0
  60. package/external/fmt/include/fmt/xchar.h +322 -0
  61. package/external/fmt/src/fmt.cc +135 -0
  62. package/external/fmt/src/format.cc +43 -0
  63. package/external/fmt/src/os.cc +403 -0
  64. package/external/fmt/sync-config.json +8 -0
  65. package/external/folly/.syncignore +61 -0
  66. package/external/folly/LICENSE +200 -0
  67. package/{fmt → external/folly/folly}/.clang-format +0 -1
  68. package/external/folly/folly/AtomicHashArray-inl.h +546 -0
  69. package/external/folly/folly/AtomicHashArray.h +431 -0
  70. package/external/folly/folly/AtomicHashMap-inl.h +653 -0
  71. package/external/folly/folly/AtomicHashMap.h +484 -0
  72. package/external/folly/folly/AtomicIntrusiveLinkedList.h +206 -0
  73. package/external/folly/folly/AtomicLinkedList.h +110 -0
  74. package/external/folly/folly/AtomicUnorderedMap.h +522 -0
  75. package/external/folly/folly/BUCK +1631 -0
  76. package/external/folly/folly/BUILD_MODE.bzl +72 -0
  77. package/external/folly/folly/Benchmark.cpp +986 -0
  78. package/external/folly/folly/Benchmark.h +680 -0
  79. package/external/folly/folly/BenchmarkUtil.h +47 -0
  80. package/external/folly/folly/Bits.h +17 -0
  81. package/external/folly/folly/CMakeLists.txt +110 -0
  82. package/external/folly/folly/CPortability.h +338 -0
  83. package/external/folly/folly/CancellationToken-inl.h +449 -0
  84. package/external/folly/folly/CancellationToken.cpp +250 -0
  85. package/external/folly/folly/CancellationToken.h +365 -0
  86. package/external/folly/folly/Chrono.h +132 -0
  87. package/external/folly/folly/ClockGettimeWrappers.cpp +93 -0
  88. package/external/folly/folly/ClockGettimeWrappers.h +29 -0
  89. package/external/folly/folly/ConcurrentBitSet.h +157 -0
  90. package/external/folly/folly/ConcurrentLazy.h +74 -0
  91. package/external/folly/folly/ConcurrentSkipList-inl.h +341 -0
  92. package/external/folly/folly/ConcurrentSkipList.h +824 -0
  93. package/external/folly/folly/ConstructorCallbackList.h +158 -0
  94. package/external/folly/folly/Conv.h +2026 -0
  95. package/external/folly/folly/CppAttributes.h +170 -0
  96. package/external/folly/folly/CpuId.h +297 -0
  97. package/external/folly/folly/DefaultKeepAliveExecutor.h +172 -0
  98. package/external/folly/folly/Demangle.cpp +255 -0
  99. package/external/folly/folly/Demangle.h +73 -0
  100. package/external/folly/folly/DiscriminatedPtr.h +236 -0
  101. package/external/folly/folly/DynamicConverter.h +17 -0
  102. package/external/folly/folly/Exception.h +150 -0
  103. package/external/folly/folly/ExceptionString.cpp +51 -0
  104. package/external/folly/folly/ExceptionString.h +33 -0
  105. package/external/folly/folly/ExceptionWrapper-inl.h +264 -0
  106. package/external/folly/folly/ExceptionWrapper.cpp +37 -0
  107. package/external/folly/folly/ExceptionWrapper.h +377 -0
  108. package/external/folly/folly/Executor.cpp +111 -0
  109. package/external/folly/folly/Executor.h +351 -0
  110. package/external/folly/folly/Expected.h +1725 -0
  111. package/external/folly/folly/FBString.h +2888 -0
  112. package/external/folly/folly/FBVector.h +17 -0
  113. package/external/folly/folly/File.cpp +180 -0
  114. package/external/folly/folly/File.h +177 -0
  115. package/external/folly/folly/FileUtil.cpp +378 -0
  116. package/external/folly/folly/FileUtil.h +332 -0
  117. package/external/folly/folly/Fingerprint.cpp +135 -0
  118. package/external/folly/folly/Fingerprint.h +289 -0
  119. package/external/folly/folly/FixedString.h +2965 -0
  120. package/external/folly/folly/FollyMemcpy.cpp +30 -0
  121. package/external/folly/folly/FollyMemcpy.h +23 -0
  122. package/external/folly/folly/FollyMemset.cpp +29 -0
  123. package/external/folly/folly/FollyMemset.h +25 -0
  124. package/external/folly/folly/Format-inl.h +1152 -0
  125. package/external/folly/folly/Format.cpp +429 -0
  126. package/external/folly/folly/Format.h +463 -0
  127. package/external/folly/folly/FormatArg.h +285 -0
  128. package/external/folly/folly/FormatTraits.h +65 -0
  129. package/external/folly/folly/Function.h +1159 -0
  130. package/external/folly/folly/GLog.h +85 -0
  131. package/external/folly/folly/GroupVarint.cpp +153 -0
  132. package/external/folly/folly/GroupVarint.h +630 -0
  133. package/external/folly/folly/Hash.h +20 -0
  134. package/external/folly/folly/IPAddress.cpp +490 -0
  135. package/external/folly/folly/IPAddress.h +667 -0
  136. package/external/folly/folly/IPAddressException.h +82 -0
  137. package/external/folly/folly/IPAddressV4.cpp +305 -0
  138. package/external/folly/folly/IPAddressV4.h +495 -0
  139. package/external/folly/folly/IPAddressV6.cpp +541 -0
  140. package/external/folly/folly/IPAddressV6.h +627 -0
  141. package/external/folly/folly/Indestructible.h +164 -0
  142. package/external/folly/folly/IndexedMemPool.h +550 -0
  143. package/external/folly/folly/IntrusiveList.h +17 -0
  144. package/external/folly/folly/Lazy.h +142 -0
  145. package/external/folly/folly/Likely.h +76 -0
  146. package/external/folly/folly/MPMCPipeline.h +280 -0
  147. package/external/folly/folly/MPMCQueue.h +1556 -0
  148. package/external/folly/folly/MacAddress.cpp +188 -0
  149. package/external/folly/folly/MacAddress.h +260 -0
  150. package/external/folly/folly/MapUtil.h +17 -0
  151. package/external/folly/folly/Math.h +258 -0
  152. package/external/folly/folly/MaybeManagedPtr.h +120 -0
  153. package/external/folly/folly/Memory.h +900 -0
  154. package/external/folly/folly/MicroLock.cpp +76 -0
  155. package/external/folly/folly/MicroLock.h +354 -0
  156. package/external/folly/folly/MicroSpinLock.h +17 -0
  157. package/external/folly/folly/MoveWrapper.h +76 -0
  158. package/external/folly/folly/ObserverContainer.h +1026 -0
  159. package/external/folly/folly/Optional.h +743 -0
  160. package/external/folly/folly/Overload.h +325 -0
  161. package/external/folly/folly/PackedSyncPtr.h +147 -0
  162. package/external/folly/folly/Padded.h +464 -0
  163. package/external/folly/folly/Poly-inl.h +230 -0
  164. package/external/folly/folly/Poly.h +1095 -0
  165. package/external/folly/folly/PolyException.h +43 -0
  166. package/external/folly/folly/Portability.h +644 -0
  167. package/external/folly/folly/Preprocessor.h +236 -0
  168. package/external/folly/folly/ProducerConsumerQueue.h +182 -0
  169. package/external/folly/folly/RWSpinLock.h +17 -0
  170. package/external/folly/folly/Random-inl.h +86 -0
  171. package/external/folly/folly/Random.cpp +184 -0
  172. package/external/folly/folly/Random.h +434 -0
  173. package/external/folly/folly/Range.h +1772 -0
  174. package/external/folly/folly/Replaceable.h +636 -0
  175. package/external/folly/folly/ScopeGuard.cpp +29 -0
  176. package/external/folly/folly/ScopeGuard.h +420 -0
  177. package/external/folly/folly/SharedMutex.cpp +81 -0
  178. package/external/folly/folly/SharedMutex.h +1751 -0
  179. package/external/folly/folly/Singleton-inl.h +332 -0
  180. package/external/folly/folly/Singleton.cpp +512 -0
  181. package/external/folly/folly/Singleton.h +891 -0
  182. package/external/folly/folly/SingletonThreadLocal.cpp +53 -0
  183. package/external/folly/folly/SingletonThreadLocal.h +263 -0
  184. package/external/folly/folly/SocketAddress.cpp +786 -0
  185. package/external/folly/folly/SocketAddress.h +768 -0
  186. package/external/folly/folly/SpinLock.h +55 -0
  187. package/external/folly/folly/String-inl.h +668 -0
  188. package/external/folly/folly/String.cpp +777 -0
  189. package/external/folly/folly/String.h +767 -0
  190. package/external/folly/folly/Subprocess.cpp +1142 -0
  191. package/external/folly/folly/Subprocess.h +1055 -0
  192. package/external/folly/folly/Synchronized.h +1833 -0
  193. package/external/folly/folly/SynchronizedPtr.h +106 -0
  194. package/external/folly/folly/ThreadCachedInt.h +175 -0
  195. package/external/folly/folly/ThreadLocal.h +478 -0
  196. package/external/folly/folly/TimeoutQueue.cpp +78 -0
  197. package/external/folly/folly/TimeoutQueue.h +123 -0
  198. package/external/folly/folly/TokenBucket.h +673 -0
  199. package/external/folly/folly/Traits.h +1442 -0
  200. package/external/folly/folly/Try-inl.h +372 -0
  201. package/external/folly/folly/Try.cpp +23 -0
  202. package/external/folly/folly/Try.h +728 -0
  203. package/external/folly/folly/UTF8String.h +56 -0
  204. package/external/folly/folly/Unicode.cpp +201 -0
  205. package/external/folly/folly/Unicode.h +94 -0
  206. package/external/folly/folly/Unit.h +65 -0
  207. package/external/folly/folly/Uri-inl.h +101 -0
  208. package/external/folly/folly/Uri.cpp +190 -0
  209. package/external/folly/folly/Uri.h +142 -0
  210. package/external/folly/folly/Utility.h +932 -0
  211. package/external/folly/folly/VERSION +1 -0
  212. package/external/folly/folly/Varint.h +230 -0
  213. package/external/folly/folly/VirtualExecutor.h +17 -0
  214. package/external/folly/folly/algorithm/simd/BUCK +47 -0
  215. package/external/folly/folly/algorithm/simd/Contains.cpp +42 -0
  216. package/external/folly/folly/algorithm/simd/Contains.h +116 -0
  217. package/external/folly/folly/algorithm/simd/FindFixed.h +301 -0
  218. package/external/folly/folly/algorithm/simd/Ignore.h +52 -0
  219. package/external/folly/folly/algorithm/simd/Movemask.h +207 -0
  220. package/external/folly/folly/algorithm/simd/detail/BUCK +70 -0
  221. package/external/folly/folly/algorithm/simd/detail/ContainsImpl.h +91 -0
  222. package/external/folly/folly/algorithm/simd/detail/SimdAnyOf.h +83 -0
  223. package/external/folly/folly/algorithm/simd/detail/SimdForEach.h +209 -0
  224. package/external/folly/folly/algorithm/simd/detail/SimdPlatform.h +445 -0
  225. package/external/folly/folly/algorithm/simd/detail/Traits.h +125 -0
  226. package/external/folly/folly/algorithm/simd/detail/UnrollUtils.h +126 -0
  227. package/external/folly/folly/base64.h +264 -0
  228. package/external/folly/folly/chrono/BUCK +29 -0
  229. package/external/folly/folly/chrono/Clock.h +65 -0
  230. package/external/folly/folly/chrono/Conv.h +712 -0
  231. package/external/folly/folly/chrono/test/BUCK +26 -0
  232. package/external/folly/folly/chrono/test/ClockTest.cpp +68 -0
  233. package/external/folly/folly/chrono/test/ConvTest.cpp +652 -0
  234. package/external/folly/folly/concurrency/AtomicSharedPtr.h +387 -0
  235. package/external/folly/folly/concurrency/BUCK +170 -0
  236. package/external/folly/folly/concurrency/CacheLocality.h +460 -0
  237. package/external/folly/folly/concurrency/ConcurrentHashMap.h +822 -0
  238. package/external/folly/folly/concurrency/CoreCachedSharedPtr.h +232 -0
  239. package/external/folly/folly/concurrency/DeadlockDetector.cpp +27 -0
  240. package/external/folly/folly/concurrency/DeadlockDetector.h +44 -0
  241. package/external/folly/folly/concurrency/DynamicBoundedQueue.h +751 -0
  242. package/external/folly/folly/concurrency/PriorityUnboundedQueueSet.h +207 -0
  243. package/external/folly/folly/concurrency/ProcessLocalUniqueId.cpp +46 -0
  244. package/external/folly/folly/concurrency/ProcessLocalUniqueId.h +38 -0
  245. package/external/folly/folly/concurrency/SingletonRelaxedCounter.h +325 -0
  246. package/external/folly/folly/concurrency/ThreadCachedSynchronized.h +227 -0
  247. package/external/folly/folly/concurrency/UnboundedQueue.h +891 -0
  248. package/external/folly/folly/concurrency/container/BUCK +77 -0
  249. package/external/folly/folly/concurrency/container/FlatCombiningPriorityQueue.h +426 -0
  250. package/external/folly/folly/concurrency/container/LockFreeRingBuffer.h +306 -0
  251. package/external/folly/folly/concurrency/container/RelaxedConcurrentPriorityQueue.h +1212 -0
  252. package/external/folly/folly/concurrency/container/SingleWriterFixedHashMap.h +322 -0
  253. package/external/folly/folly/concurrency/container/atomic_grow_array.h +564 -0
  254. package/external/folly/folly/concurrency/container/test/BUCK +75 -0
  255. package/external/folly/folly/concurrency/container/test/FlatCombiningPriorityQueueTest.cpp +570 -0
  256. package/external/folly/folly/concurrency/container/test/LockFreeRingBufferTest.cpp +276 -0
  257. package/external/folly/folly/concurrency/container/test/RelaxedConcurrentPriorityQueueTest.cpp +1570 -0
  258. package/external/folly/folly/concurrency/container/test/SingleWriterFixedHashMapTest.cpp +401 -0
  259. package/external/folly/folly/concurrency/container/test/atomic_grow_array_test.cpp +187 -0
  260. package/external/folly/folly/concurrency/detail/AtomicSharedPtr-detail.h +212 -0
  261. package/external/folly/folly/concurrency/detail/ConcurrentHashMap-detail.h +1911 -0
  262. package/external/folly/folly/concurrency/memory/AtomicReadMostlyMainPtr.cpp +43 -0
  263. package/external/folly/folly/concurrency/memory/AtomicReadMostlyMainPtr.h +190 -0
  264. package/external/folly/folly/concurrency/memory/BUCK +53 -0
  265. package/external/folly/folly/concurrency/memory/PrimaryPtr.h +338 -0
  266. package/external/folly/folly/concurrency/memory/ReadMostlySharedPtr.h +511 -0
  267. package/external/folly/folly/concurrency/memory/TLRefCount.h +228 -0
  268. package/external/folly/folly/concurrency/memory/test/AtomicReadMostlyMainPtrBenchmark.cpp +56 -0
  269. package/external/folly/folly/concurrency/memory/test/AtomicReadMostlyMainPtrTest.cpp +454 -0
  270. package/external/folly/folly/concurrency/memory/test/BUCK +95 -0
  271. package/external/folly/folly/concurrency/memory/test/PrimaryPtrTest.cpp +303 -0
  272. package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrBenchmark.cpp +138 -0
  273. package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrStressTest.cpp +75 -0
  274. package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrTest.cpp +378 -0
  275. package/external/folly/folly/concurrency/memory/test/RefCountBenchmark.cpp +90 -0
  276. package/external/folly/folly/concurrency/memory/test/RefCountTest.cpp +168 -0
  277. package/external/folly/folly/concurrency/test/AtomicSharedPtrCounted.h +156 -0
  278. package/external/folly/folly/concurrency/test/AtomicSharedPtrPerformance.cpp +255 -0
  279. package/external/folly/folly/concurrency/test/AtomicSharedPtrTest.cpp +257 -0
  280. package/external/folly/folly/concurrency/test/BUCK +229 -0
  281. package/external/folly/folly/concurrency/test/CacheLocalityBenchmark.cpp +392 -0
  282. package/external/folly/folly/concurrency/test/CacheLocalityTest.cpp +1229 -0
  283. package/external/folly/folly/concurrency/test/ConcurrentHashMapBench.cpp +260 -0
  284. package/external/folly/folly/concurrency/test/ConcurrentHashMapTest.cpp +1242 -0
  285. package/external/folly/folly/concurrency/test/CoreCachedSharedPtrTest.cpp +408 -0
  286. package/external/folly/folly/concurrency/test/DynamicBoundedQueueTest.cpp +984 -0
  287. package/external/folly/folly/concurrency/test/PriorityUnboundedQueueSetTest.cpp +73 -0
  288. package/external/folly/folly/concurrency/test/ProcessLocalUniqueIdTest.cpp +66 -0
  289. package/external/folly/folly/concurrency/test/SingletonRelaxedCounterBench.cpp +101 -0
  290. package/external/folly/folly/concurrency/test/SingletonRelaxedCounterTest.cpp +185 -0
  291. package/external/folly/folly/concurrency/test/ThreadCachedSynchronizedBench.cpp +76 -0
  292. package/external/folly/folly/concurrency/test/ThreadCachedSynchronizedTest.cpp +93 -0
  293. package/external/folly/folly/concurrency/test/UnboundedQueueTest.cpp +1302 -0
  294. package/external/folly/folly/container/Access.h +57 -0
  295. package/external/folly/folly/container/Array.h +87 -0
  296. package/external/folly/folly/container/BUCK +353 -0
  297. package/external/folly/folly/container/BitIterator.h +203 -0
  298. package/external/folly/folly/container/Enumerate.h +162 -0
  299. package/external/folly/folly/container/EvictingCacheMap.h +730 -0
  300. package/external/folly/folly/container/F14.md +300 -0
  301. package/external/folly/folly/container/F14Map-fwd.h +113 -0
  302. package/external/folly/folly/container/F14Map.h +2108 -0
  303. package/external/folly/folly/container/F14Set-fwd.h +95 -0
  304. package/external/folly/folly/container/F14Set.h +1603 -0
  305. package/external/folly/folly/container/FBVector.h +1711 -0
  306. package/external/folly/folly/container/Foreach-inl.h +316 -0
  307. package/external/folly/folly/container/Foreach.h +209 -0
  308. package/external/folly/folly/container/HeterogeneousAccess-fwd.h +33 -0
  309. package/external/folly/folly/container/HeterogeneousAccess.h +171 -0
  310. package/external/folly/folly/container/IntrusiveHeap.h +268 -0
  311. package/external/folly/folly/container/IntrusiveList.h +131 -0
  312. package/external/folly/folly/container/Iterator.h +843 -0
  313. package/external/folly/folly/container/MapUtil.h +376 -0
  314. package/external/folly/folly/container/Merge.h +90 -0
  315. package/external/folly/folly/container/RegexMatchCache.cpp +521 -0
  316. package/external/folly/folly/container/RegexMatchCache.h +699 -0
  317. package/external/folly/folly/container/Reserve.h +109 -0
  318. package/external/folly/folly/container/SparseByteSet.h +123 -0
  319. package/external/folly/folly/container/View.h +81 -0
  320. package/external/folly/folly/container/WeightedEvictingCacheMap.h +651 -0
  321. package/external/folly/folly/container/detail/BUCK +115 -0
  322. package/external/folly/folly/container/detail/BitIteratorDetail.h +87 -0
  323. package/external/folly/folly/container/detail/F14Defaults.h +34 -0
  324. package/external/folly/folly/container/detail/F14IntrinsicsAvailability.h +67 -0
  325. package/external/folly/folly/container/detail/F14MapFallback.h +717 -0
  326. package/external/folly/folly/container/detail/F14Mask.h +235 -0
  327. package/external/folly/folly/container/detail/F14Policy.h +1523 -0
  328. package/external/folly/folly/container/detail/F14SetFallback.h +528 -0
  329. package/external/folly/folly/container/detail/F14Table.cpp +71 -0
  330. package/external/folly/folly/container/detail/F14Table.h +2680 -0
  331. package/external/folly/folly/container/detail/Util.h +303 -0
  332. package/external/folly/folly/container/detail/tape_detail.h +135 -0
  333. package/external/folly/folly/container/detail/test/BUCK +14 -0
  334. package/external/folly/folly/container/detail/test/F14DetailTest.cpp +47 -0
  335. package/external/folly/folly/container/heap_vector_types.h +1683 -0
  336. package/external/folly/folly/container/range_traits.h +81 -0
  337. package/external/folly/folly/container/small_vector.h +1476 -0
  338. package/external/folly/folly/container/sorted_vector_types.h +1652 -0
  339. package/external/folly/folly/container/span.h +408 -0
  340. package/external/folly/folly/container/tape.h +608 -0
  341. package/external/folly/folly/container/test/.clang-tidy +12 -0
  342. package/external/folly/folly/container/test/AccessTest.cpp +138 -0
  343. package/external/folly/folly/container/test/ArrayTest.cpp +84 -0
  344. package/external/folly/folly/container/test/BUCK +568 -0
  345. package/external/folly/folly/container/test/BitIteratorBench.cpp +112 -0
  346. package/external/folly/folly/container/test/BitIteratorTest.cpp +109 -0
  347. package/external/folly/folly/container/test/EnumerateTest.cpp +294 -0
  348. package/external/folly/folly/container/test/EvictingCacheMapBench.cpp +80 -0
  349. package/external/folly/folly/container/test/EvictingCacheMapTest.cpp +842 -0
  350. package/external/folly/folly/container/test/F14AsanSupportTest.cpp +143 -0
  351. package/external/folly/folly/container/test/F14FwdTest.cpp +37 -0
  352. package/external/folly/folly/container/test/F14InterprocessTest.cpp +404 -0
  353. package/external/folly/folly/container/test/F14MapTest.cpp +2543 -0
  354. package/external/folly/folly/container/test/F14PolicyTest.cpp +49 -0
  355. package/external/folly/folly/container/test/F14SetTest.cpp +1738 -0
  356. package/external/folly/folly/container/test/F14SmallOverheads.cpp +215 -0
  357. package/external/folly/folly/container/test/F14TestUtil.h +117 -0
  358. package/external/folly/folly/container/test/FBVectorBenchmark.cpp +380 -0
  359. package/external/folly/folly/container/test/FBVectorBenchmarks.cpp.h +100 -0
  360. package/external/folly/folly/container/test/FBVectorTest.cpp +326 -0
  361. package/external/folly/folly/container/test/FBVectorTests.cpp.h +304 -0
  362. package/external/folly/folly/container/test/ForeachBenchmark.cpp +388 -0
  363. package/external/folly/folly/container/test/ForeachTest.cpp +338 -0
  364. package/external/folly/folly/container/test/HashMapsBench.cpp +458 -0
  365. package/external/folly/folly/container/test/HeterogeneousAccessTest.cpp +242 -0
  366. package/external/folly/folly/container/test/IntrusiveHeapTest.cpp +262 -0
  367. package/external/folly/folly/container/test/IteratorTest.cpp +989 -0
  368. package/external/folly/folly/container/test/MapUtilTest.cpp +365 -0
  369. package/external/folly/folly/container/test/MergeTest.cpp +66 -0
  370. package/external/folly/folly/container/test/RegexMatchCacheTest.cpp +634 -0
  371. package/external/folly/folly/container/test/ReserveTest.cpp +173 -0
  372. package/external/folly/folly/container/test/SparseByteSetBenchmark.cpp +153 -0
  373. package/external/folly/folly/container/test/SparseByteSetTest.cpp +117 -0
  374. package/external/folly/folly/container/test/TrackingTypes.h +584 -0
  375. package/external/folly/folly/container/test/UtilTest.cpp +609 -0
  376. package/external/folly/folly/container/test/WeightedEvictingCacheMapTest.cpp +800 -0
  377. package/external/folly/folly/container/test/heap_vector_types_test.cpp +1774 -0
  378. package/external/folly/folly/container/test/range_traits_test.cpp +59 -0
  379. package/external/folly/folly/container/test/small_vector_test.cpp +1571 -0
  380. package/external/folly/folly/container/test/sorted_vector_test.cpp +1589 -0
  381. package/external/folly/folly/container/test/span_test.cpp +520 -0
  382. package/external/folly/folly/container/test/tape_bench.cpp +200 -0
  383. package/external/folly/folly/container/test/tape_test.cpp +590 -0
  384. package/external/folly/folly/defs.bzl +238 -0
  385. package/external/folly/folly/detail/AsyncTrace.cpp +36 -0
  386. package/external/folly/folly/detail/AsyncTrace.h +44 -0
  387. package/external/folly/folly/detail/AtomicHashUtils.h +42 -0
  388. package/external/folly/folly/detail/AtomicUnorderedMapUtils.h +80 -0
  389. package/external/folly/folly/detail/BUCK +406 -0
  390. package/external/folly/folly/detail/DiscriminatedPtrDetail.h +172 -0
  391. package/external/folly/folly/detail/FileUtilDetail.cpp +63 -0
  392. package/external/folly/folly/detail/FileUtilDetail.h +85 -0
  393. package/external/folly/folly/detail/FileUtilVectorDetail.h +81 -0
  394. package/external/folly/folly/detail/FingerprintPolynomial.h +132 -0
  395. package/external/folly/folly/detail/Futex-inl.h +123 -0
  396. package/external/folly/folly/detail/Futex.cpp +273 -0
  397. package/external/folly/folly/detail/Futex.h +109 -0
  398. package/external/folly/folly/detail/GroupVarintDetail.h +101 -0
  399. package/external/folly/folly/detail/IPAddress.cpp +37 -0
  400. package/external/folly/folly/detail/IPAddress.h +57 -0
  401. package/external/folly/folly/detail/IPAddressSource.h +278 -0
  402. package/external/folly/folly/detail/Iterators.h +156 -0
  403. package/external/folly/folly/detail/MPMCPipelineDetail.h +122 -0
  404. package/external/folly/folly/detail/MemoryIdler.cpp +233 -0
  405. package/external/folly/folly/detail/MemoryIdler.h +216 -0
  406. package/external/folly/folly/detail/PerfScoped.cpp +112 -0
  407. package/external/folly/folly/detail/PerfScoped.h +70 -0
  408. package/external/folly/folly/detail/PolyDetail.h +921 -0
  409. package/external/folly/folly/detail/RangeCommon.cpp +55 -0
  410. package/external/folly/folly/detail/RangeCommon.h +93 -0
  411. package/external/folly/folly/detail/RangeSse42.cpp +198 -0
  412. package/external/folly/folly/detail/RangeSse42.h +30 -0
  413. package/external/folly/folly/detail/SimpleSimdStringUtils.cpp +31 -0
  414. package/external/folly/folly/detail/SimpleSimdStringUtils.h +27 -0
  415. package/external/folly/folly/detail/SimpleSimdStringUtilsImpl.h +63 -0
  416. package/external/folly/folly/detail/Singleton.h +34 -0
  417. package/external/folly/folly/detail/SlowFingerprint.h +90 -0
  418. package/external/folly/folly/detail/SocketFastOpen.cpp +175 -0
  419. package/external/folly/folly/detail/SocketFastOpen.h +89 -0
  420. package/external/folly/folly/detail/SplitStringSimd.cpp +84 -0
  421. package/external/folly/folly/detail/SplitStringSimd.h +151 -0
  422. package/external/folly/folly/detail/SplitStringSimdImpl.h +149 -0
  423. package/external/folly/folly/detail/Sse.cpp +35 -0
  424. package/external/folly/folly/detail/Sse.h +45 -0
  425. package/external/folly/folly/detail/StaticSingletonManager.cpp +119 -0
  426. package/external/folly/folly/detail/StaticSingletonManager.h +298 -0
  427. package/external/folly/folly/detail/ThreadLocalDetail.cpp +492 -0
  428. package/external/folly/folly/detail/ThreadLocalDetail.h +800 -0
  429. package/external/folly/folly/detail/TrapOnAvx512.cpp +41 -0
  430. package/external/folly/folly/detail/TrapOnAvx512.h +21 -0
  431. package/external/folly/folly/detail/TurnSequencer.h +295 -0
  432. package/external/folly/folly/detail/TypeList.h +551 -0
  433. package/external/folly/folly/detail/UniqueInstance.cpp +136 -0
  434. package/external/folly/folly/detail/UniqueInstance.h +68 -0
  435. package/external/folly/folly/detail/base64_detail/BUCK +102 -0
  436. package/external/folly/folly/detail/base64_detail/Base64Api.cpp +40 -0
  437. package/external/folly/folly/detail/base64_detail/Base64Api.h +101 -0
  438. package/external/folly/folly/detail/base64_detail/Base64Common.h +80 -0
  439. package/external/folly/folly/detail/base64_detail/Base64Constants.h +79 -0
  440. package/external/folly/folly/detail/base64_detail/Base64HiddenConstants.h +129 -0
  441. package/external/folly/folly/detail/base64_detail/Base64SWAR.cpp +161 -0
  442. package/external/folly/folly/detail/base64_detail/Base64SWAR.h +32 -0
  443. package/external/folly/folly/detail/base64_detail/Base64Scalar.h +262 -0
  444. package/external/folly/folly/detail/base64_detail/Base64Simd.h +102 -0
  445. package/external/folly/folly/detail/base64_detail/Base64_SSE4_2.cpp +42 -0
  446. package/external/folly/folly/detail/base64_detail/Base64_SSE4_2.h +33 -0
  447. package/external/folly/folly/detail/base64_detail/Base64_SSE4_2_Platform.h +167 -0
  448. package/external/folly/folly/detail/base64_detail/README.md +392 -0
  449. package/external/folly/folly/detail/base64_detail/tests/BUCK +36 -0
  450. package/external/folly/folly/detail/base64_detail/tests/Base64AgainstScalarTest.cpp +141 -0
  451. package/external/folly/folly/detail/base64_detail/tests/Base64PlatformTest.cpp +273 -0
  452. package/external/folly/folly/detail/base64_detail/tests/Base64SpecialCasesTest.cpp +555 -0
  453. package/external/folly/folly/detail/test/AsyncTraceTest.cpp +43 -0
  454. package/external/folly/folly/detail/test/BUCK +118 -0
  455. package/external/folly/folly/detail/test/FileUtilDetailTest.cpp +56 -0
  456. package/external/folly/folly/detail/test/PerfScopedTest.cpp +107 -0
  457. package/external/folly/folly/detail/test/SimpleSimdStringUtilsTest.cpp +92 -0
  458. package/external/folly/folly/detail/test/SplitStringSimdTest.cpp +242 -0
  459. package/external/folly/folly/detail/test/StaticSingletonManagerTest.cpp +121 -0
  460. package/external/folly/folly/detail/test/ThreadLocalBenchmark.cpp +116 -0
  461. package/external/folly/folly/detail/test/ThreadLocalDetailTest.cpp +194 -0
  462. package/external/folly/folly/detail/test/TrapOnAvx512TestNegative.cpp +29 -0
  463. package/external/folly/folly/detail/test/UniqueInstanceTest.cpp +60 -0
  464. package/external/folly/folly/detail/thread_local_globals.cpp +69 -0
  465. package/external/folly/folly/detail/thread_local_globals.h +36 -0
  466. package/external/folly/folly/dynamic-inl.h +17 -0
  467. package/external/folly/folly/dynamic.h +17 -0
  468. package/external/folly/folly/folly_extended_library.bzl +28 -0
  469. package/external/folly/folly/functional/ApplyTuple.h +204 -0
  470. package/external/folly/folly/functional/BUCK +57 -0
  471. package/external/folly/folly/functional/Invoke.h +880 -0
  472. package/external/folly/folly/functional/Partial.h +130 -0
  473. package/external/folly/folly/functional/protocol.h +203 -0
  474. package/external/folly/folly/functional/test/ApplyTupleTest.cpp +549 -0
  475. package/external/folly/folly/functional/test/BUCK +57 -0
  476. package/external/folly/folly/functional/test/InvokeTest.cpp +483 -0
  477. package/external/folly/folly/functional/test/PartialTest.cpp +141 -0
  478. package/external/folly/folly/functional/test/protocol_test.cpp +177 -0
  479. package/external/folly/folly/functional/test/traits_test.cpp +551 -0
  480. package/external/folly/folly/functional/traits.h +675 -0
  481. package/external/folly/folly/hash/BUCK +86 -0
  482. package/external/folly/folly/hash/Checksum.cpp +275 -0
  483. package/external/folly/folly/hash/Checksum.h +94 -0
  484. package/external/folly/folly/hash/FarmHash.h +46 -0
  485. package/external/folly/folly/hash/Hash.h +1045 -0
  486. package/external/folly/folly/hash/MurmurHash.h +86 -0
  487. package/external/folly/folly/hash/SpookyHashV1.cpp +391 -0
  488. package/external/folly/folly/hash/SpookyHashV1.h +307 -0
  489. package/external/folly/folly/hash/SpookyHashV2.cpp +392 -0
  490. package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/hash/SpookyHashV2.h +6 -1
  491. package/external/folly/folly/hash/detail/BUCK +26 -0
  492. package/external/folly/folly/hash/detail/ChecksumDetail.cpp +296 -0
  493. package/external/folly/folly/hash/detail/ChecksumDetail.h +137 -0
  494. package/external/folly/folly/hash/detail/Crc32CombineDetail.cpp +191 -0
  495. package/external/folly/folly/hash/detail/Crc32cDetail.cpp +303 -0
  496. package/external/folly/folly/hash/test/BUCK +132 -0
  497. package/external/folly/folly/hash/test/ChecksumBenchmark.cpp +91 -0
  498. package/external/folly/folly/hash/test/ChecksumTest.cpp +587 -0
  499. package/external/folly/folly/hash/test/FarmHashTest.cpp +41 -0
  500. package/external/folly/folly/hash/test/HashBenchmark.cpp +238 -0
  501. package/external/folly/folly/hash/test/HashTest.cpp +997 -0
  502. package/external/folly/folly/hash/test/MurmurHashTest.cpp +76 -0
  503. package/external/folly/folly/hash/test/SpookyHashV1Test.cpp +559 -0
  504. package/external/folly/folly/hash/test/SpookyHashV2Test.cpp +549 -0
  505. package/external/folly/folly/hash/test/traits_test.cpp +69 -0
  506. package/external/folly/folly/hash/traits.h +115 -0
  507. package/external/folly/folly/json/BUCK +155 -0
  508. package/external/folly/folly/json/DynamicConverter.h +464 -0
  509. package/external/folly/folly/json/DynamicParser-inl.h +316 -0
  510. package/external/folly/folly/json/DynamicParser.cpp +198 -0
  511. package/external/folly/folly/json/DynamicParser.h +394 -0
  512. package/external/folly/folly/json/JSONSchema.cpp +1030 -0
  513. package/external/folly/folly/json/JSONSchema.h +73 -0
  514. package/external/folly/folly/json/JsonMockUtil.h +73 -0
  515. package/external/folly/folly/json/JsonTestUtil.cpp +167 -0
  516. package/external/folly/folly/json/JsonTestUtil.h +88 -0
  517. package/external/folly/folly/json/bser/BUCK +24 -0
  518. package/external/folly/folly/json/bser/Bser.h +107 -0
  519. package/external/folly/folly/json/bser/Dump.cpp +253 -0
  520. package/external/folly/folly/json/bser/Load.cpp +246 -0
  521. package/external/folly/folly/json/bser/test/BUCK +14 -0
  522. package/external/folly/folly/json/bser/test/BserTest.cpp +149 -0
  523. package/external/folly/folly/json/dynamic.cpp +552 -0
  524. package/external/folly/folly/json/dynamic.h +1346 -0
  525. package/external/folly/folly/json/json.h +238 -0
  526. package/external/folly/folly/json/json_patch.cpp +325 -0
  527. package/external/folly/folly/json/json_patch.h +126 -0
  528. package/external/folly/folly/json/json_pointer.cpp +114 -0
  529. package/external/folly/folly/json/json_pointer.h +87 -0
  530. package/external/folly/folly/json/test/BUCK +147 -0
  531. package/external/folly/folly/json/test/DynamicBenchmark.cpp +146 -0
  532. package/external/folly/folly/json/test/DynamicConverterTest.cpp +518 -0
  533. package/external/folly/folly/json/test/DynamicOtherTest.cpp +344 -0
  534. package/external/folly/folly/json/test/DynamicParserTest.cpp +443 -0
  535. package/external/folly/folly/json/test/DynamicTest.cpp +1647 -0
  536. package/external/folly/folly/json/test/JSONSchemaTest.cpp +450 -0
  537. package/external/folly/folly/json/test/JsonBenchmark.cpp +264 -0
  538. package/external/folly/folly/json/test/JsonOtherTest.cpp +51 -0
  539. package/external/folly/folly/json/test/JsonTest.cpp +1153 -0
  540. package/external/folly/folly/json/test/JsonTestUtilTest.cpp +97 -0
  541. package/external/folly/folly/json/test/json_patch_test.cpp +361 -0
  542. package/external/folly/folly/json/test/json_pointer_test.cpp +58 -0
  543. package/external/folly/folly/json/tool/BUCK +13 -0
  544. package/external/folly/folly/json/tool/JSONSchemaTester.cpp +58 -0
  545. package/external/folly/folly/json.h +17 -0
  546. package/external/folly/folly/json_patch.h +17 -0
  547. package/external/folly/folly/json_pointer.h +17 -0
  548. package/external/folly/folly/lang/Access.h +29 -0
  549. package/external/folly/folly/lang/Align.h +240 -0
  550. package/external/folly/folly/lang/Aligned.h +92 -0
  551. package/external/folly/folly/lang/Assume.h +82 -0
  552. package/external/folly/folly/lang/BUCK +287 -0
  553. package/external/folly/folly/lang/Badge.h +108 -0
  554. package/external/folly/folly/lang/Bits.h +570 -0
  555. package/external/folly/folly/lang/BitsClass.h +312 -0
  556. package/external/folly/folly/lang/Builtin.h +74 -0
  557. package/external/folly/folly/lang/CArray.h +34 -0
  558. package/external/folly/folly/lang/CString.cpp +86 -0
  559. package/external/folly/folly/lang/CString.h +55 -0
  560. package/external/folly/folly/lang/Cast.h +51 -0
  561. package/external/folly/folly/lang/CheckedMath.h +253 -0
  562. package/external/folly/folly/lang/CustomizationPoint.h +58 -0
  563. package/external/folly/folly/lang/Exception.cpp +822 -0
  564. package/external/folly/folly/lang/Exception.h +716 -0
  565. package/external/folly/folly/lang/Extern.h +55 -0
  566. package/external/folly/folly/lang/Hint-inl.h +144 -0
  567. package/external/folly/folly/lang/Hint.h +238 -0
  568. package/external/folly/folly/lang/Keep.h +98 -0
  569. package/external/folly/folly/lang/New.h +124 -0
  570. package/external/folly/folly/lang/Ordering.h +140 -0
  571. package/external/folly/folly/lang/Pretty.h +159 -0
  572. package/external/folly/folly/lang/PropagateConst.h +413 -0
  573. package/external/folly/folly/lang/RValueReferenceWrapper.h +152 -0
  574. package/external/folly/folly/lang/SafeAssert.cpp +589 -0
  575. package/external/folly/folly/lang/StaticConst.h +33 -0
  576. package/external/folly/folly/lang/Thunk.h +100 -0
  577. package/external/folly/folly/lang/TypeInfo.h +58 -0
  578. package/external/folly/folly/lang/UncaughtExceptions.cpp +17 -0
  579. package/external/folly/folly/lang/UncaughtExceptions.h +19 -0
  580. package/external/folly/folly/lang/test/AlignTest.cpp +87 -0
  581. package/external/folly/folly/lang/test/AlignedTest.cpp +130 -0
  582. package/external/folly/folly/lang/test/BUCK +258 -0
  583. package/external/folly/folly/lang/test/BadgeTest.cpp +89 -0
  584. package/external/folly/folly/lang/test/BitsBenchmark.cpp +164 -0
  585. package/external/folly/folly/lang/test/BitsClassBenchmark.cpp +122 -0
  586. package/external/folly/folly/lang/test/BitsClassTest.cpp +379 -0
  587. package/external/folly/folly/lang/test/BitsTest.cpp +577 -0
  588. package/external/folly/folly/lang/test/CStringTest.cpp +60 -0
  589. package/external/folly/folly/lang/test/CastTest.cpp +47 -0
  590. package/external/folly/folly/lang/test/CheckedMathTest.cpp +394 -0
  591. package/external/folly/folly/lang/test/ExceptionBench.cpp +427 -0
  592. package/external/folly/folly/lang/test/ExceptionTest.cpp +413 -0
  593. package/external/folly/folly/lang/test/ExternTest.cpp +39 -0
  594. package/external/folly/folly/lang/test/HintTest.cpp +100 -0
  595. package/external/folly/folly/lang/test/NewTest.cpp +38 -0
  596. package/external/folly/folly/lang/test/OrderingTest.cpp +105 -0
  597. package/external/folly/folly/lang/test/PrettyTest.cpp +44 -0
  598. package/external/folly/folly/lang/test/PropagateConstTest.cpp +356 -0
  599. package/external/folly/folly/lang/test/RValueReferenceWrapperTest.cpp +85 -0
  600. package/external/folly/folly/lang/test/SafeAssertTest.cpp +75 -0
  601. package/external/folly/folly/lang/test/ThunkTest.cpp +105 -0
  602. package/external/folly/folly/lang/test/ToAsciiBench.cpp +466 -0
  603. package/external/folly/folly/lang/test/ToAsciiTest.cpp +266 -0
  604. package/external/folly/folly/lang/test/TypeInfoTest.cpp +56 -0
  605. package/external/folly/folly/memcpy.S +292 -0
  606. package/external/folly/folly/memcpy_select_aarch64.cpp +145 -0
  607. package/external/folly/folly/memory/Arena-inl.h +83 -0
  608. package/external/folly/folly/memory/Arena.h +325 -0
  609. package/external/folly/folly/memory/BUCK +191 -0
  610. package/external/folly/folly/memory/JemallocHugePageAllocator.cpp +449 -0
  611. package/external/folly/folly/memory/JemallocHugePageAllocator.h +105 -0
  612. package/external/folly/folly/memory/JemallocHugePageAllocatorTest.cpp +341 -0
  613. package/external/folly/folly/memory/JemallocNodumpAllocator.cpp +176 -0
  614. package/external/folly/folly/memory/JemallocNodumpAllocator.h +119 -0
  615. package/external/folly/folly/memory/JemallocNodumpAllocatorTest.cpp +61 -0
  616. package/external/folly/folly/memory/MallctlHelper.cpp +37 -0
  617. package/external/folly/folly/memory/MallctlHelper.h +167 -0
  618. package/external/folly/folly/memory/Malloc.h +551 -0
  619. package/external/folly/folly/memory/MemoryResource.h +57 -0
  620. package/external/folly/folly/memory/ReentrantAllocator.cpp +162 -0
  621. package/external/folly/folly/memory/ReentrantAllocator.h +261 -0
  622. package/external/folly/folly/memory/SanitizeAddress.cpp +75 -0
  623. package/external/folly/folly/memory/SanitizeAddress.h +117 -0
  624. package/external/folly/folly/memory/SanitizeLeak.cpp +119 -0
  625. package/external/folly/folly/memory/SanitizeLeak.h +108 -0
  626. package/external/folly/folly/memory/ThreadCachedArena.cpp +53 -0
  627. package/external/folly/folly/memory/ThreadCachedArena.h +90 -0
  628. package/external/folly/folly/memory/UninitializedMemoryHacks.h +426 -0
  629. package/external/folly/folly/memory/detail/BUCK +10 -0
  630. package/external/folly/folly/memory/detail/MallocImpl.cpp +52 -0
  631. package/external/folly/folly/memory/detail/MallocImpl.h +97 -0
  632. package/external/folly/folly/memory/not_null-inl.h +522 -0
  633. package/external/folly/folly/memory/not_null.h +449 -0
  634. package/external/folly/folly/memory/test/ArenaTest.cpp +354 -0
  635. package/external/folly/folly/memory/test/BUCK +146 -0
  636. package/external/folly/folly/memory/test/MallctlHelperTest.cpp +169 -0
  637. package/external/folly/folly/memory/test/MallocBenchmark.cpp +91 -0
  638. package/external/folly/folly/memory/test/MallocTest.cpp +78 -0
  639. package/external/folly/folly/memory/test/MemoryResourceTest.cpp +31 -0
  640. package/external/folly/folly/memory/test/ReentrantAllocatorTest.cpp +144 -0
  641. package/external/folly/folly/memory/test/SanitizeAddressTest.cpp +67 -0
  642. package/external/folly/folly/memory/test/SanitizeLeakTest.cpp +139 -0
  643. package/external/folly/folly/memory/test/ThreadCachedArenaTest.cpp +276 -0
  644. package/external/folly/folly/memory/test/UninitializedMemoryHacksODR.cpp +21 -0
  645. package/external/folly/folly/memory/test/UninitializedMemoryHacksTest.cpp +327 -0
  646. package/external/folly/folly/memory/test/not_null_test.cpp +608 -0
  647. package/external/folly/folly/memset.S +245 -0
  648. package/external/folly/folly/memset_select_aarch64.cpp +72 -0
  649. package/external/folly/folly/portability/Asm.h +50 -0
  650. package/external/folly/folly/portability/Atomic.h +31 -0
  651. package/external/folly/folly/portability/BUCK +456 -0
  652. package/external/folly/folly/portability/Builtins.cpp +31 -0
  653. package/external/folly/folly/portability/Builtins.h +161 -0
  654. package/external/folly/folly/portability/Config.h +43 -0
  655. package/external/folly/folly/portability/Constexpr.h +145 -0
  656. package/external/folly/folly/portability/Dirent.cpp +140 -0
  657. package/external/folly/folly/portability/Dirent.h +41 -0
  658. package/external/folly/folly/portability/Event.h +44 -0
  659. package/external/folly/folly/portability/Fcntl.cpp +120 -0
  660. package/external/folly/folly/portability/Fcntl.h +67 -0
  661. package/external/folly/folly/portability/Filesystem.cpp +67 -0
  662. package/external/folly/folly/portability/Filesystem.h +114 -0
  663. package/external/folly/folly/portability/FmtCompile.h +40 -0
  664. package/external/folly/folly/portability/GFlags.h +139 -0
  665. package/external/folly/folly/portability/GMock.h +35 -0
  666. package/external/folly/folly/portability/GTest.h +35 -0
  667. package/external/folly/folly/portability/IOVec.h +34 -0
  668. package/external/folly/folly/portability/Libgen.cpp +59 -0
  669. package/external/folly/folly/portability/Libgen.h +29 -0
  670. package/external/folly/folly/portability/Libunwind.h +21 -0
  671. package/external/folly/folly/portability/Malloc.cpp +31 -0
  672. package/external/folly/folly/portability/Malloc.h +53 -0
  673. package/external/folly/folly/portability/Math.h +90 -0
  674. package/external/folly/folly/portability/Memory.h +26 -0
  675. package/external/folly/folly/portability/OpenSSL.cpp +17 -0
  676. package/external/folly/folly/portability/OpenSSL.h +102 -0
  677. package/external/folly/folly/portability/PThread.cpp +697 -0
  678. package/external/folly/folly/portability/PThread.h +148 -0
  679. package/external/folly/folly/portability/README.md +21 -0
  680. package/external/folly/folly/portability/Sched.cpp +41 -0
  681. package/external/folly/folly/portability/Sched.h +45 -0
  682. package/external/folly/folly/portability/Sockets.cpp +245 -0
  683. package/external/folly/folly/portability/Sockets.h +155 -0
  684. package/external/folly/folly/portability/SourceLocation.h +49 -0
  685. package/external/folly/folly/portability/Stdio.cpp +77 -0
  686. package/external/folly/folly/portability/Stdio.h +32 -0
  687. package/external/folly/folly/portability/Stdlib.cpp +172 -0
  688. package/external/folly/folly/portability/Stdlib.h +64 -0
  689. package/external/folly/folly/portability/String.cpp +53 -0
  690. package/external/folly/folly/portability/String.h +39 -0
  691. package/external/folly/folly/portability/SysFile.cpp +46 -0
  692. package/external/folly/folly/portability/SysFile.h +27 -0
  693. package/external/folly/folly/portability/SysMembarrier.cpp +104 -0
  694. package/external/folly/folly/portability/SysMembarrier.h +26 -0
  695. package/external/folly/folly/portability/SysMman.cpp +242 -0
  696. package/external/folly/folly/portability/SysMman.h +68 -0
  697. package/external/folly/folly/portability/SysResource.cpp +108 -0
  698. package/external/folly/folly/portability/SysResource.h +71 -0
  699. package/external/folly/folly/portability/SysStat.cpp +66 -0
  700. package/external/folly/folly/portability/SysStat.h +52 -0
  701. package/external/folly/folly/portability/SysSyscall.h +73 -0
  702. package/external/folly/folly/portability/SysTime.cpp +62 -0
  703. package/external/folly/folly/portability/SysTime.h +50 -0
  704. package/external/folly/folly/portability/SysTypes.h +44 -0
  705. package/external/folly/folly/portability/SysUio.cpp +179 -0
  706. package/external/folly/folly/portability/SysUio.h +51 -0
  707. package/external/folly/folly/portability/Syslog.h +39 -0
  708. package/external/folly/folly/portability/Time.cpp +357 -0
  709. package/external/folly/folly/portability/Time.h +74 -0
  710. package/external/folly/folly/portability/Unistd.h +111 -0
  711. package/external/folly/folly/portability/Windows.h +108 -0
  712. package/external/folly/folly/portability/openat2.c +30 -0
  713. package/external/folly/folly/portability/openat2.h +39 -0
  714. package/external/folly/folly/portability/test/BUCK +59 -0
  715. package/external/folly/folly/portability/test/ConstexprTest.cpp +102 -0
  716. package/external/folly/folly/portability/test/FilesystemTest.cpp +35 -0
  717. package/external/folly/folly/portability/test/LibgenTest.cpp +35 -0
  718. package/external/folly/folly/portability/test/OpenSSLPortabilityTest.cpp +108 -0
  719. package/external/folly/folly/portability/test/PThreadTest.cpp +80 -0
  720. package/external/folly/folly/portability/test/TimeTest.cpp +90 -0
  721. package/external/folly/folly/small_vector.h +17 -0
  722. package/external/folly/folly/somerge_defs.bzl +399 -0
  723. package/external/folly/folly/sorted_vector_types.h +17 -0
  724. package/external/folly/folly/stop_watch.h +317 -0
  725. package/external/folly/folly/synchronization/AsymmetricThreadFence.cpp +91 -0
  726. package/external/folly/folly/synchronization/AsymmetricThreadFence.h +60 -0
  727. package/external/folly/folly/synchronization/AtomicNotification-inl.h +146 -0
  728. package/external/folly/folly/synchronization/AtomicNotification.cpp +34 -0
  729. package/external/folly/folly/synchronization/AtomicNotification.h +117 -0
  730. package/external/folly/folly/synchronization/AtomicRef.h +181 -0
  731. package/external/folly/folly/synchronization/AtomicStruct.h +150 -0
  732. package/external/folly/folly/synchronization/AtomicUtil-inl.h +482 -0
  733. package/external/folly/folly/synchronization/AtomicUtil.h +179 -0
  734. package/external/folly/folly/synchronization/BUCK +418 -0
  735. package/external/folly/folly/synchronization/Baton.h +419 -0
  736. package/external/folly/folly/synchronization/CallOnce.h +263 -0
  737. package/external/folly/folly/synchronization/DelayedInit.h +179 -0
  738. package/external/folly/folly/synchronization/DistributedMutex-inl.h +1744 -0
  739. package/external/folly/folly/synchronization/DistributedMutex.cpp +27 -0
  740. package/external/folly/folly/synchronization/DistributedMutex.h +342 -0
  741. package/external/folly/folly/synchronization/EventCount.h +200 -0
  742. package/external/folly/folly/synchronization/FlatCombining.h +629 -0
  743. package/external/folly/folly/synchronization/Hazptr-fwd.h +217 -0
  744. package/external/folly/folly/synchronization/Hazptr.cpp +36 -0
  745. package/external/folly/folly/synchronization/Hazptr.h +209 -0
  746. package/external/folly/folly/synchronization/HazptrDomain.cpp +68 -0
  747. package/external/folly/folly/synchronization/HazptrDomain.h +832 -0
  748. package/external/folly/folly/synchronization/HazptrHolder.h +431 -0
  749. package/external/folly/folly/synchronization/HazptrObj.h +533 -0
  750. package/external/folly/folly/synchronization/HazptrObjLinked.h +315 -0
  751. package/external/folly/folly/synchronization/HazptrRec.h +68 -0
  752. package/external/folly/folly/synchronization/HazptrThrLocal.h +180 -0
  753. package/external/folly/folly/synchronization/HazptrThreadPoolExecutor.cpp +46 -0
  754. package/external/folly/folly/synchronization/HazptrThreadPoolExecutor.h +25 -0
  755. package/external/folly/folly/synchronization/Latch.h +160 -0
  756. package/external/folly/folly/synchronization/LifoSem.h +767 -0
  757. package/external/folly/folly/synchronization/Lock.h +887 -0
  758. package/external/folly/folly/synchronization/MicroSpinLock.h +154 -0
  759. package/external/folly/folly/synchronization/NativeSemaphore.h +187 -0
  760. package/external/folly/folly/synchronization/ParkingLot.cpp +37 -0
  761. package/external/folly/folly/synchronization/ParkingLot.h +330 -0
  762. package/external/folly/folly/synchronization/PicoSpinLock.h +167 -0
  763. package/external/folly/folly/synchronization/RWSpinLock.h +549 -0
  764. package/external/folly/folly/synchronization/Rcu.cpp +26 -0
  765. package/external/folly/folly/synchronization/Rcu.h +553 -0
  766. package/external/folly/folly/synchronization/RelaxedAtomic.h +336 -0
  767. package/external/folly/folly/synchronization/SanitizeThread.cpp +141 -0
  768. package/external/folly/folly/synchronization/SanitizeThread.h +166 -0
  769. package/external/folly/folly/synchronization/SaturatingSemaphore.h +324 -0
  770. package/external/folly/folly/synchronization/SmallLocks.h +36 -0
  771. package/external/folly/folly/synchronization/ThrottledLifoSem.h +362 -0
  772. package/external/folly/folly/synchronization/WaitOptions.cpp +25 -0
  773. package/external/folly/folly/synchronization/WaitOptions.h +75 -0
  774. package/external/folly/folly/synchronization/detail/AtomicUtils.h +59 -0
  775. package/external/folly/folly/synchronization/detail/BUCK +104 -0
  776. package/external/folly/folly/synchronization/detail/Hardware.cpp +192 -0
  777. package/external/folly/folly/synchronization/detail/Hardware.h +75 -0
  778. package/external/folly/folly/synchronization/detail/HazptrUtils.h +339 -0
  779. package/external/folly/folly/synchronization/detail/InlineFunctionRef.h +229 -0
  780. package/external/folly/folly/synchronization/detail/Sleeper.cpp +27 -0
  781. package/external/folly/folly/synchronization/detail/Sleeper.h +62 -0
  782. package/external/folly/folly/synchronization/detail/Spin.h +96 -0
  783. package/external/folly/folly/synchronization/detail/ThreadCachedLists.h +174 -0
  784. package/external/folly/folly/synchronization/detail/ThreadCachedReaders.h +189 -0
  785. package/external/folly/folly/synchronization/detail/ThreadCachedTag.h +26 -0
  786. package/external/folly/folly/synchronization/detail/test/BUCK +28 -0
  787. package/external/folly/folly/synchronization/detail/test/HardwareTest.cpp +74 -0
  788. package/external/folly/folly/synchronization/detail/test/InlineFunctionRefTest.cpp +286 -0
  789. package/external/folly/folly/synchronization/example/BUCK +27 -0
  790. package/external/folly/folly/synchronization/example/HazptrLockFreeLIFO.h +88 -0
  791. package/external/folly/folly/synchronization/example/HazptrSWMRSet.h +133 -0
  792. package/external/folly/folly/synchronization/example/HazptrWideCAS.h +62 -0
  793. package/external/folly/folly/synchronization/test/AtomicNotificationTest.cpp +236 -0
  794. package/external/folly/folly/synchronization/test/AtomicRefTest.cpp +170 -0
  795. package/external/folly/folly/synchronization/test/AtomicStructTest.cpp +65 -0
  796. package/external/folly/folly/synchronization/test/AtomicUtilBench.cpp +457 -0
  797. package/external/folly/folly/synchronization/test/AtomicUtilTest.cpp +650 -0
  798. package/external/folly/folly/synchronization/test/BUCK +495 -0
  799. package/external/folly/folly/synchronization/test/Barrier.h +52 -0
  800. package/external/folly/folly/synchronization/test/BarrierTest.cpp +56 -0
  801. package/external/folly/folly/synchronization/test/BatonBenchmark.cpp +77 -0
  802. package/external/folly/folly/synchronization/test/BatonTest.cpp +164 -0
  803. package/external/folly/folly/synchronization/test/BatonTestHelpers.h +118 -0
  804. package/external/folly/folly/synchronization/test/CallOnceBenchmark.cpp +72 -0
  805. package/external/folly/folly/synchronization/test/CallOnceTest.cpp +153 -0
  806. package/external/folly/folly/synchronization/test/DelayedInitTest.cpp +281 -0
  807. package/external/folly/folly/synchronization/test/DistributedMutexTest.cpp +2074 -0
  808. package/external/folly/folly/synchronization/test/EventCountTest.cpp +124 -0
  809. package/external/folly/folly/synchronization/test/FlatCombiningBenchmark.cpp +1789 -0
  810. package/external/folly/folly/synchronization/test/FlatCombiningExamples.h +222 -0
  811. package/external/folly/folly/synchronization/test/FlatCombiningTest.cpp +121 -0
  812. package/external/folly/folly/synchronization/test/FlatCombiningTestHelpers.h +227 -0
  813. package/external/folly/folly/synchronization/test/HazptrTest.cpp +1689 -0
  814. package/external/folly/folly/synchronization/test/LatchTest.cpp +224 -0
  815. package/external/folly/folly/synchronization/test/LifoSemBench.cpp +185 -0
  816. package/external/folly/folly/synchronization/test/LifoSemTests.cpp +353 -0
  817. package/external/folly/folly/synchronization/test/LockTest.cpp +1239 -0
  818. package/external/folly/folly/synchronization/test/NativeSemaphoreTest.cpp +37 -0
  819. package/external/folly/folly/synchronization/test/ParkingLotBenchmark.cpp +239 -0
  820. package/external/folly/folly/synchronization/test/ParkingLotTest.cpp +170 -0
  821. package/external/folly/folly/synchronization/test/RWSpinLockTest.cpp +235 -0
  822. package/external/folly/folly/synchronization/test/RcuBench.cpp +66 -0
  823. package/external/folly/folly/synchronization/test/RcuTest.cpp +330 -0
  824. package/external/folly/folly/synchronization/test/RelaxedAtomicTest.cpp +389 -0
  825. package/external/folly/folly/synchronization/test/SaturatingSemaphoreTest.cpp +166 -0
  826. package/external/folly/folly/synchronization/test/Semaphore.h +242 -0
  827. package/external/folly/folly/synchronization/test/SemaphoreTest.cpp +271 -0
  828. package/external/folly/folly/synchronization/test/SmallLocksBenchmark.cpp +1296 -0
  829. package/external/folly/folly/synchronization/test/SmallLocksTest.cpp +510 -0
  830. package/external/folly/folly/synchronization/test/ThreadCachedEpochBench.h +67 -0
  831. package/external/folly/folly/synchronization/test/ThreadCachedReadersBench.cpp +42 -0
  832. package/external/folly/folly/synchronization/test/ThreadCachedReadersTest.cpp +52 -0
  833. package/external/folly/folly/synchronization/test/ThrottledLifoSemTest.cpp +243 -0
  834. package/external/folly/folly/system/AtFork.cpp +205 -0
  835. package/external/folly/folly/system/AtFork.h +116 -0
  836. package/external/folly/folly/system/AuxVector.h +198 -0
  837. package/external/folly/folly/system/BUCK +144 -0
  838. package/external/folly/folly/system/EnvUtil.cpp +93 -0
  839. package/external/folly/folly/system/EnvUtil.h +113 -0
  840. package/external/folly/folly/system/HardwareConcurrency.cpp +39 -0
  841. package/external/folly/folly/system/HardwareConcurrency.h +23 -0
  842. package/external/folly/folly/system/MemoryMapping.cpp +477 -0
  843. package/external/folly/folly/system/MemoryMapping.h +287 -0
  844. package/external/folly/folly/system/Pid.cpp +87 -0
  845. package/external/folly/folly/system/Pid.h +34 -0
  846. package/external/folly/folly/system/Shell.cpp +33 -0
  847. package/external/folly/folly/system/Shell.h +93 -0
  848. package/external/folly/folly/system/ThreadId.cpp +89 -0
  849. package/external/folly/folly/system/ThreadId.h +62 -0
  850. package/external/folly/folly/system/ThreadName.cpp +330 -0
  851. package/external/folly/folly/system/ThreadName.h +72 -0
  852. package/external/folly/folly/system/test/AtForkTest.cpp +309 -0
  853. package/external/folly/folly/system/test/AuxVectorTest.cpp +55 -0
  854. package/external/folly/folly/system/test/BUCK +120 -0
  855. package/external/folly/folly/system/test/EnvUtilSubprocess.cpp +26 -0
  856. package/external/folly/folly/system/test/EnvUtilTest.cpp +197 -0
  857. package/external/folly/folly/system/test/MemoryMappingTest.cpp +179 -0
  858. package/external/folly/folly/system/test/PidTest.cpp +46 -0
  859. package/external/folly/folly/system/test/ShellTest.cpp +66 -0
  860. package/external/folly/folly/system/test/ThreadIdTest.cpp +114 -0
  861. package/external/folly/folly/system/test/ThreadNameTest.cpp +85 -0
  862. package/external/folly/folly.vcxitems +164 -0
  863. package/external/folly/sync-config.json +8 -0
  864. package/package.json +6 -6
  865. package/template/cpp-app/proj/MyApp.sln +0 -33
  866. package/template/cpp-lib/proj/MyLib.sln +0 -33
  867. package/template/cs-app/proj/MyApp.sln +0 -33
  868. package/template/cs-lib/proj/MyLib.sln +0 -33
  869. package/templates/cpp-app/windows/MyApp.sln +0 -33
  870. package/templates/cpp-lib/windows/MyLib.sln +0 -33
  871. package/Folly/Folly.vcxproj +0 -383
  872. package/Folly/Folly.vcxproj.filters +0 -558
  873. package/Folly/Folly.win32.vcxproj +0 -11
  874. package/Folly/packages.lock.win32.json +0 -20
  875. package/fmt/fmt.vcxproj +0 -163
  876. package/fmt/fmt.vcxproj.filters +0 -59
  877. package/fmt/fmt.win32.vcxproj +0 -10
  878. package/fmt/pch.cpp +0 -4
  879. package/fmt/pch.h +0 -2
  880. /package/{Folly → external/folly}/Folly.natvis +0 -0
  881. /package/{Folly → external/folly}/cgmanifest.json +0 -0
  882. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/ConstexprMath.h +0 -0
  883. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/Conv.cpp +0 -0
  884. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/chrono/Hardware.h +0 -0
  885. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/concurrency/CacheLocality.cpp +0 -0
  886. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/json/dynamic-inl.h +0 -0
  887. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/json/json.cpp +0 -0
  888. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/lang/SafeAssert.h +0 -0
  889. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/lang/ToAscii.cpp +0 -0
  890. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/lang/ToAscii.h +0 -0
  891. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/portability/Unistd.cpp +0 -0
@@ -0,0 +1,891 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ //
18
+ // Docs: https://fburl.com/fbcref_singleton
19
+ //
20
+
21
+ // SingletonVault - a library to manage the creation and destruction
22
+ // of interdependent singletons.
23
+ //
24
+ // Recommended usage of this class: suppose you have a class
25
+ // called MyExpensiveService, and you only want to construct one (ie,
26
+ // it's a singleton), but you only want to construct it if it is used.
27
+ //
28
+ // In your .h file:
29
+ // class MyExpensiveService {
30
+ // // Caution - may return a null ptr during startup and shutdown.
31
+ // static std::shared_ptr<MyExpensiveService> getInstance();
32
+ // ....
33
+ // };
34
+ //
35
+ // In your .cpp file:
36
+ // namespace { struct PrivateTag {}; }
37
+ // static folly::Singleton<MyExpensiveService, PrivateTag> the_singleton;
38
+ // std::shared_ptr<MyExpensiveService> MyExpensiveService::getInstance() {
39
+ // return the_singleton.try_get();
40
+ // }
41
+ //
42
+ // Code in other modules can access it via:
43
+ //
44
+ // auto instance = MyExpensiveService::getInstance();
45
+ //
46
+ // Advanced usage and notes:
47
+ //
48
+ // You can also access a singleton instance with
49
+ // `Singleton<ObjectType, TagType>::try_get()`. We recommend
50
+ // that you prefer the form `the_singleton.try_get()` because it ensures that
51
+ // `the_singleton` is used and cannot be garbage-collected during linking: this
52
+ // is necessary because the constructor of `the_singleton` is what registers it
53
+ // to the SingletonVault.
54
+ //
55
+ // The singleton will be created on demand. If the constructor for
56
+ // MyExpensiveService actually makes use of *another* Singleton, then
57
+ // the right thing will happen -- that other singleton will complete
58
+ // construction before get() returns. However, in the event of a
59
+ // circular dependency, a runtime error will occur.
60
+ //
61
+ // You can have multiple singletons of the same underlying type, but
62
+ // each must be given a unique tag. If no tag is specified a default tag is
63
+ // used. We recommend that you use a tag from an anonymous namespace private to
64
+ // your implementation file, as this ensures that the singleton is only
65
+ // available via your interface and not also through Singleton<T>::try_get()
66
+ //
67
+ // namespace {
68
+ // struct Tag1 {};
69
+ // struct Tag2 {};
70
+ // folly::Singleton<MyExpensiveService> s_default;
71
+ // folly::Singleton<MyExpensiveService, Tag1> s1;
72
+ // folly::Singleton<MyExpensiveService, Tag2> s2;
73
+ // }
74
+ // ...
75
+ // MyExpensiveService* svc_default = s_default.get();
76
+ // MyExpensiveService* svc1 = s1.get();
77
+ // MyExpensiveService* svc2 = s2.get();
78
+ //
79
+ // By default, the singleton instance is constructed via new and
80
+ // deleted via delete, but this is configurable:
81
+ //
82
+ // namespace { folly::Singleton<MyExpensiveService> the_singleton(create,
83
+ // destroy); }
84
+ //
85
+ // Where create and destroy are functions, Singleton<T>::CreateFunc
86
+ // Singleton<T>::TeardownFunc.
87
+ //
88
+ // For example, if you need to pass arguments to your class's constructor:
89
+ // class X {
90
+ // public:
91
+ // X(int a1, std::string a2);
92
+ // // ...
93
+ // }
94
+ // Make your singleton like this:
95
+ // folly::Singleton<X> singleton_x([]() { return new X(42, "foo"); });
96
+ //
97
+ // The above examples detail a situation where an expensive singleton is loaded
98
+ // on-demand (thus only if needed). However if there is an expensive singleton
99
+ // that will likely be needed, and initialization takes a potentially long time,
100
+ // e.g. while initializing, parsing some files, talking to remote services,
101
+ // making uses of other singletons, and so on, the initialization of those can
102
+ // be scheduled up front, or "eagerly".
103
+ //
104
+ // In that case the singleton can be declared this way:
105
+ //
106
+ // namespace {
107
+ // auto the_singleton =
108
+ // folly::Singleton<MyExpensiveService>(/* optional create, destroy args */)
109
+ // .shouldEagerInit();
110
+ // }
111
+ //
112
+ // This way the singleton's instance is built at program initialization,
113
+ // if the program opted-in to that feature by calling "doEagerInit" or
114
+ // "doEagerInitVia" during its startup.
115
+ //
116
+ // What if you need to destroy all of your singletons? Say, some of
117
+ // your singletons manage threads, but you need to fork? Or your unit
118
+ // test wants to clean up all global state? Then you can call
119
+ // SingletonVault::singleton()->destroyInstances(), which invokes the
120
+ // TeardownFunc for each singleton, in the reverse order they were
121
+ // created. It is your responsibility to ensure your singletons can
122
+ // handle cases where the singletons they depend on go away, however.
123
+ // Singletons won't be recreated after destroyInstances call. If you
124
+ // want to re-enable singleton creation (say after fork was called) you
125
+ // should call reenableInstances.
126
+
127
+ #pragma once
128
+
129
+ #include <folly/CancellationToken.h>
130
+ #include <folly/Exception.h>
131
+ #include <folly/Executor.h>
132
+ #include <folly/Memory.h>
133
+ #include <folly/Synchronized.h>
134
+ #include <folly/concurrency/CoreCachedSharedPtr.h>
135
+ #include <folly/concurrency/memory/ReadMostlySharedPtr.h>
136
+ #include <folly/detail/Singleton.h>
137
+ #include <folly/detail/StaticSingletonManager.h>
138
+ #include <folly/hash/Hash.h>
139
+ #include <folly/lang/Exception.h>
140
+ #include <folly/memory/SanitizeLeak.h>
141
+ #include <folly/synchronization/Baton.h>
142
+
143
+ #include <algorithm>
144
+ #include <atomic>
145
+ #include <condition_variable>
146
+ #include <functional>
147
+ #include <list>
148
+ #include <memory>
149
+ #include <mutex>
150
+ #include <string>
151
+ #include <thread>
152
+ #include <typeindex>
153
+ #include <typeinfo>
154
+ #include <unordered_map>
155
+ #include <unordered_set>
156
+ #include <vector>
157
+
158
+ #include <glog/logging.h>
159
+
160
+ namespace folly {
161
+
162
+ // For actual usage, please see the Singleton<T> class at the bottom
163
+ // of this file; that is what you will actually interact with.
164
+
165
+ // SingletonVault is the class that manages singleton instances. It
166
+ // is unaware of the underlying types of singletons, and simply
167
+ // manages lifecycles and invokes CreateFunc and TeardownFunc when
168
+ // appropriate. In general, you won't need to interact with the
169
+ // SingletonVault itself.
170
+ //
171
+ // A vault goes through a few stages of life:
172
+ //
173
+ // 1. Registration phase; singletons can be registered:
174
+ // a) Strict: no singleton can be created in this stage.
175
+ // b) Relaxed: singleton can be created (the default vault is Relaxed).
176
+ // 2. registrationComplete() has been called; singletons can no
177
+ // longer be registered, but they can be created.
178
+ // 3. A vault can return to stage 1 when destroyInstances is called.
179
+ //
180
+ // In general, you don't need to worry about any of the above; just
181
+ // ensure registrationComplete() is called near the top of your main()
182
+ // function, otherwise no singletons can be instantiated.
183
+
184
+ class SingletonVault;
185
+
186
+ namespace detail {
187
+
188
+ // A TypeDescriptor is the unique handle for a given singleton. It is
189
+ // a combination of the type and of the optional name, and is used as
190
+ // a key in unordered_maps.
191
+ class TypeDescriptor {
192
+ public:
193
+ TypeDescriptor(const std::type_info& ti, const std::type_info& tag_ti)
194
+ : ti_(ti), tag_ti_(tag_ti) {}
195
+
196
+ TypeDescriptor(const TypeDescriptor& other)
197
+ : ti_(other.ti_), tag_ti_(other.tag_ti_) {}
198
+
199
+ TypeDescriptor& operator=(const TypeDescriptor& other) {
200
+ if (this != &other) {
201
+ ti_ = other.ti_;
202
+ tag_ti_ = other.tag_ti_;
203
+ }
204
+
205
+ return *this;
206
+ }
207
+
208
+ std::string name() const;
209
+
210
+ friend class TypeDescriptorHasher;
211
+
212
+ bool operator==(const TypeDescriptor& other) const {
213
+ return ti_ == other.ti_ && tag_ti_ == other.tag_ti_;
214
+ }
215
+
216
+ private:
217
+ std::type_index ti_;
218
+ std::type_index tag_ti_;
219
+ };
220
+
221
+ class TypeDescriptorHasher {
222
+ public:
223
+ size_t operator()(const TypeDescriptor& ti) const {
224
+ return folly::hash::hash_combine(ti.ti_, ti.tag_ti_);
225
+ }
226
+ };
227
+
228
+ [[noreturn]] void singletonWarnLeakyDoubleRegistrationAndAbort(
229
+ const TypeDescriptor& type);
230
+
231
+ [[noreturn]] void singletonWarnLeakyInstantiatingNotRegisteredAndAbort(
232
+ const TypeDescriptor& type);
233
+
234
+ [[noreturn]] void singletonWarnRegisterMockEarlyAndAbort(
235
+ const TypeDescriptor& type);
236
+
237
+ void singletonWarnDestroyInstanceLeak(
238
+ const TypeDescriptor& type, const void* ptr);
239
+
240
+ [[noreturn]] void singletonWarnCreateCircularDependencyAndAbort(
241
+ const TypeDescriptor& type);
242
+
243
+ [[noreturn]] void singletonWarnCreateUnregisteredAndAbort(
244
+ const TypeDescriptor& type);
245
+
246
+ [[noreturn]] void singletonWarnCreateBeforeRegistrationCompleteAndAbort(
247
+ const TypeDescriptor& type);
248
+
249
+ void singletonPrintDestructionStackTrace(const TypeDescriptor& type);
250
+
251
+ [[noreturn]] void singletonThrowNullCreator(const std::type_info& type);
252
+
253
+ [[noreturn]] void singletonThrowGetInvokedAfterDestruction(
254
+ const TypeDescriptor& type);
255
+
256
+ struct SingletonVaultState {
257
+ // The two stages of life for a vault, as mentioned in the class comment.
258
+ enum class Type {
259
+ Running,
260
+ Quiescing,
261
+ };
262
+
263
+ Type state{Type::Running};
264
+ bool registrationComplete{false};
265
+
266
+ // Each singleton in the vault can be in two states: dead
267
+ // (registered but never created), living (CreateFunc returned an instance).
268
+
269
+ void check(
270
+ Type expected,
271
+ const char* msg = "Unexpected singleton state change") const {
272
+ if (expected != state) {
273
+ throw_exception<std::logic_error>(msg);
274
+ }
275
+ }
276
+
277
+ bool isDisabled() const { return state == Type::Quiescing; }
278
+ };
279
+
280
+ // This interface is used by SingletonVault to interact with SingletonHolders.
281
+ // Having a non-template interface allows SingletonVault to keep a list of all
282
+ // SingletonHolders.
283
+ class SingletonHolderBase {
284
+ public:
285
+ explicit SingletonHolderBase(TypeDescriptor typeDesc) noexcept
286
+ : type_(typeDesc) {}
287
+ virtual ~SingletonHolderBase() = default;
288
+
289
+ TypeDescriptor type() const { return type_; }
290
+ virtual bool hasLiveInstance() = 0;
291
+ virtual void createInstance() = 0;
292
+ virtual bool creationStarted() = 0;
293
+ virtual void preDestroyInstance(ReadMostlyMainPtrDeleter<>&) = 0;
294
+ virtual void destroyInstance() = 0;
295
+ virtual void inChildAfterFork() = 0;
296
+
297
+ private:
298
+ TypeDescriptor type_;
299
+ };
300
+
301
+ // An actual instance of a singleton, tracking the instance itself,
302
+ // its state as described above, and the create and teardown
303
+ // functions.
304
+ template <typename T>
305
+ struct SingletonHolder : public SingletonHolderBase {
306
+ public:
307
+ typedef std::function<void(T*)> TeardownFunc;
308
+ typedef std::function<T*(void)> CreateFunc;
309
+
310
+ template <typename Tag, typename VaultTag>
311
+ inline static SingletonHolder<T>& singleton();
312
+
313
+ inline T* get();
314
+ inline std::weak_ptr<T> get_weak();
315
+ inline std::shared_ptr<T> try_get();
316
+ inline folly::ReadMostlySharedPtr<T> try_get_fast();
317
+ template <typename Func>
318
+ inline invoke_result_t<Func, T*> apply(Func f);
319
+ inline void vivify();
320
+
321
+ void registerSingleton(CreateFunc c, TeardownFunc t);
322
+ void registerSingletonMock(CreateFunc c, TeardownFunc t);
323
+ bool hasLiveInstance() override;
324
+ void createInstance() override;
325
+ bool creationStarted() override;
326
+ void preDestroyInstance(ReadMostlyMainPtrDeleter<>&) override;
327
+ void destroyInstance() override;
328
+ void inChildAfterFork() override;
329
+
330
+ private:
331
+ template <typename Tag, typename VaultTag>
332
+ struct Impl;
333
+
334
+ SingletonHolder(TypeDescriptor type, SingletonVault& vault) noexcept;
335
+
336
+ enum class SingletonHolderState {
337
+ NotRegistered,
338
+ Dead,
339
+ Living,
340
+ LivingInChildAfterFork,
341
+ };
342
+
343
+ SingletonVault& vault_;
344
+
345
+ // mutex protects the entire entry during construction/destruction
346
+ std::mutex mutex_;
347
+
348
+ // State of the singleton entry. If state is Living, instance_ptr and
349
+ // instance_weak can be safely accessed w/o synchronization.
350
+ std::atomic<SingletonHolderState> state_{SingletonHolderState::NotRegistered};
351
+
352
+ // the thread creating the singleton (only valid while creating an object)
353
+ std::atomic<std::thread::id> creating_thread_{};
354
+
355
+ // The singleton itself and related functions.
356
+
357
+ // holds a ReadMostlyMainPtr to singleton instance, set when state is changed
358
+ // from Dead to Living. Reset when state is changed from Living to Dead.
359
+ folly::ReadMostlyMainPtr<T> instance_;
360
+ // used to release all ReadMostlyMainPtrs at once
361
+ folly::ReadMostlySharedPtr<T> instance_copy_;
362
+ // per-core shared_ptrs that in turn hold the instance shared_ptr, to avoid
363
+ // contention in acquiring them.
364
+ folly::CoreCachedSharedPtr<T> instance_core_cached_;
365
+ // weak references to the previous pointers. These are never written to after
366
+ // initialization, so they're safe to read without synchronization once the
367
+ // state has transitioned to Living.
368
+ // instance_weak_ is a reference to the main instance, so it is authoritative
369
+ // on whether the instance is expired.
370
+ std::weak_ptr<T> instance_weak_;
371
+ folly::ReadMostlyWeakPtr<T> instance_weak_fast_;
372
+ folly::CoreCachedWeakPtr<T> instance_weak_core_cached_;
373
+
374
+ // Time we wait on destroy_baton after releasing Singleton shared_ptr.
375
+ std::shared_ptr<folly::Baton<>> destroy_baton_;
376
+ T* instance_ptr_ = nullptr;
377
+ CreateFunc create_ = nullptr;
378
+ TeardownFunc teardown_ = nullptr;
379
+
380
+ std::shared_ptr<std::atomic<bool>> print_destructor_stack_trace_;
381
+
382
+ SingletonHolder(const SingletonHolder&) = delete;
383
+ SingletonHolder& operator=(const SingletonHolder&) = delete;
384
+ SingletonHolder& operator=(SingletonHolder&&) = delete;
385
+ SingletonHolder(SingletonHolder&&) = delete;
386
+ };
387
+
388
+ } // namespace detail
389
+
390
+ class SingletonVault {
391
+ public:
392
+ enum class Type {
393
+ Strict, // Singletons can't be created before registrationComplete()
394
+ Relaxed, // Singletons can be created before registrationComplete()
395
+ };
396
+
397
+ /**
398
+ * Clears all singletons in the given vault at ctor and dtor times.
399
+ * Useful for unit-tests that need to clear the world.
400
+ *
401
+ * This need can arise when a unit-test needs to swap out an object used by a
402
+ * singleton for a test-double, but the singleton needing its dependency to be
403
+ * swapped has a type or a tag local to some other translation unit and
404
+ * unavailable in the current translation unit.
405
+ *
406
+ * Other, better approaches to this need are "plz 2 refactor" ....
407
+ */
408
+ struct ScopedExpunger {
409
+ SingletonVault* vault;
410
+ explicit ScopedExpunger(SingletonVault* v) : vault(v) { expunge(); }
411
+ ~ScopedExpunger() { expunge(); }
412
+ void expunge() {
413
+ vault->destroyInstances();
414
+ vault->reenableInstances();
415
+ }
416
+ };
417
+
418
+ static Type defaultVaultType();
419
+
420
+ explicit SingletonVault(Type type = defaultVaultType()) noexcept;
421
+
422
+ // Destructor is only called by unit tests to check destroyInstances.
423
+ ~SingletonVault();
424
+
425
+ typedef std::function<void(void*)> TeardownFunc;
426
+ typedef std::function<void*(void)> CreateFunc;
427
+
428
+ // Ensure that Singleton has not been registered previously and that
429
+ // registration is not complete. If validations succeeds,
430
+ // register a singleton of a given type with the create and teardown
431
+ // functions.
432
+ void registerSingleton(detail::SingletonHolderBase* entry);
433
+
434
+ /**
435
+ * Called by `Singleton<T>.shouldEagerInit()` to ensure the instance
436
+ * is built when `doEagerInit[Via]` is called; see those methods
437
+ * for more info.
438
+ */
439
+ void addEagerInitSingleton(detail::SingletonHolderBase* entry);
440
+
441
+ void addEagerInitOnReenableSingleton(detail::SingletonHolderBase* entry);
442
+
443
+ // Mark registration is complete; no more singletons can be
444
+ // registered at this point.
445
+ void registrationComplete();
446
+
447
+ /**
448
+ * Initialize all singletons which were marked as eager-initialized
449
+ * (using `shouldEagerInit()`). No return value. Propagates exceptions
450
+ * from constructors / create functions, as is the usual case when calling
451
+ * for example `Singleton<Foo>::get_weak()`.
452
+ */
453
+ void doEagerInit();
454
+
455
+ /**
456
+ * Schedule eager singletons' initializations through the given executor.
457
+ * If baton ptr is not null, its `post` method is called after all
458
+ * early initialization has completed.
459
+ *
460
+ * If exceptions are thrown during initialization, this method will still
461
+ * `post` the baton to indicate completion. The exception will not propagate
462
+ * and future attempts to `try_get` or `get_weak` the failed singleton will
463
+ * retry initialization.
464
+ *
465
+ * Sample usage:
466
+ *
467
+ * folly::IOThreadPoolExecutor executor(max_concurrency_level);
468
+ * folly::Baton<> done;
469
+ * doEagerInitVia(executor, &done);
470
+ * done.wait(); // or 'try_wait_for', etc.
471
+ *
472
+ */
473
+ void doEagerInitVia(Executor& exe, folly::Baton<>* done = nullptr);
474
+
475
+ // Destroy all singletons; when complete, the vault can't create
476
+ // singletons once again until reenableInstances() is called.
477
+ // If reenableInstances() will not be called, destroyInstancesFinal()
478
+ // should be used instead.
479
+ void destroyInstances();
480
+
481
+ // Enable re-creating singletons after destroyInstances() was called.
482
+ void reenableInstances();
483
+
484
+ // Same as destroyInstances() but reenableInstances() should not be called
485
+ // after it. Starts a shutdown timer.
486
+ void destroyInstancesFinal();
487
+
488
+ // For testing; how many registered and living singletons we have.
489
+ size_t registeredSingletonCount() const {
490
+ return singletons_.rlock()->size();
491
+ }
492
+
493
+ /**
494
+ * Flips to true if eager initialization was used, and has completed.
495
+ * Never set to true if "doEagerInit()" or "doEagerInitVia" never called.
496
+ */
497
+ bool eagerInitComplete() const;
498
+
499
+ size_t livingSingletonCount() const {
500
+ auto state = state_.rlock();
501
+ auto singletons = singletons_.rlock();
502
+
503
+ size_t ret = 0;
504
+ for (const auto& p : *singletons) {
505
+ if (p.second->hasLiveInstance()) {
506
+ ++ret;
507
+ }
508
+ }
509
+
510
+ return ret;
511
+ }
512
+
513
+ // A well-known vault; you can actually have others, but this is the
514
+ // default.
515
+ static SingletonVault* singleton() { return singleton<>(); }
516
+
517
+ // Gets singleton vault for any Tag. Non-default tag should be used in unit
518
+ // tests only.
519
+ template <typename VaultTag = detail::DefaultTag>
520
+ static SingletonVault* singleton() {
521
+ return &detail::createGlobal<SingletonVault, VaultTag>();
522
+ }
523
+
524
+ // Get a cancellation token that gets triggered when singleton destruction
525
+ // starts.
526
+ //
527
+ // The underlying cancellation source gets reset when reenableInstances() is
528
+ // called.
529
+ folly::CancellationToken getDestructionCancellationToken() {
530
+ return cancellationSource_.wlock()->getToken();
531
+ }
532
+
533
+ void setType(Type type) { type_.store(type, std::memory_order_relaxed); }
534
+
535
+ void setShutdownTimeout(std::chrono::milliseconds shutdownTimeout) {
536
+ shutdownTimeout_ = shutdownTimeout;
537
+ }
538
+
539
+ void disableShutdownTimeout() {
540
+ shutdownTimeout_ = std::chrono::milliseconds::zero();
541
+ }
542
+
543
+ void addToShutdownLog(std::string message);
544
+
545
+ [[noreturn]] void fireShutdownTimer();
546
+
547
+ void setFailOnUseAfterFork(bool failOnUseAfterFork) {
548
+ failOnUseAfterFork_ = failOnUseAfterFork;
549
+ }
550
+
551
+ bool isDisabled() const { return state_.rlock()->isDisabled(); }
552
+
553
+ private:
554
+ template <typename T>
555
+ friend struct detail::SingletonHolder;
556
+
557
+ // This method only matters if registrationComplete() is never called.
558
+ // Otherwise destroyInstances is scheduled to be executed atexit.
559
+ //
560
+ // Initializes static object, which calls destroyInstances on destruction.
561
+ // Used to have better deletion ordering with singleton not managed by
562
+ // folly::Singleton. The desruction will happen in the following order:
563
+ // 1. Singletons, not managed by folly::Singleton, which were created after
564
+ // any of the singletons managed by folly::Singleton was requested.
565
+ // 2. All singletons managed by folly::Singleton
566
+ // 3. Singletons, not managed by folly::Singleton, which were created before
567
+ // any of the singletons managed by folly::Singleton was requested.
568
+ static void scheduleDestroyInstances();
569
+
570
+ void startShutdownTimer();
571
+
572
+ typedef std::unordered_map<
573
+ detail::TypeDescriptor,
574
+ detail::SingletonHolderBase*,
575
+ detail::TypeDescriptorHasher>
576
+ SingletonMap;
577
+
578
+ // Use SharedMutexSuppressTSAN to suppress noisy lock inversions when building
579
+ // with TSAN. If TSAN is not enabled, SharedMutexSuppressTSAN is equivalent
580
+ // to a normal SharedMutex.
581
+ Synchronized<SingletonMap, SharedMutexSuppressTSAN> singletons_;
582
+ Synchronized<
583
+ std::unordered_set<detail::SingletonHolderBase*>,
584
+ SharedMutexSuppressTSAN>
585
+ eagerInitSingletons_;
586
+ Synchronized<
587
+ std::unordered_set<detail::SingletonHolderBase*>,
588
+ SharedMutexSuppressTSAN>
589
+ eagerInitOnReenableSingletons_;
590
+ Synchronized<std::vector<detail::TypeDescriptor>, SharedMutexSuppressTSAN>
591
+ creationOrder_;
592
+ Synchronized<
593
+ std::unordered_set<detail::TypeDescriptor, detail::TypeDescriptorHasher>,
594
+ SharedMutexSuppressTSAN>
595
+ instantiatedAtLeastOnce_;
596
+ std::unordered_set<detail::SingletonHolderBase*> liveSingletonsPreFork_;
597
+
598
+ // Using SharedMutexReadPriority is important here, because we want to make
599
+ // sure we don't block nested singleton creation happening concurrently with
600
+ // destroyInstances().
601
+ Synchronized<detail::SingletonVaultState, SharedMutexReadPriority> state_;
602
+
603
+ std::atomic<Type> type_;
604
+
605
+ std::atomic<bool> shutdownTimerStarted_{false};
606
+ std::chrono::milliseconds shutdownTimeout_{std::chrono::minutes{5}};
607
+ Synchronized<std::vector<std::string>> shutdownLog_;
608
+ // We use a lock around CancellationSource to get the guarantee that all
609
+ // cancellation callbacks that got triggered on requestCancellation() are done
610
+ // executing by the time we start destruction. This prevents silent callbacks
611
+ // that take long to block destruction.
612
+ folly::Synchronized<CancellationSource> cancellationSource_;
613
+ bool failOnUseAfterFork_{true};
614
+ };
615
+
616
+ /**
617
+ * Singleton allows for simple access to registering and instantiating
618
+ * singletons. Create instances of this class in the global scope of
619
+ * type Singleton<T> to register your singleton for later access via
620
+ * Singleton<T>::try_get().
621
+ *
622
+ * There are many supporting libraries and classes for Singleton; this is the
623
+ * one that users typically interact with.
624
+ */
625
+ template <
626
+ typename T,
627
+ typename Tag = detail::DefaultTag,
628
+ typename VaultTag = detail::DefaultTag /* for testing */>
629
+ class Singleton {
630
+ public:
631
+ typedef std::function<T*(void)> CreateFunc;
632
+ typedef std::function<void(T*)> TeardownFunc;
633
+
634
+ /**
635
+ * Get a pointer to the singleton.
636
+ *
637
+ * It is preferable to call get() repeatedly than to store the returned
638
+ * pointer. Accessing the returned pointer often fails during shutdown.
639
+ *
640
+ * Deprecated in favor of try_get().
641
+ */
642
+ [[deprecated("Replaced by try_get")]] static T* get() {
643
+ return getEntry().get();
644
+ }
645
+
646
+ /**
647
+ * Get a weak_ptr to the singleton.
648
+ *
649
+ * If you cannot lock the weak_ptr, this usually means the vault has been
650
+ * destroyed.
651
+ *
652
+ * Deprecated in favor of try_get().
653
+ */
654
+ [[deprecated("Replaced by try_get")]] static std::weak_ptr<T> get_weak() {
655
+ return getEntry().get_weak();
656
+ }
657
+
658
+ /**
659
+ * Get a shared_ptr to the singleton.
660
+ *
661
+ * It is recommended to call try_get() repeatedly, rather than storing the
662
+ * shared_ptr, because storing the shared_ptr prevents the singleton from
663
+ * being destroyed during shutdown.
664
+ */
665
+ static std::shared_ptr<T> try_get() { return getEntry().try_get(); }
666
+
667
+ /**
668
+ * Get a ReadMostlySharedPtr to the singleton.
669
+ *
670
+ * It is recommended to call try_get_fast() repeatedly, rather than storing
671
+ * the ReadMostlySharedPtr, because storing the ReadMostlySharedPtr prevents
672
+ * the singleton from being destroyed during shutdown.
673
+ */
674
+ static folly::ReadMostlySharedPtr<T> try_get_fast() {
675
+ return getEntry().try_get_fast();
676
+ }
677
+
678
+ /**
679
+ * Applies a callback to the possibly-nullptr singleton instance, returning
680
+ * the callback's result.
681
+ *
682
+ * That is, the following two are functionally equivalent:
683
+ * singleton.apply(std::ref(f));
684
+ * f(singleton.try_get().get());
685
+ *
686
+ * For example, the following returns the singleton
687
+ * instance directly without any extra operations on the instance:
688
+ * auto ret = Singleton<T>::apply([](auto* v) { return v; });
689
+ */
690
+ template <typename Func>
691
+ static invoke_result_t<Func, T*> apply(Func f) {
692
+ return getEntry().apply(std::ref(f));
693
+ }
694
+
695
+ /// Ensure the instance exists.
696
+ static void vivify() { getEntry().vivify(); }
697
+
698
+ /**
699
+ * Create a singleton, which uses the default-constructor for its wrapped
700
+ * type.
701
+ *
702
+ * @param t The teardown function to use (in lieu of delete).
703
+ */
704
+ explicit Singleton(
705
+ std::nullptr_t /* _ */ = nullptr,
706
+ typename Singleton::TeardownFunc t = nullptr)
707
+ : Singleton([]() { return new T; }, std::move(t)) {}
708
+
709
+ /**
710
+ * @param c The create function to use (in lieu of new).
711
+ * @param t The teardown function to use (in lieu of delete).
712
+ */
713
+ explicit Singleton(
714
+ typename Singleton::CreateFunc c,
715
+ typename Singleton::TeardownFunc t = nullptr) {
716
+ if (c == nullptr) {
717
+ detail::singletonThrowNullCreator(typeid(T));
718
+ }
719
+
720
+ auto vault = SingletonVault::singleton<VaultTag>();
721
+ getEntry().registerSingleton(std::move(c), getTeardownFunc(std::move(t)));
722
+ vault->registerSingleton(&getEntry());
723
+ }
724
+
725
+ /**
726
+ * Specify that the singleton should be eagerly initialized.
727
+ *
728
+ * Should be instantiated as soon as "doEagerInit[Via]" is called.
729
+ * Singletons are usually lazy-loaded (built on-demand) but for those which
730
+ * are known to be needed, to avoid the potential lag for objects that take
731
+ * long to construct during runtime, there is an option to make sure these
732
+ * are built up-front.
733
+ *
734
+ * Use like:
735
+ * auto gFooInstance = Singleton<Foo>(...).shouldEagerInit();
736
+ *
737
+ * Or alternately, define the singleton as usual, and say
738
+ * gFooInstance.shouldEagerInit();
739
+ *
740
+ * at some point prior to calling registrationComplete().
741
+ * Then doEagerInit() or doEagerInitVia(Executor*) can be called.
742
+ */
743
+ Singleton& shouldEagerInit() {
744
+ auto vault = SingletonVault::singleton<VaultTag>();
745
+ vault->addEagerInitSingleton(&getEntry());
746
+ return *this;
747
+ }
748
+
749
+ /**
750
+ * Specify that the singleton should be eagerly initialized when singletons
751
+ * reenable.
752
+ *
753
+ * Should be re-instantiated as soon as reenableInstances() is called.
754
+ * Note that it will be re-instantiated only if it was instantiated before
755
+ * destroyInstances() call.
756
+ *
757
+ * Use like:
758
+ * auto gFooInstance = Singleton<Foo>(...).shouldEagerInitOnReenable();
759
+ */
760
+ Singleton& shouldEagerInitOnReenable() {
761
+ auto vault = SingletonVault::singleton<VaultTag>();
762
+ vault->addEagerInitOnReenableSingleton(&getEntry());
763
+ return *this;
764
+ }
765
+
766
+ /**
767
+ * Inject a mock singleton, for testing.
768
+ *
769
+ * Construct and inject a mock singleton which should be used only from tests.
770
+ * Unlike regular singletons which are initialized once per process lifetime,
771
+ * mock singletons live for the duration of a test. This means that one
772
+ * process running multiple tests can initialize and register the same
773
+ * singleton multiple times. This functionality should be used only from tests
774
+ * since it relaxes validation and performance in order to be able to perform
775
+ * the injection. The returned mock singleton is functionality identical to
776
+ * regular singletons.
777
+ */
778
+ static void make_mock(
779
+ std::nullptr_t /* c */ = nullptr,
780
+ typename Singleton<T>::TeardownFunc t = nullptr) {
781
+ make_mock([]() { return new T; }, t);
782
+ }
783
+
784
+ static void make_mock(
785
+ CreateFunc c, typename Singleton<T>::TeardownFunc t = nullptr) {
786
+ if (c == nullptr) {
787
+ detail::singletonThrowNullCreator(typeid(T));
788
+ }
789
+
790
+ auto& entry = getEntry();
791
+
792
+ entry.registerSingletonMock(c, getTeardownFunc(t));
793
+ }
794
+
795
+ private:
796
+ inline static detail::SingletonHolder<T>& getEntry() {
797
+ return detail::SingletonHolder<T>::template singleton<Tag, VaultTag>();
798
+ }
799
+
800
+ // Construct TeardownFunc.
801
+ static typename detail::SingletonHolder<T>::TeardownFunc getTeardownFunc(
802
+ TeardownFunc t) {
803
+ if (t == nullptr) {
804
+ return [](T* v) { delete v; };
805
+ } else {
806
+ return t;
807
+ }
808
+ }
809
+ };
810
+
811
+ template <typename T, typename Tag = detail::DefaultTag>
812
+ class LeakySingleton {
813
+ public:
814
+ using CreateFunc = std::function<T*()>;
815
+
816
+ LeakySingleton() : LeakySingleton([] { return new T(); }) {}
817
+
818
+ explicit LeakySingleton(CreateFunc createFunc) {
819
+ auto& entry = entryInstance();
820
+ if (entry.state != State::NotRegistered) {
821
+ detail::singletonWarnLeakyDoubleRegistrationAndAbort(entry.type_);
822
+ }
823
+ entry.createFunc = createFunc;
824
+ entry.state = State::Dead;
825
+ }
826
+
827
+ static T& get() { return instance(); }
828
+
829
+ static void make_mock(std::nullptr_t /* c */ = nullptr) {
830
+ make_mock([]() { return new T; });
831
+ }
832
+
833
+ static void make_mock(CreateFunc createFunc) {
834
+ if (createFunc == nullptr) {
835
+ detail::singletonThrowNullCreator(typeid(T));
836
+ }
837
+
838
+ auto& entry = entryInstance();
839
+ std::lock_guard<std::mutex> lg(entry.mutex);
840
+ if (entry.ptr) {
841
+ lsan_ignore_object(std::atomic_exchange(&entry.ptr, (T*)nullptr));
842
+ }
843
+ entry.createFunc = createFunc;
844
+ entry.state = State::Dead;
845
+ }
846
+
847
+ private:
848
+ enum class State { NotRegistered, Dead, Living };
849
+
850
+ struct Entry {
851
+ Entry() noexcept {}
852
+ Entry(const Entry&) = delete;
853
+ Entry& operator=(const Entry&) = delete;
854
+
855
+ std::atomic<State> state{State::NotRegistered};
856
+ std::atomic<T*> ptr{nullptr};
857
+ CreateFunc createFunc;
858
+ std::mutex mutex;
859
+ detail::TypeDescriptor type_{typeid(T), typeid(Tag)};
860
+ };
861
+
862
+ static Entry& entryInstance() { return detail::createGlobal<Entry, Tag>(); }
863
+
864
+ static T& instance() {
865
+ auto& entry = entryInstance();
866
+ if (FOLLY_UNLIKELY(entry.state != State::Living)) {
867
+ createInstance();
868
+ }
869
+
870
+ return *entry.ptr;
871
+ }
872
+
873
+ static void createInstance() {
874
+ auto& entry = entryInstance();
875
+
876
+ std::lock_guard<std::mutex> lg(entry.mutex);
877
+ if (entry.state == State::Living) {
878
+ return;
879
+ }
880
+
881
+ if (entry.state == State::NotRegistered) {
882
+ detail::singletonWarnLeakyInstantiatingNotRegisteredAndAbort(entry.type_);
883
+ }
884
+
885
+ entry.ptr = entry.createFunc();
886
+ entry.state = State::Living;
887
+ }
888
+ };
889
+ } // namespace folly
890
+
891
+ #include <folly/Singleton-inl.h>