react-native-windows 0.81.34 → 0.81.37

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 (928) hide show
  1. package/Directory.Build.props +1 -16
  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/Fabric/Composition/TooltipService.cpp +48 -2
  8. package/Microsoft.ReactNative/Fabric/WindowsImageManager.cpp +40 -13
  9. package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj +1 -7
  10. package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj.filters +0 -3
  11. package/Microsoft.ReactNative/TurboModulesProvider.cpp +30 -13
  12. package/PropertySheets/Generated/PackageVersion.g.props +3 -3
  13. package/PropertySheets/React.Cpp.props +3 -3
  14. package/ReactCommon/ReactCommon.vcxproj +0 -10
  15. package/ReactCommon/packages.lock.win32.json +0 -10
  16. package/Scripts/Tfs/Layout-Desktop-Headers.ps1 +4 -37
  17. package/Scripts/creaternwlib.cmd +2 -2
  18. package/Shared/Shared.vcxitems +2 -0
  19. package/{Folly → external}/.clang-format +0 -1
  20. package/external/External.vcxitems +10 -0
  21. package/external/fast-float/.syncignore +10 -0
  22. package/external/fast-float/LICENSE-APACHE +190 -0
  23. package/external/fast-float/LICENSE-BOOST +23 -0
  24. package/external/fast-float/LICENSE-MIT +27 -0
  25. package/external/fast-float/README.md +545 -0
  26. package/external/fast-float/cgmanifest.json +15 -0
  27. package/external/fast-float/fast-float.vcxitems +14 -0
  28. package/external/fast-float/include/fast_float/ascii_number.h +588 -0
  29. package/external/fast-float/include/fast_float/bigint.h +638 -0
  30. package/external/fast-float/include/fast_float/constexpr_feature_detect.h +46 -0
  31. package/external/fast-float/include/fast_float/decimal_to_binary.h +212 -0
  32. package/external/fast-float/include/fast_float/digit_comparison.h +457 -0
  33. package/external/fast-float/include/fast_float/fast_float.h +59 -0
  34. package/external/fast-float/include/fast_float/fast_table.h +708 -0
  35. package/external/fast-float/include/fast_float/float_common.h +1240 -0
  36. package/external/fast-float/include/fast_float/parse_number.h +399 -0
  37. package/external/fast-float/sync-config.json +8 -0
  38. package/external/fmt/.syncignore +10 -0
  39. package/external/fmt/CONTRIBUTING.md +20 -0
  40. package/external/fmt/LICENSE +27 -0
  41. package/external/fmt/README.md +484 -0
  42. package/{fmt → external/fmt}/cgmanifest.json +1 -1
  43. package/external/fmt/doc/ChangeLog-old.md +3290 -0
  44. package/external/fmt/doc/api.md +650 -0
  45. package/external/fmt/doc/fmt.css +61 -0
  46. package/external/fmt/doc/fmt.js +4 -0
  47. package/external/fmt/doc/get-started.md +222 -0
  48. package/external/fmt/doc/index.md +151 -0
  49. package/external/fmt/doc/perf.svg +1 -0
  50. package/external/fmt/doc/python-license.txt +290 -0
  51. package/external/fmt/doc/syntax.md +887 -0
  52. package/external/fmt/fmt.vcxitems +28 -0
  53. package/external/fmt/include/fmt/args.h +228 -0
  54. package/{fmt/TEMP_UntilFmtUpdate/core.h → external/fmt/include/fmt/base.h} +1188 -1036
  55. package/external/fmt/include/fmt/chrono.h +2432 -0
  56. package/external/fmt/include/fmt/color.h +612 -0
  57. package/external/fmt/include/fmt/compile.h +529 -0
  58. package/external/fmt/include/fmt/core.h +5 -0
  59. package/external/fmt/include/fmt/format-inl.h +1928 -0
  60. package/external/fmt/include/fmt/format.h +4427 -0
  61. package/external/fmt/include/fmt/os.h +439 -0
  62. package/external/fmt/include/fmt/ostream.h +211 -0
  63. package/external/fmt/include/fmt/printf.h +656 -0
  64. package/external/fmt/include/fmt/ranges.h +882 -0
  65. package/external/fmt/include/fmt/std.h +699 -0
  66. package/external/fmt/include/fmt/xchar.h +322 -0
  67. package/external/fmt/src/fmt.cc +135 -0
  68. package/external/fmt/src/format.cc +43 -0
  69. package/external/fmt/src/os.cc +403 -0
  70. package/external/fmt/sync-config.json +8 -0
  71. package/external/folly/.syncignore +60 -0
  72. package/external/folly/LICENSE +200 -0
  73. package/external/folly/README.md +263 -0
  74. package/{fmt → external/folly/folly}/.clang-format +0 -1
  75. package/external/folly/folly/AtomicHashArray-inl.h +546 -0
  76. package/external/folly/folly/AtomicHashArray.h +431 -0
  77. package/external/folly/folly/AtomicHashMap-inl.h +653 -0
  78. package/external/folly/folly/AtomicHashMap.h +484 -0
  79. package/external/folly/folly/AtomicIntrusiveLinkedList.h +206 -0
  80. package/external/folly/folly/AtomicLinkedList.h +110 -0
  81. package/external/folly/folly/AtomicUnorderedMap.h +522 -0
  82. package/external/folly/folly/BUCK +1631 -0
  83. package/external/folly/folly/BUILD_MODE.bzl +72 -0
  84. package/external/folly/folly/Benchmark.cpp +986 -0
  85. package/external/folly/folly/Benchmark.h +680 -0
  86. package/external/folly/folly/BenchmarkUtil.h +47 -0
  87. package/external/folly/folly/Bits.h +17 -0
  88. package/external/folly/folly/CMakeLists.txt +110 -0
  89. package/external/folly/folly/CPortability.h +338 -0
  90. package/external/folly/folly/CancellationToken-inl.h +449 -0
  91. package/external/folly/folly/CancellationToken.cpp +250 -0
  92. package/external/folly/folly/CancellationToken.h +365 -0
  93. package/external/folly/folly/Chrono.h +132 -0
  94. package/external/folly/folly/ClockGettimeWrappers.cpp +93 -0
  95. package/external/folly/folly/ClockGettimeWrappers.h +29 -0
  96. package/external/folly/folly/ConcurrentBitSet.h +157 -0
  97. package/external/folly/folly/ConcurrentLazy.h +74 -0
  98. package/external/folly/folly/ConcurrentSkipList-inl.h +341 -0
  99. package/external/folly/folly/ConcurrentSkipList.h +824 -0
  100. package/external/folly/folly/ConstructorCallbackList.h +158 -0
  101. package/external/folly/folly/Conv.h +2026 -0
  102. package/external/folly/folly/CppAttributes.h +170 -0
  103. package/external/folly/folly/CpuId.h +297 -0
  104. package/external/folly/folly/DefaultKeepAliveExecutor.h +172 -0
  105. package/external/folly/folly/Demangle.cpp +255 -0
  106. package/external/folly/folly/Demangle.h +73 -0
  107. package/external/folly/folly/DiscriminatedPtr.h +236 -0
  108. package/external/folly/folly/DynamicConverter.h +17 -0
  109. package/external/folly/folly/Exception.h +150 -0
  110. package/external/folly/folly/ExceptionString.cpp +51 -0
  111. package/external/folly/folly/ExceptionString.h +33 -0
  112. package/external/folly/folly/ExceptionWrapper-inl.h +264 -0
  113. package/external/folly/folly/ExceptionWrapper.cpp +37 -0
  114. package/external/folly/folly/ExceptionWrapper.h +377 -0
  115. package/external/folly/folly/Executor.cpp +111 -0
  116. package/external/folly/folly/Executor.h +351 -0
  117. package/external/folly/folly/Expected.h +1725 -0
  118. package/external/folly/folly/FBString.h +2888 -0
  119. package/external/folly/folly/FBVector.h +17 -0
  120. package/external/folly/folly/File.cpp +180 -0
  121. package/external/folly/folly/File.h +177 -0
  122. package/external/folly/folly/FileUtil.cpp +378 -0
  123. package/external/folly/folly/FileUtil.h +332 -0
  124. package/external/folly/folly/Fingerprint.cpp +135 -0
  125. package/external/folly/folly/Fingerprint.h +289 -0
  126. package/external/folly/folly/FixedString.h +2965 -0
  127. package/external/folly/folly/FollyMemcpy.cpp +30 -0
  128. package/external/folly/folly/FollyMemcpy.h +23 -0
  129. package/external/folly/folly/FollyMemset.cpp +29 -0
  130. package/external/folly/folly/FollyMemset.h +25 -0
  131. package/external/folly/folly/Format-inl.h +1152 -0
  132. package/external/folly/folly/Format.cpp +429 -0
  133. package/external/folly/folly/Format.h +463 -0
  134. package/external/folly/folly/FormatArg.h +285 -0
  135. package/external/folly/folly/FormatTraits.h +65 -0
  136. package/external/folly/folly/Function.h +1159 -0
  137. package/external/folly/folly/GLog.h +85 -0
  138. package/external/folly/folly/GroupVarint.cpp +153 -0
  139. package/external/folly/folly/GroupVarint.h +630 -0
  140. package/external/folly/folly/Hash.h +20 -0
  141. package/external/folly/folly/IPAddress.cpp +490 -0
  142. package/external/folly/folly/IPAddress.h +667 -0
  143. package/external/folly/folly/IPAddressException.h +82 -0
  144. package/external/folly/folly/IPAddressV4.cpp +305 -0
  145. package/external/folly/folly/IPAddressV4.h +495 -0
  146. package/external/folly/folly/IPAddressV6.cpp +541 -0
  147. package/external/folly/folly/IPAddressV6.h +627 -0
  148. package/external/folly/folly/Indestructible.h +164 -0
  149. package/external/folly/folly/IndexedMemPool.h +550 -0
  150. package/external/folly/folly/IntrusiveList.h +17 -0
  151. package/external/folly/folly/Lazy.h +142 -0
  152. package/external/folly/folly/Likely.h +76 -0
  153. package/external/folly/folly/MPMCPipeline.h +280 -0
  154. package/external/folly/folly/MPMCQueue.h +1556 -0
  155. package/external/folly/folly/MacAddress.cpp +188 -0
  156. package/external/folly/folly/MacAddress.h +260 -0
  157. package/external/folly/folly/MapUtil.h +17 -0
  158. package/external/folly/folly/Math.h +258 -0
  159. package/external/folly/folly/MaybeManagedPtr.h +120 -0
  160. package/external/folly/folly/Memory.h +900 -0
  161. package/external/folly/folly/MicroLock.cpp +76 -0
  162. package/external/folly/folly/MicroLock.h +354 -0
  163. package/external/folly/folly/MicroSpinLock.h +17 -0
  164. package/external/folly/folly/MoveWrapper.h +76 -0
  165. package/external/folly/folly/ObserverContainer.h +1026 -0
  166. package/external/folly/folly/Optional.h +743 -0
  167. package/external/folly/folly/Overload.h +325 -0
  168. package/external/folly/folly/PackedSyncPtr.h +147 -0
  169. package/external/folly/folly/Padded.h +464 -0
  170. package/external/folly/folly/Poly-inl.h +230 -0
  171. package/external/folly/folly/Poly.h +1095 -0
  172. package/external/folly/folly/PolyException.h +43 -0
  173. package/external/folly/folly/Portability.h +644 -0
  174. package/external/folly/folly/Preprocessor.h +236 -0
  175. package/external/folly/folly/ProducerConsumerQueue.h +182 -0
  176. package/external/folly/folly/RWSpinLock.h +17 -0
  177. package/external/folly/folly/Random-inl.h +86 -0
  178. package/external/folly/folly/Random.cpp +184 -0
  179. package/external/folly/folly/Random.h +434 -0
  180. package/external/folly/folly/Range.h +1772 -0
  181. package/external/folly/folly/Replaceable.h +636 -0
  182. package/external/folly/folly/ScopeGuard.cpp +29 -0
  183. package/external/folly/folly/ScopeGuard.h +420 -0
  184. package/external/folly/folly/SharedMutex.cpp +81 -0
  185. package/external/folly/folly/SharedMutex.h +1751 -0
  186. package/external/folly/folly/Singleton-inl.h +332 -0
  187. package/external/folly/folly/Singleton.cpp +512 -0
  188. package/external/folly/folly/Singleton.h +891 -0
  189. package/external/folly/folly/SingletonThreadLocal.cpp +53 -0
  190. package/external/folly/folly/SingletonThreadLocal.h +263 -0
  191. package/external/folly/folly/SocketAddress.cpp +786 -0
  192. package/external/folly/folly/SocketAddress.h +768 -0
  193. package/external/folly/folly/SpinLock.h +55 -0
  194. package/external/folly/folly/String-inl.h +668 -0
  195. package/external/folly/folly/String.cpp +777 -0
  196. package/external/folly/folly/String.h +767 -0
  197. package/external/folly/folly/Subprocess.cpp +1142 -0
  198. package/external/folly/folly/Subprocess.h +1055 -0
  199. package/external/folly/folly/Synchronized.h +1833 -0
  200. package/external/folly/folly/SynchronizedPtr.h +106 -0
  201. package/external/folly/folly/ThreadCachedInt.h +175 -0
  202. package/external/folly/folly/ThreadLocal.h +478 -0
  203. package/external/folly/folly/TimeoutQueue.cpp +78 -0
  204. package/external/folly/folly/TimeoutQueue.h +123 -0
  205. package/external/folly/folly/TokenBucket.h +673 -0
  206. package/external/folly/folly/Traits.h +1442 -0
  207. package/external/folly/folly/Try-inl.h +372 -0
  208. package/external/folly/folly/Try.cpp +23 -0
  209. package/external/folly/folly/Try.h +728 -0
  210. package/external/folly/folly/UTF8String.h +56 -0
  211. package/external/folly/folly/Unicode.cpp +201 -0
  212. package/external/folly/folly/Unicode.h +94 -0
  213. package/external/folly/folly/Unit.h +65 -0
  214. package/external/folly/folly/Uri-inl.h +101 -0
  215. package/external/folly/folly/Uri.cpp +190 -0
  216. package/external/folly/folly/Uri.h +142 -0
  217. package/external/folly/folly/Utility.h +932 -0
  218. package/external/folly/folly/VERSION +1 -0
  219. package/external/folly/folly/Varint.h +230 -0
  220. package/external/folly/folly/VirtualExecutor.h +17 -0
  221. package/external/folly/folly/algorithm/simd/BUCK +47 -0
  222. package/external/folly/folly/algorithm/simd/Contains.cpp +42 -0
  223. package/external/folly/folly/algorithm/simd/Contains.h +116 -0
  224. package/external/folly/folly/algorithm/simd/FindFixed.h +301 -0
  225. package/external/folly/folly/algorithm/simd/Ignore.h +52 -0
  226. package/external/folly/folly/algorithm/simd/Movemask.h +207 -0
  227. package/external/folly/folly/algorithm/simd/detail/BUCK +70 -0
  228. package/external/folly/folly/algorithm/simd/detail/ContainsImpl.h +91 -0
  229. package/external/folly/folly/algorithm/simd/detail/SimdAnyOf.h +83 -0
  230. package/external/folly/folly/algorithm/simd/detail/SimdForEach.h +209 -0
  231. package/external/folly/folly/algorithm/simd/detail/SimdPlatform.h +445 -0
  232. package/external/folly/folly/algorithm/simd/detail/Traits.h +125 -0
  233. package/external/folly/folly/algorithm/simd/detail/UnrollUtils.h +126 -0
  234. package/external/folly/folly/base64.h +264 -0
  235. package/external/folly/folly/chrono/BUCK +29 -0
  236. package/external/folly/folly/chrono/Clock.h +65 -0
  237. package/external/folly/folly/chrono/Conv.h +712 -0
  238. package/external/folly/folly/chrono/test/BUCK +26 -0
  239. package/external/folly/folly/chrono/test/ClockTest.cpp +68 -0
  240. package/external/folly/folly/chrono/test/ConvTest.cpp +652 -0
  241. package/external/folly/folly/concurrency/AtomicSharedPtr.h +387 -0
  242. package/external/folly/folly/concurrency/BUCK +170 -0
  243. package/external/folly/folly/concurrency/CacheLocality.h +460 -0
  244. package/external/folly/folly/concurrency/ConcurrentHashMap.h +822 -0
  245. package/external/folly/folly/concurrency/CoreCachedSharedPtr.h +232 -0
  246. package/external/folly/folly/concurrency/DeadlockDetector.cpp +27 -0
  247. package/external/folly/folly/concurrency/DeadlockDetector.h +44 -0
  248. package/external/folly/folly/concurrency/DynamicBoundedQueue.h +751 -0
  249. package/external/folly/folly/concurrency/PriorityUnboundedQueueSet.h +207 -0
  250. package/external/folly/folly/concurrency/ProcessLocalUniqueId.cpp +46 -0
  251. package/external/folly/folly/concurrency/ProcessLocalUniqueId.h +38 -0
  252. package/external/folly/folly/concurrency/SingletonRelaxedCounter.h +325 -0
  253. package/external/folly/folly/concurrency/ThreadCachedSynchronized.h +227 -0
  254. package/external/folly/folly/concurrency/UnboundedQueue.h +891 -0
  255. package/external/folly/folly/concurrency/container/BUCK +77 -0
  256. package/external/folly/folly/concurrency/container/FlatCombiningPriorityQueue.h +426 -0
  257. package/external/folly/folly/concurrency/container/LockFreeRingBuffer.h +306 -0
  258. package/external/folly/folly/concurrency/container/RelaxedConcurrentPriorityQueue.h +1212 -0
  259. package/external/folly/folly/concurrency/container/SingleWriterFixedHashMap.h +322 -0
  260. package/external/folly/folly/concurrency/container/atomic_grow_array.h +564 -0
  261. package/external/folly/folly/concurrency/container/test/BUCK +75 -0
  262. package/external/folly/folly/concurrency/container/test/FlatCombiningPriorityQueueTest.cpp +570 -0
  263. package/external/folly/folly/concurrency/container/test/LockFreeRingBufferTest.cpp +276 -0
  264. package/external/folly/folly/concurrency/container/test/RelaxedConcurrentPriorityQueueTest.cpp +1570 -0
  265. package/external/folly/folly/concurrency/container/test/SingleWriterFixedHashMapTest.cpp +401 -0
  266. package/external/folly/folly/concurrency/container/test/atomic_grow_array_test.cpp +187 -0
  267. package/external/folly/folly/concurrency/detail/AtomicSharedPtr-detail.h +212 -0
  268. package/external/folly/folly/concurrency/detail/ConcurrentHashMap-detail.h +1911 -0
  269. package/external/folly/folly/concurrency/memory/AtomicReadMostlyMainPtr.cpp +43 -0
  270. package/external/folly/folly/concurrency/memory/AtomicReadMostlyMainPtr.h +190 -0
  271. package/external/folly/folly/concurrency/memory/BUCK +53 -0
  272. package/external/folly/folly/concurrency/memory/PrimaryPtr.h +338 -0
  273. package/external/folly/folly/concurrency/memory/ReadMostlySharedPtr.h +511 -0
  274. package/external/folly/folly/concurrency/memory/TLRefCount.h +228 -0
  275. package/external/folly/folly/concurrency/memory/test/AtomicReadMostlyMainPtrBenchmark.cpp +56 -0
  276. package/external/folly/folly/concurrency/memory/test/AtomicReadMostlyMainPtrTest.cpp +454 -0
  277. package/external/folly/folly/concurrency/memory/test/BUCK +95 -0
  278. package/external/folly/folly/concurrency/memory/test/PrimaryPtrTest.cpp +303 -0
  279. package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrBenchmark.cpp +138 -0
  280. package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrStressTest.cpp +75 -0
  281. package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrTest.cpp +378 -0
  282. package/external/folly/folly/concurrency/memory/test/RefCountBenchmark.cpp +90 -0
  283. package/external/folly/folly/concurrency/memory/test/RefCountTest.cpp +168 -0
  284. package/external/folly/folly/concurrency/test/AtomicSharedPtrCounted.h +156 -0
  285. package/external/folly/folly/concurrency/test/AtomicSharedPtrPerformance.cpp +255 -0
  286. package/external/folly/folly/concurrency/test/AtomicSharedPtrTest.cpp +257 -0
  287. package/external/folly/folly/concurrency/test/BUCK +229 -0
  288. package/external/folly/folly/concurrency/test/CacheLocalityBenchmark.cpp +392 -0
  289. package/external/folly/folly/concurrency/test/CacheLocalityTest.cpp +1229 -0
  290. package/external/folly/folly/concurrency/test/ConcurrentHashMapBench.cpp +260 -0
  291. package/external/folly/folly/concurrency/test/ConcurrentHashMapTest.cpp +1242 -0
  292. package/external/folly/folly/concurrency/test/CoreCachedSharedPtrTest.cpp +408 -0
  293. package/external/folly/folly/concurrency/test/DynamicBoundedQueueTest.cpp +984 -0
  294. package/external/folly/folly/concurrency/test/PriorityUnboundedQueueSetTest.cpp +73 -0
  295. package/external/folly/folly/concurrency/test/ProcessLocalUniqueIdTest.cpp +66 -0
  296. package/external/folly/folly/concurrency/test/SingletonRelaxedCounterBench.cpp +101 -0
  297. package/external/folly/folly/concurrency/test/SingletonRelaxedCounterTest.cpp +185 -0
  298. package/external/folly/folly/concurrency/test/ThreadCachedSynchronizedBench.cpp +76 -0
  299. package/external/folly/folly/concurrency/test/ThreadCachedSynchronizedTest.cpp +93 -0
  300. package/external/folly/folly/concurrency/test/UnboundedQueueTest.cpp +1302 -0
  301. package/external/folly/folly/container/Access.h +57 -0
  302. package/external/folly/folly/container/Array.h +87 -0
  303. package/external/folly/folly/container/BUCK +353 -0
  304. package/external/folly/folly/container/BitIterator.h +203 -0
  305. package/external/folly/folly/container/Enumerate.h +162 -0
  306. package/external/folly/folly/container/EvictingCacheMap.h +730 -0
  307. package/external/folly/folly/container/F14.md +300 -0
  308. package/external/folly/folly/container/F14Map-fwd.h +113 -0
  309. package/external/folly/folly/container/F14Map.h +2108 -0
  310. package/external/folly/folly/container/F14Set-fwd.h +95 -0
  311. package/external/folly/folly/container/F14Set.h +1603 -0
  312. package/external/folly/folly/container/FBVector.h +1711 -0
  313. package/external/folly/folly/container/Foreach-inl.h +316 -0
  314. package/external/folly/folly/container/Foreach.h +209 -0
  315. package/external/folly/folly/container/HeterogeneousAccess-fwd.h +33 -0
  316. package/external/folly/folly/container/HeterogeneousAccess.h +171 -0
  317. package/external/folly/folly/container/IntrusiveHeap.h +268 -0
  318. package/external/folly/folly/container/IntrusiveList.h +131 -0
  319. package/external/folly/folly/container/Iterator.h +843 -0
  320. package/external/folly/folly/container/MapUtil.h +376 -0
  321. package/external/folly/folly/container/Merge.h +90 -0
  322. package/external/folly/folly/container/RegexMatchCache.cpp +521 -0
  323. package/external/folly/folly/container/RegexMatchCache.h +699 -0
  324. package/external/folly/folly/container/Reserve.h +109 -0
  325. package/external/folly/folly/container/SparseByteSet.h +123 -0
  326. package/external/folly/folly/container/View.h +81 -0
  327. package/external/folly/folly/container/WeightedEvictingCacheMap.h +651 -0
  328. package/external/folly/folly/container/detail/BUCK +115 -0
  329. package/external/folly/folly/container/detail/BitIteratorDetail.h +87 -0
  330. package/external/folly/folly/container/detail/F14Defaults.h +34 -0
  331. package/external/folly/folly/container/detail/F14IntrinsicsAvailability.h +67 -0
  332. package/external/folly/folly/container/detail/F14MapFallback.h +717 -0
  333. package/external/folly/folly/container/detail/F14Mask.h +235 -0
  334. package/external/folly/folly/container/detail/F14Policy.h +1523 -0
  335. package/external/folly/folly/container/detail/F14SetFallback.h +528 -0
  336. package/external/folly/folly/container/detail/F14Table.cpp +71 -0
  337. package/external/folly/folly/container/detail/F14Table.h +2680 -0
  338. package/external/folly/folly/container/detail/Util.h +303 -0
  339. package/external/folly/folly/container/detail/tape_detail.h +135 -0
  340. package/external/folly/folly/container/detail/test/BUCK +14 -0
  341. package/external/folly/folly/container/detail/test/F14DetailTest.cpp +47 -0
  342. package/external/folly/folly/container/heap_vector_types.h +1683 -0
  343. package/external/folly/folly/container/range_traits.h +81 -0
  344. package/external/folly/folly/container/small_vector.h +1476 -0
  345. package/external/folly/folly/container/sorted_vector_types.h +1652 -0
  346. package/external/folly/folly/container/span.h +408 -0
  347. package/external/folly/folly/container/tape.h +608 -0
  348. package/external/folly/folly/container/test/.clang-tidy +12 -0
  349. package/external/folly/folly/container/test/AccessTest.cpp +138 -0
  350. package/external/folly/folly/container/test/ArrayTest.cpp +84 -0
  351. package/external/folly/folly/container/test/BUCK +568 -0
  352. package/external/folly/folly/container/test/BitIteratorBench.cpp +112 -0
  353. package/external/folly/folly/container/test/BitIteratorTest.cpp +109 -0
  354. package/external/folly/folly/container/test/EnumerateTest.cpp +294 -0
  355. package/external/folly/folly/container/test/EvictingCacheMapBench.cpp +80 -0
  356. package/external/folly/folly/container/test/EvictingCacheMapTest.cpp +842 -0
  357. package/external/folly/folly/container/test/F14AsanSupportTest.cpp +143 -0
  358. package/external/folly/folly/container/test/F14FwdTest.cpp +37 -0
  359. package/external/folly/folly/container/test/F14InterprocessTest.cpp +404 -0
  360. package/external/folly/folly/container/test/F14MapTest.cpp +2543 -0
  361. package/external/folly/folly/container/test/F14PolicyTest.cpp +49 -0
  362. package/external/folly/folly/container/test/F14SetTest.cpp +1738 -0
  363. package/external/folly/folly/container/test/F14SmallOverheads.cpp +215 -0
  364. package/external/folly/folly/container/test/F14TestUtil.h +117 -0
  365. package/external/folly/folly/container/test/FBVectorBenchmark.cpp +380 -0
  366. package/external/folly/folly/container/test/FBVectorBenchmarks.cpp.h +100 -0
  367. package/external/folly/folly/container/test/FBVectorTest.cpp +326 -0
  368. package/external/folly/folly/container/test/FBVectorTests.cpp.h +304 -0
  369. package/external/folly/folly/container/test/ForeachBenchmark.cpp +388 -0
  370. package/external/folly/folly/container/test/ForeachTest.cpp +338 -0
  371. package/external/folly/folly/container/test/HashMapsBench.cpp +458 -0
  372. package/external/folly/folly/container/test/HeterogeneousAccessTest.cpp +242 -0
  373. package/external/folly/folly/container/test/IntrusiveHeapTest.cpp +262 -0
  374. package/external/folly/folly/container/test/IteratorTest.cpp +989 -0
  375. package/external/folly/folly/container/test/MapUtilTest.cpp +365 -0
  376. package/external/folly/folly/container/test/MergeTest.cpp +66 -0
  377. package/external/folly/folly/container/test/RegexMatchCacheTest.cpp +634 -0
  378. package/external/folly/folly/container/test/ReserveTest.cpp +173 -0
  379. package/external/folly/folly/container/test/SparseByteSetBenchmark.cpp +153 -0
  380. package/external/folly/folly/container/test/SparseByteSetTest.cpp +117 -0
  381. package/external/folly/folly/container/test/TrackingTypes.h +584 -0
  382. package/external/folly/folly/container/test/UtilTest.cpp +609 -0
  383. package/external/folly/folly/container/test/WeightedEvictingCacheMapTest.cpp +800 -0
  384. package/external/folly/folly/container/test/heap_vector_types_test.cpp +1774 -0
  385. package/external/folly/folly/container/test/range_traits_test.cpp +59 -0
  386. package/external/folly/folly/container/test/small_vector_test.cpp +1571 -0
  387. package/external/folly/folly/container/test/sorted_vector_test.cpp +1589 -0
  388. package/external/folly/folly/container/test/span_test.cpp +520 -0
  389. package/external/folly/folly/container/test/tape_bench.cpp +200 -0
  390. package/external/folly/folly/container/test/tape_test.cpp +590 -0
  391. package/external/folly/folly/defs.bzl +238 -0
  392. package/external/folly/folly/detail/AsyncTrace.cpp +36 -0
  393. package/external/folly/folly/detail/AsyncTrace.h +44 -0
  394. package/external/folly/folly/detail/AtomicHashUtils.h +42 -0
  395. package/external/folly/folly/detail/AtomicUnorderedMapUtils.h +80 -0
  396. package/external/folly/folly/detail/BUCK +406 -0
  397. package/external/folly/folly/detail/DiscriminatedPtrDetail.h +172 -0
  398. package/external/folly/folly/detail/FileUtilDetail.cpp +63 -0
  399. package/external/folly/folly/detail/FileUtilDetail.h +85 -0
  400. package/external/folly/folly/detail/FileUtilVectorDetail.h +81 -0
  401. package/external/folly/folly/detail/FingerprintPolynomial.h +132 -0
  402. package/external/folly/folly/detail/Futex-inl.h +123 -0
  403. package/external/folly/folly/detail/Futex.cpp +273 -0
  404. package/external/folly/folly/detail/Futex.h +109 -0
  405. package/external/folly/folly/detail/GroupVarintDetail.h +101 -0
  406. package/external/folly/folly/detail/IPAddress.cpp +37 -0
  407. package/external/folly/folly/detail/IPAddress.h +57 -0
  408. package/external/folly/folly/detail/IPAddressSource.h +278 -0
  409. package/external/folly/folly/detail/Iterators.h +156 -0
  410. package/external/folly/folly/detail/MPMCPipelineDetail.h +122 -0
  411. package/external/folly/folly/detail/MemoryIdler.cpp +233 -0
  412. package/external/folly/folly/detail/MemoryIdler.h +216 -0
  413. package/external/folly/folly/detail/PerfScoped.cpp +112 -0
  414. package/external/folly/folly/detail/PerfScoped.h +70 -0
  415. package/external/folly/folly/detail/PolyDetail.h +921 -0
  416. package/external/folly/folly/detail/RangeCommon.cpp +55 -0
  417. package/external/folly/folly/detail/RangeCommon.h +93 -0
  418. package/external/folly/folly/detail/RangeSse42.cpp +198 -0
  419. package/external/folly/folly/detail/RangeSse42.h +30 -0
  420. package/external/folly/folly/detail/SimpleSimdStringUtils.cpp +31 -0
  421. package/external/folly/folly/detail/SimpleSimdStringUtils.h +27 -0
  422. package/external/folly/folly/detail/SimpleSimdStringUtilsImpl.h +63 -0
  423. package/external/folly/folly/detail/Singleton.h +34 -0
  424. package/external/folly/folly/detail/SlowFingerprint.h +90 -0
  425. package/external/folly/folly/detail/SocketFastOpen.cpp +175 -0
  426. package/external/folly/folly/detail/SocketFastOpen.h +89 -0
  427. package/external/folly/folly/detail/SplitStringSimd.cpp +84 -0
  428. package/external/folly/folly/detail/SplitStringSimd.h +151 -0
  429. package/external/folly/folly/detail/SplitStringSimdImpl.h +149 -0
  430. package/external/folly/folly/detail/Sse.cpp +35 -0
  431. package/external/folly/folly/detail/Sse.h +45 -0
  432. package/external/folly/folly/detail/StaticSingletonManager.cpp +119 -0
  433. package/external/folly/folly/detail/StaticSingletonManager.h +298 -0
  434. package/external/folly/folly/detail/ThreadLocalDetail.cpp +492 -0
  435. package/external/folly/folly/detail/ThreadLocalDetail.h +800 -0
  436. package/external/folly/folly/detail/TrapOnAvx512.cpp +41 -0
  437. package/external/folly/folly/detail/TrapOnAvx512.h +21 -0
  438. package/external/folly/folly/detail/TurnSequencer.h +295 -0
  439. package/external/folly/folly/detail/TypeList.h +551 -0
  440. package/external/folly/folly/detail/UniqueInstance.cpp +136 -0
  441. package/external/folly/folly/detail/UniqueInstance.h +68 -0
  442. package/external/folly/folly/detail/base64_detail/BUCK +102 -0
  443. package/external/folly/folly/detail/base64_detail/Base64Api.cpp +40 -0
  444. package/external/folly/folly/detail/base64_detail/Base64Api.h +101 -0
  445. package/external/folly/folly/detail/base64_detail/Base64Common.h +80 -0
  446. package/external/folly/folly/detail/base64_detail/Base64Constants.h +79 -0
  447. package/external/folly/folly/detail/base64_detail/Base64HiddenConstants.h +129 -0
  448. package/external/folly/folly/detail/base64_detail/Base64SWAR.cpp +161 -0
  449. package/external/folly/folly/detail/base64_detail/Base64SWAR.h +32 -0
  450. package/external/folly/folly/detail/base64_detail/Base64Scalar.h +262 -0
  451. package/external/folly/folly/detail/base64_detail/Base64Simd.h +102 -0
  452. package/external/folly/folly/detail/base64_detail/Base64_SSE4_2.cpp +42 -0
  453. package/external/folly/folly/detail/base64_detail/Base64_SSE4_2.h +33 -0
  454. package/external/folly/folly/detail/base64_detail/Base64_SSE4_2_Platform.h +167 -0
  455. package/external/folly/folly/detail/base64_detail/README.md +392 -0
  456. package/external/folly/folly/detail/base64_detail/tests/BUCK +36 -0
  457. package/external/folly/folly/detail/base64_detail/tests/Base64AgainstScalarTest.cpp +141 -0
  458. package/external/folly/folly/detail/base64_detail/tests/Base64PlatformTest.cpp +273 -0
  459. package/external/folly/folly/detail/base64_detail/tests/Base64SpecialCasesTest.cpp +555 -0
  460. package/external/folly/folly/detail/test/AsyncTraceTest.cpp +43 -0
  461. package/external/folly/folly/detail/test/BUCK +118 -0
  462. package/external/folly/folly/detail/test/FileUtilDetailTest.cpp +56 -0
  463. package/external/folly/folly/detail/test/PerfScopedTest.cpp +107 -0
  464. package/external/folly/folly/detail/test/SimpleSimdStringUtilsTest.cpp +92 -0
  465. package/external/folly/folly/detail/test/SplitStringSimdTest.cpp +242 -0
  466. package/external/folly/folly/detail/test/StaticSingletonManagerTest.cpp +121 -0
  467. package/external/folly/folly/detail/test/ThreadLocalBenchmark.cpp +116 -0
  468. package/external/folly/folly/detail/test/ThreadLocalDetailTest.cpp +194 -0
  469. package/external/folly/folly/detail/test/TrapOnAvx512TestNegative.cpp +29 -0
  470. package/external/folly/folly/detail/test/UniqueInstanceTest.cpp +60 -0
  471. package/external/folly/folly/detail/thread_local_globals.cpp +69 -0
  472. package/external/folly/folly/detail/thread_local_globals.h +36 -0
  473. package/external/folly/folly/docs/AtomicHashMap.md +134 -0
  474. package/external/folly/folly/docs/Benchmark.md +310 -0
  475. package/external/folly/folly/docs/Conv.md +291 -0
  476. package/external/folly/folly/docs/Dynamic.md +220 -0
  477. package/external/folly/folly/docs/DynamicConverter.md +71 -0
  478. package/external/folly/folly/docs/Executors.md +63 -0
  479. package/external/folly/folly/docs/FBString.md +46 -0
  480. package/external/folly/folly/docs/FBVector.md +200 -0
  481. package/external/folly/folly/docs/Fbvector--graphical_solutions.png +0 -0
  482. package/external/folly/folly/docs/Format.md +177 -0
  483. package/external/folly/folly/docs/Function.md +92 -0
  484. package/external/folly/folly/docs/Futures.md +263 -0
  485. package/external/folly/folly/docs/GroupVarint.md +46 -0
  486. package/external/folly/folly/docs/Histogram.md +104 -0
  487. package/external/folly/folly/docs/MapUtils.md +80 -0
  488. package/external/folly/folly/docs/Overview.md +263 -0
  489. package/external/folly/folly/docs/PackedSyncPtr.md +77 -0
  490. package/external/folly/folly/docs/Poly.md +500 -0
  491. package/external/folly/folly/docs/ProducerConsumerQueue.md +82 -0
  492. package/external/folly/folly/docs/Rcu.md +218 -0
  493. package/external/folly/folly/docs/SmallLocks.md +24 -0
  494. package/external/folly/folly/docs/Synchronized.md +793 -0
  495. package/external/folly/folly/docs/ThreadCachedInt.md +98 -0
  496. package/external/folly/folly/docs/ThreadLocal.md +105 -0
  497. package/external/folly/folly/docs/Traits.md +161 -0
  498. package/external/folly/folly/docs/small_vector.md +64 -0
  499. package/external/folly/folly/docs/style.css +23 -0
  500. package/external/folly/folly/dynamic-inl.h +17 -0
  501. package/external/folly/folly/dynamic.h +17 -0
  502. package/external/folly/folly/folly_extended_library.bzl +28 -0
  503. package/external/folly/folly/functional/ApplyTuple.h +204 -0
  504. package/external/folly/folly/functional/BUCK +57 -0
  505. package/external/folly/folly/functional/Invoke.h +880 -0
  506. package/external/folly/folly/functional/Partial.h +130 -0
  507. package/external/folly/folly/functional/protocol.h +203 -0
  508. package/external/folly/folly/functional/test/ApplyTupleTest.cpp +549 -0
  509. package/external/folly/folly/functional/test/BUCK +57 -0
  510. package/external/folly/folly/functional/test/InvokeTest.cpp +483 -0
  511. package/external/folly/folly/functional/test/PartialTest.cpp +141 -0
  512. package/external/folly/folly/functional/test/protocol_test.cpp +177 -0
  513. package/external/folly/folly/functional/test/traits_test.cpp +551 -0
  514. package/external/folly/folly/functional/traits.h +675 -0
  515. package/external/folly/folly/hash/BUCK +86 -0
  516. package/external/folly/folly/hash/Checksum.cpp +275 -0
  517. package/external/folly/folly/hash/Checksum.h +94 -0
  518. package/external/folly/folly/hash/FarmHash.h +46 -0
  519. package/external/folly/folly/hash/Hash.h +1045 -0
  520. package/external/folly/folly/hash/MurmurHash.h +86 -0
  521. package/external/folly/folly/hash/SpookyHashV1.cpp +391 -0
  522. package/external/folly/folly/hash/SpookyHashV1.h +307 -0
  523. package/external/folly/folly/hash/SpookyHashV2.cpp +392 -0
  524. package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/hash/SpookyHashV2.h +6 -1
  525. package/external/folly/folly/hash/detail/BUCK +26 -0
  526. package/external/folly/folly/hash/detail/ChecksumDetail.cpp +296 -0
  527. package/external/folly/folly/hash/detail/ChecksumDetail.h +137 -0
  528. package/external/folly/folly/hash/detail/Crc32CombineDetail.cpp +191 -0
  529. package/external/folly/folly/hash/detail/Crc32cDetail.cpp +303 -0
  530. package/external/folly/folly/hash/test/BUCK +132 -0
  531. package/external/folly/folly/hash/test/ChecksumBenchmark.cpp +91 -0
  532. package/external/folly/folly/hash/test/ChecksumTest.cpp +587 -0
  533. package/external/folly/folly/hash/test/FarmHashTest.cpp +41 -0
  534. package/external/folly/folly/hash/test/HashBenchmark.cpp +238 -0
  535. package/external/folly/folly/hash/test/HashTest.cpp +997 -0
  536. package/external/folly/folly/hash/test/MurmurHashTest.cpp +76 -0
  537. package/external/folly/folly/hash/test/SpookyHashV1Test.cpp +559 -0
  538. package/external/folly/folly/hash/test/SpookyHashV2Test.cpp +549 -0
  539. package/external/folly/folly/hash/test/traits_test.cpp +69 -0
  540. package/external/folly/folly/hash/traits.h +115 -0
  541. package/external/folly/folly/json/BUCK +155 -0
  542. package/external/folly/folly/json/DynamicConverter.h +464 -0
  543. package/external/folly/folly/json/DynamicParser-inl.h +316 -0
  544. package/external/folly/folly/json/DynamicParser.cpp +198 -0
  545. package/external/folly/folly/json/DynamicParser.h +394 -0
  546. package/external/folly/folly/json/JSONSchema.cpp +1030 -0
  547. package/external/folly/folly/json/JSONSchema.h +73 -0
  548. package/external/folly/folly/json/JsonMockUtil.h +73 -0
  549. package/external/folly/folly/json/JsonTestUtil.cpp +167 -0
  550. package/external/folly/folly/json/JsonTestUtil.h +88 -0
  551. package/external/folly/folly/json/bser/BUCK +24 -0
  552. package/external/folly/folly/json/bser/Bser.h +107 -0
  553. package/external/folly/folly/json/bser/Dump.cpp +253 -0
  554. package/external/folly/folly/json/bser/Load.cpp +246 -0
  555. package/external/folly/folly/json/bser/test/BUCK +14 -0
  556. package/external/folly/folly/json/bser/test/BserTest.cpp +149 -0
  557. package/external/folly/folly/json/dynamic.cpp +552 -0
  558. package/external/folly/folly/json/dynamic.h +1346 -0
  559. package/external/folly/folly/json/json.h +238 -0
  560. package/external/folly/folly/json/json_patch.cpp +325 -0
  561. package/external/folly/folly/json/json_patch.h +126 -0
  562. package/external/folly/folly/json/json_pointer.cpp +114 -0
  563. package/external/folly/folly/json/json_pointer.h +87 -0
  564. package/external/folly/folly/json/test/BUCK +147 -0
  565. package/external/folly/folly/json/test/DynamicBenchmark.cpp +146 -0
  566. package/external/folly/folly/json/test/DynamicConverterTest.cpp +518 -0
  567. package/external/folly/folly/json/test/DynamicOtherTest.cpp +344 -0
  568. package/external/folly/folly/json/test/DynamicParserTest.cpp +443 -0
  569. package/external/folly/folly/json/test/DynamicTest.cpp +1647 -0
  570. package/external/folly/folly/json/test/JSONSchemaTest.cpp +450 -0
  571. package/external/folly/folly/json/test/JsonBenchmark.cpp +264 -0
  572. package/external/folly/folly/json/test/JsonOtherTest.cpp +51 -0
  573. package/external/folly/folly/json/test/JsonTest.cpp +1153 -0
  574. package/external/folly/folly/json/test/JsonTestUtilTest.cpp +97 -0
  575. package/external/folly/folly/json/test/json_patch_test.cpp +361 -0
  576. package/external/folly/folly/json/test/json_pointer_test.cpp +58 -0
  577. package/external/folly/folly/json/tool/BUCK +13 -0
  578. package/external/folly/folly/json/tool/JSONSchemaTester.cpp +58 -0
  579. package/external/folly/folly/json.h +17 -0
  580. package/external/folly/folly/json_patch.h +17 -0
  581. package/external/folly/folly/json_pointer.h +17 -0
  582. package/external/folly/folly/lang/Access.h +29 -0
  583. package/external/folly/folly/lang/Align.h +240 -0
  584. package/external/folly/folly/lang/Aligned.h +92 -0
  585. package/external/folly/folly/lang/Assume.h +82 -0
  586. package/external/folly/folly/lang/BUCK +287 -0
  587. package/external/folly/folly/lang/Badge.h +108 -0
  588. package/external/folly/folly/lang/Bits.h +570 -0
  589. package/external/folly/folly/lang/BitsClass.h +312 -0
  590. package/external/folly/folly/lang/Builtin.h +74 -0
  591. package/external/folly/folly/lang/CArray.h +34 -0
  592. package/external/folly/folly/lang/CString.cpp +86 -0
  593. package/external/folly/folly/lang/CString.h +55 -0
  594. package/external/folly/folly/lang/Cast.h +51 -0
  595. package/external/folly/folly/lang/CheckedMath.h +253 -0
  596. package/external/folly/folly/lang/CustomizationPoint.h +58 -0
  597. package/external/folly/folly/lang/Exception.cpp +822 -0
  598. package/external/folly/folly/lang/Exception.h +716 -0
  599. package/external/folly/folly/lang/Extern.h +55 -0
  600. package/external/folly/folly/lang/Hint-inl.h +144 -0
  601. package/external/folly/folly/lang/Hint.h +238 -0
  602. package/external/folly/folly/lang/Keep.h +98 -0
  603. package/external/folly/folly/lang/New.h +124 -0
  604. package/external/folly/folly/lang/Ordering.h +140 -0
  605. package/external/folly/folly/lang/Pretty.h +159 -0
  606. package/external/folly/folly/lang/PropagateConst.h +413 -0
  607. package/external/folly/folly/lang/RValueReferenceWrapper.h +152 -0
  608. package/external/folly/folly/lang/SafeAssert.cpp +589 -0
  609. package/external/folly/folly/lang/StaticConst.h +33 -0
  610. package/external/folly/folly/lang/Thunk.h +100 -0
  611. package/external/folly/folly/lang/TypeInfo.h +58 -0
  612. package/external/folly/folly/lang/UncaughtExceptions.cpp +17 -0
  613. package/external/folly/folly/lang/UncaughtExceptions.h +19 -0
  614. package/external/folly/folly/lang/test/AlignTest.cpp +87 -0
  615. package/external/folly/folly/lang/test/AlignedTest.cpp +130 -0
  616. package/external/folly/folly/lang/test/BUCK +258 -0
  617. package/external/folly/folly/lang/test/BadgeTest.cpp +89 -0
  618. package/external/folly/folly/lang/test/BitsBenchmark.cpp +164 -0
  619. package/external/folly/folly/lang/test/BitsClassBenchmark.cpp +122 -0
  620. package/external/folly/folly/lang/test/BitsClassTest.cpp +379 -0
  621. package/external/folly/folly/lang/test/BitsTest.cpp +577 -0
  622. package/external/folly/folly/lang/test/CStringTest.cpp +60 -0
  623. package/external/folly/folly/lang/test/CastTest.cpp +47 -0
  624. package/external/folly/folly/lang/test/CheckedMathTest.cpp +394 -0
  625. package/external/folly/folly/lang/test/ExceptionBench.cpp +427 -0
  626. package/external/folly/folly/lang/test/ExceptionTest.cpp +413 -0
  627. package/external/folly/folly/lang/test/ExternTest.cpp +39 -0
  628. package/external/folly/folly/lang/test/HintTest.cpp +100 -0
  629. package/external/folly/folly/lang/test/NewTest.cpp +38 -0
  630. package/external/folly/folly/lang/test/OrderingTest.cpp +105 -0
  631. package/external/folly/folly/lang/test/PrettyTest.cpp +44 -0
  632. package/external/folly/folly/lang/test/PropagateConstTest.cpp +356 -0
  633. package/external/folly/folly/lang/test/RValueReferenceWrapperTest.cpp +85 -0
  634. package/external/folly/folly/lang/test/SafeAssertTest.cpp +75 -0
  635. package/external/folly/folly/lang/test/ThunkTest.cpp +105 -0
  636. package/external/folly/folly/lang/test/ToAsciiBench.cpp +466 -0
  637. package/external/folly/folly/lang/test/ToAsciiTest.cpp +266 -0
  638. package/external/folly/folly/lang/test/TypeInfoTest.cpp +56 -0
  639. package/external/folly/folly/memcpy.S +292 -0
  640. package/external/folly/folly/memcpy_select_aarch64.cpp +145 -0
  641. package/external/folly/folly/memory/Arena-inl.h +83 -0
  642. package/external/folly/folly/memory/Arena.h +325 -0
  643. package/external/folly/folly/memory/BUCK +191 -0
  644. package/external/folly/folly/memory/JemallocHugePageAllocator.cpp +449 -0
  645. package/external/folly/folly/memory/JemallocHugePageAllocator.h +105 -0
  646. package/external/folly/folly/memory/JemallocHugePageAllocatorTest.cpp +341 -0
  647. package/external/folly/folly/memory/JemallocNodumpAllocator.cpp +176 -0
  648. package/external/folly/folly/memory/JemallocNodumpAllocator.h +119 -0
  649. package/external/folly/folly/memory/JemallocNodumpAllocatorTest.cpp +61 -0
  650. package/external/folly/folly/memory/MallctlHelper.cpp +37 -0
  651. package/external/folly/folly/memory/MallctlHelper.h +167 -0
  652. package/external/folly/folly/memory/Malloc.h +551 -0
  653. package/external/folly/folly/memory/MemoryResource.h +57 -0
  654. package/external/folly/folly/memory/ReentrantAllocator.cpp +162 -0
  655. package/external/folly/folly/memory/ReentrantAllocator.h +261 -0
  656. package/external/folly/folly/memory/SanitizeAddress.cpp +75 -0
  657. package/external/folly/folly/memory/SanitizeAddress.h +117 -0
  658. package/external/folly/folly/memory/SanitizeLeak.cpp +119 -0
  659. package/external/folly/folly/memory/SanitizeLeak.h +108 -0
  660. package/external/folly/folly/memory/ThreadCachedArena.cpp +53 -0
  661. package/external/folly/folly/memory/ThreadCachedArena.h +90 -0
  662. package/external/folly/folly/memory/UninitializedMemoryHacks.h +426 -0
  663. package/external/folly/folly/memory/detail/BUCK +10 -0
  664. package/external/folly/folly/memory/detail/MallocImpl.cpp +52 -0
  665. package/external/folly/folly/memory/detail/MallocImpl.h +97 -0
  666. package/external/folly/folly/memory/not_null-inl.h +522 -0
  667. package/external/folly/folly/memory/not_null.h +449 -0
  668. package/external/folly/folly/memory/test/ArenaTest.cpp +354 -0
  669. package/external/folly/folly/memory/test/BUCK +146 -0
  670. package/external/folly/folly/memory/test/MallctlHelperTest.cpp +169 -0
  671. package/external/folly/folly/memory/test/MallocBenchmark.cpp +91 -0
  672. package/external/folly/folly/memory/test/MallocTest.cpp +78 -0
  673. package/external/folly/folly/memory/test/MemoryResourceTest.cpp +31 -0
  674. package/external/folly/folly/memory/test/ReentrantAllocatorTest.cpp +144 -0
  675. package/external/folly/folly/memory/test/SanitizeAddressTest.cpp +67 -0
  676. package/external/folly/folly/memory/test/SanitizeLeakTest.cpp +139 -0
  677. package/external/folly/folly/memory/test/ThreadCachedArenaTest.cpp +276 -0
  678. package/external/folly/folly/memory/test/UninitializedMemoryHacksODR.cpp +21 -0
  679. package/external/folly/folly/memory/test/UninitializedMemoryHacksTest.cpp +327 -0
  680. package/external/folly/folly/memory/test/not_null_test.cpp +608 -0
  681. package/external/folly/folly/memset.S +245 -0
  682. package/external/folly/folly/memset_select_aarch64.cpp +72 -0
  683. package/external/folly/folly/portability/Asm.h +50 -0
  684. package/external/folly/folly/portability/Atomic.h +31 -0
  685. package/external/folly/folly/portability/BUCK +456 -0
  686. package/external/folly/folly/portability/Builtins.cpp +31 -0
  687. package/external/folly/folly/portability/Builtins.h +161 -0
  688. package/external/folly/folly/portability/Config.h +43 -0
  689. package/external/folly/folly/portability/Constexpr.h +145 -0
  690. package/external/folly/folly/portability/Dirent.cpp +140 -0
  691. package/external/folly/folly/portability/Dirent.h +41 -0
  692. package/external/folly/folly/portability/Event.h +44 -0
  693. package/external/folly/folly/portability/Fcntl.cpp +120 -0
  694. package/external/folly/folly/portability/Fcntl.h +67 -0
  695. package/external/folly/folly/portability/Filesystem.cpp +67 -0
  696. package/external/folly/folly/portability/Filesystem.h +114 -0
  697. package/external/folly/folly/portability/FmtCompile.h +40 -0
  698. package/external/folly/folly/portability/GFlags.h +139 -0
  699. package/external/folly/folly/portability/GMock.h +35 -0
  700. package/external/folly/folly/portability/GTest.h +35 -0
  701. package/external/folly/folly/portability/IOVec.h +34 -0
  702. package/external/folly/folly/portability/Libgen.cpp +59 -0
  703. package/external/folly/folly/portability/Libgen.h +29 -0
  704. package/external/folly/folly/portability/Libunwind.h +21 -0
  705. package/external/folly/folly/portability/Malloc.cpp +31 -0
  706. package/external/folly/folly/portability/Malloc.h +53 -0
  707. package/external/folly/folly/portability/Math.h +90 -0
  708. package/external/folly/folly/portability/Memory.h +26 -0
  709. package/external/folly/folly/portability/OpenSSL.cpp +17 -0
  710. package/external/folly/folly/portability/OpenSSL.h +102 -0
  711. package/external/folly/folly/portability/PThread.cpp +697 -0
  712. package/external/folly/folly/portability/PThread.h +148 -0
  713. package/external/folly/folly/portability/README.md +21 -0
  714. package/external/folly/folly/portability/Sched.cpp +41 -0
  715. package/external/folly/folly/portability/Sched.h +45 -0
  716. package/external/folly/folly/portability/Sockets.cpp +245 -0
  717. package/external/folly/folly/portability/Sockets.h +155 -0
  718. package/external/folly/folly/portability/SourceLocation.h +49 -0
  719. package/external/folly/folly/portability/Stdio.cpp +77 -0
  720. package/external/folly/folly/portability/Stdio.h +32 -0
  721. package/external/folly/folly/portability/Stdlib.cpp +172 -0
  722. package/external/folly/folly/portability/Stdlib.h +64 -0
  723. package/external/folly/folly/portability/String.cpp +53 -0
  724. package/external/folly/folly/portability/String.h +39 -0
  725. package/external/folly/folly/portability/SysFile.cpp +46 -0
  726. package/external/folly/folly/portability/SysFile.h +27 -0
  727. package/external/folly/folly/portability/SysMembarrier.cpp +104 -0
  728. package/external/folly/folly/portability/SysMembarrier.h +26 -0
  729. package/external/folly/folly/portability/SysMman.cpp +242 -0
  730. package/external/folly/folly/portability/SysMman.h +68 -0
  731. package/external/folly/folly/portability/SysResource.cpp +108 -0
  732. package/external/folly/folly/portability/SysResource.h +71 -0
  733. package/external/folly/folly/portability/SysStat.cpp +66 -0
  734. package/external/folly/folly/portability/SysStat.h +52 -0
  735. package/external/folly/folly/portability/SysSyscall.h +73 -0
  736. package/external/folly/folly/portability/SysTime.cpp +62 -0
  737. package/external/folly/folly/portability/SysTime.h +50 -0
  738. package/external/folly/folly/portability/SysTypes.h +44 -0
  739. package/external/folly/folly/portability/SysUio.cpp +179 -0
  740. package/external/folly/folly/portability/SysUio.h +51 -0
  741. package/external/folly/folly/portability/Syslog.h +39 -0
  742. package/external/folly/folly/portability/Time.cpp +357 -0
  743. package/external/folly/folly/portability/Time.h +74 -0
  744. package/external/folly/folly/portability/Unistd.h +111 -0
  745. package/external/folly/folly/portability/Windows.h +108 -0
  746. package/external/folly/folly/portability/openat2.c +30 -0
  747. package/external/folly/folly/portability/openat2.h +39 -0
  748. package/external/folly/folly/portability/test/BUCK +59 -0
  749. package/external/folly/folly/portability/test/ConstexprTest.cpp +102 -0
  750. package/external/folly/folly/portability/test/FilesystemTest.cpp +35 -0
  751. package/external/folly/folly/portability/test/LibgenTest.cpp +35 -0
  752. package/external/folly/folly/portability/test/OpenSSLPortabilityTest.cpp +108 -0
  753. package/external/folly/folly/portability/test/PThreadTest.cpp +80 -0
  754. package/external/folly/folly/portability/test/TimeTest.cpp +90 -0
  755. package/external/folly/folly/small_vector.h +17 -0
  756. package/external/folly/folly/somerge_defs.bzl +399 -0
  757. package/external/folly/folly/sorted_vector_types.h +17 -0
  758. package/external/folly/folly/stop_watch.h +317 -0
  759. package/external/folly/folly/synchronization/AsymmetricThreadFence.cpp +91 -0
  760. package/external/folly/folly/synchronization/AsymmetricThreadFence.h +60 -0
  761. package/external/folly/folly/synchronization/AtomicNotification-inl.h +146 -0
  762. package/external/folly/folly/synchronization/AtomicNotification.cpp +34 -0
  763. package/external/folly/folly/synchronization/AtomicNotification.h +117 -0
  764. package/external/folly/folly/synchronization/AtomicRef.h +181 -0
  765. package/external/folly/folly/synchronization/AtomicStruct.h +150 -0
  766. package/external/folly/folly/synchronization/AtomicUtil-inl.h +482 -0
  767. package/external/folly/folly/synchronization/AtomicUtil.h +179 -0
  768. package/external/folly/folly/synchronization/BUCK +418 -0
  769. package/external/folly/folly/synchronization/Baton.h +419 -0
  770. package/external/folly/folly/synchronization/CallOnce.h +263 -0
  771. package/external/folly/folly/synchronization/DelayedInit.h +179 -0
  772. package/external/folly/folly/synchronization/DistributedMutex-inl.h +1744 -0
  773. package/external/folly/folly/synchronization/DistributedMutex.cpp +27 -0
  774. package/external/folly/folly/synchronization/DistributedMutex.h +342 -0
  775. package/external/folly/folly/synchronization/EventCount.h +200 -0
  776. package/external/folly/folly/synchronization/FlatCombining.h +629 -0
  777. package/external/folly/folly/synchronization/Hazptr-fwd.h +217 -0
  778. package/external/folly/folly/synchronization/Hazptr.cpp +36 -0
  779. package/external/folly/folly/synchronization/Hazptr.h +209 -0
  780. package/external/folly/folly/synchronization/HazptrDomain.cpp +68 -0
  781. package/external/folly/folly/synchronization/HazptrDomain.h +832 -0
  782. package/external/folly/folly/synchronization/HazptrHolder.h +431 -0
  783. package/external/folly/folly/synchronization/HazptrObj.h +533 -0
  784. package/external/folly/folly/synchronization/HazptrObjLinked.h +315 -0
  785. package/external/folly/folly/synchronization/HazptrRec.h +68 -0
  786. package/external/folly/folly/synchronization/HazptrThrLocal.h +180 -0
  787. package/external/folly/folly/synchronization/HazptrThreadPoolExecutor.cpp +46 -0
  788. package/external/folly/folly/synchronization/HazptrThreadPoolExecutor.h +25 -0
  789. package/external/folly/folly/synchronization/Latch.h +160 -0
  790. package/external/folly/folly/synchronization/LifoSem.h +767 -0
  791. package/external/folly/folly/synchronization/Lock.h +887 -0
  792. package/external/folly/folly/synchronization/MicroSpinLock.h +154 -0
  793. package/external/folly/folly/synchronization/NativeSemaphore.h +187 -0
  794. package/external/folly/folly/synchronization/ParkingLot.cpp +37 -0
  795. package/external/folly/folly/synchronization/ParkingLot.h +330 -0
  796. package/external/folly/folly/synchronization/PicoSpinLock.h +167 -0
  797. package/external/folly/folly/synchronization/RWSpinLock.h +549 -0
  798. package/external/folly/folly/synchronization/Rcu.cpp +26 -0
  799. package/external/folly/folly/synchronization/Rcu.h +553 -0
  800. package/external/folly/folly/synchronization/RelaxedAtomic.h +336 -0
  801. package/external/folly/folly/synchronization/SanitizeThread.cpp +141 -0
  802. package/external/folly/folly/synchronization/SanitizeThread.h +166 -0
  803. package/external/folly/folly/synchronization/SaturatingSemaphore.h +324 -0
  804. package/external/folly/folly/synchronization/SmallLocks.h +36 -0
  805. package/external/folly/folly/synchronization/ThrottledLifoSem.h +362 -0
  806. package/external/folly/folly/synchronization/WaitOptions.cpp +25 -0
  807. package/external/folly/folly/synchronization/WaitOptions.h +75 -0
  808. package/external/folly/folly/synchronization/detail/AtomicUtils.h +59 -0
  809. package/external/folly/folly/synchronization/detail/BUCK +104 -0
  810. package/external/folly/folly/synchronization/detail/Hardware.cpp +192 -0
  811. package/external/folly/folly/synchronization/detail/Hardware.h +75 -0
  812. package/external/folly/folly/synchronization/detail/HazptrUtils.h +339 -0
  813. package/external/folly/folly/synchronization/detail/InlineFunctionRef.h +229 -0
  814. package/external/folly/folly/synchronization/detail/Sleeper.cpp +27 -0
  815. package/external/folly/folly/synchronization/detail/Sleeper.h +62 -0
  816. package/external/folly/folly/synchronization/detail/Spin.h +96 -0
  817. package/external/folly/folly/synchronization/detail/ThreadCachedLists.h +174 -0
  818. package/external/folly/folly/synchronization/detail/ThreadCachedReaders.h +189 -0
  819. package/external/folly/folly/synchronization/detail/ThreadCachedTag.h +26 -0
  820. package/external/folly/folly/synchronization/detail/test/BUCK +28 -0
  821. package/external/folly/folly/synchronization/detail/test/HardwareTest.cpp +74 -0
  822. package/external/folly/folly/synchronization/detail/test/InlineFunctionRefTest.cpp +286 -0
  823. package/external/folly/folly/synchronization/example/BUCK +27 -0
  824. package/external/folly/folly/synchronization/example/HazptrLockFreeLIFO.h +88 -0
  825. package/external/folly/folly/synchronization/example/HazptrSWMRSet.h +133 -0
  826. package/external/folly/folly/synchronization/example/HazptrWideCAS.h +62 -0
  827. package/external/folly/folly/synchronization/test/AtomicNotificationTest.cpp +236 -0
  828. package/external/folly/folly/synchronization/test/AtomicRefTest.cpp +170 -0
  829. package/external/folly/folly/synchronization/test/AtomicStructTest.cpp +65 -0
  830. package/external/folly/folly/synchronization/test/AtomicUtilBench.cpp +457 -0
  831. package/external/folly/folly/synchronization/test/AtomicUtilTest.cpp +650 -0
  832. package/external/folly/folly/synchronization/test/BUCK +495 -0
  833. package/external/folly/folly/synchronization/test/Barrier.h +52 -0
  834. package/external/folly/folly/synchronization/test/BarrierTest.cpp +56 -0
  835. package/external/folly/folly/synchronization/test/BatonBenchmark.cpp +77 -0
  836. package/external/folly/folly/synchronization/test/BatonTest.cpp +164 -0
  837. package/external/folly/folly/synchronization/test/BatonTestHelpers.h +118 -0
  838. package/external/folly/folly/synchronization/test/CallOnceBenchmark.cpp +72 -0
  839. package/external/folly/folly/synchronization/test/CallOnceTest.cpp +153 -0
  840. package/external/folly/folly/synchronization/test/DelayedInitTest.cpp +281 -0
  841. package/external/folly/folly/synchronization/test/DistributedMutexTest.cpp +2074 -0
  842. package/external/folly/folly/synchronization/test/EventCountTest.cpp +124 -0
  843. package/external/folly/folly/synchronization/test/FlatCombiningBenchmark.cpp +1789 -0
  844. package/external/folly/folly/synchronization/test/FlatCombiningExamples.h +222 -0
  845. package/external/folly/folly/synchronization/test/FlatCombiningTest.cpp +121 -0
  846. package/external/folly/folly/synchronization/test/FlatCombiningTestHelpers.h +227 -0
  847. package/external/folly/folly/synchronization/test/HazptrTest.cpp +1689 -0
  848. package/external/folly/folly/synchronization/test/LatchTest.cpp +224 -0
  849. package/external/folly/folly/synchronization/test/LifoSemBench.cpp +185 -0
  850. package/external/folly/folly/synchronization/test/LifoSemTests.cpp +353 -0
  851. package/external/folly/folly/synchronization/test/LockTest.cpp +1239 -0
  852. package/external/folly/folly/synchronization/test/NativeSemaphoreTest.cpp +37 -0
  853. package/external/folly/folly/synchronization/test/ParkingLotBenchmark.cpp +239 -0
  854. package/external/folly/folly/synchronization/test/ParkingLotTest.cpp +170 -0
  855. package/external/folly/folly/synchronization/test/RWSpinLockTest.cpp +235 -0
  856. package/external/folly/folly/synchronization/test/RcuBench.cpp +66 -0
  857. package/external/folly/folly/synchronization/test/RcuTest.cpp +330 -0
  858. package/external/folly/folly/synchronization/test/RelaxedAtomicTest.cpp +389 -0
  859. package/external/folly/folly/synchronization/test/SaturatingSemaphoreTest.cpp +166 -0
  860. package/external/folly/folly/synchronization/test/Semaphore.h +242 -0
  861. package/external/folly/folly/synchronization/test/SemaphoreTest.cpp +271 -0
  862. package/external/folly/folly/synchronization/test/SmallLocksBenchmark.cpp +1296 -0
  863. package/external/folly/folly/synchronization/test/SmallLocksTest.cpp +510 -0
  864. package/external/folly/folly/synchronization/test/ThreadCachedEpochBench.h +67 -0
  865. package/external/folly/folly/synchronization/test/ThreadCachedReadersBench.cpp +42 -0
  866. package/external/folly/folly/synchronization/test/ThreadCachedReadersTest.cpp +52 -0
  867. package/external/folly/folly/synchronization/test/ThrottledLifoSemTest.cpp +243 -0
  868. package/external/folly/folly/system/AtFork.cpp +205 -0
  869. package/external/folly/folly/system/AtFork.h +116 -0
  870. package/external/folly/folly/system/AuxVector.h +198 -0
  871. package/external/folly/folly/system/BUCK +144 -0
  872. package/external/folly/folly/system/EnvUtil.cpp +93 -0
  873. package/external/folly/folly/system/EnvUtil.h +113 -0
  874. package/external/folly/folly/system/HardwareConcurrency.cpp +39 -0
  875. package/external/folly/folly/system/HardwareConcurrency.h +23 -0
  876. package/external/folly/folly/system/MemoryMapping.cpp +477 -0
  877. package/external/folly/folly/system/MemoryMapping.h +287 -0
  878. package/external/folly/folly/system/Pid.cpp +87 -0
  879. package/external/folly/folly/system/Pid.h +34 -0
  880. package/external/folly/folly/system/Shell.cpp +33 -0
  881. package/external/folly/folly/system/Shell.h +93 -0
  882. package/external/folly/folly/system/ThreadId.cpp +89 -0
  883. package/external/folly/folly/system/ThreadId.h +62 -0
  884. package/external/folly/folly/system/ThreadName.cpp +330 -0
  885. package/external/folly/folly/system/ThreadName.h +72 -0
  886. package/external/folly/folly/system/test/AtForkTest.cpp +309 -0
  887. package/external/folly/folly/system/test/AuxVectorTest.cpp +55 -0
  888. package/external/folly/folly/system/test/BUCK +120 -0
  889. package/external/folly/folly/system/test/EnvUtilSubprocess.cpp +26 -0
  890. package/external/folly/folly/system/test/EnvUtilTest.cpp +197 -0
  891. package/external/folly/folly/system/test/MemoryMappingTest.cpp +179 -0
  892. package/external/folly/folly/system/test/PidTest.cpp +46 -0
  893. package/external/folly/folly/system/test/ShellTest.cpp +66 -0
  894. package/external/folly/folly/system/test/ThreadIdTest.cpp +114 -0
  895. package/external/folly/folly/system/test/ThreadNameTest.cpp +85 -0
  896. package/external/folly/folly.vcxitems +164 -0
  897. package/external/folly/static/logo.svg +1 -0
  898. package/external/folly/sync-config.json +8 -0
  899. package/package.json +3 -3
  900. package/template/cpp-app/proj/MyApp.sln +0 -33
  901. package/template/cpp-lib/proj/MyLib.sln +0 -33
  902. package/template/cs-app/proj/MyApp.sln +0 -33
  903. package/template/cs-lib/proj/MyLib.sln +0 -33
  904. package/templates/cpp-app/windows/MyApp.sln +0 -33
  905. package/templates/cpp-lib/example/metro.config.js +31 -6
  906. package/templates/cpp-lib/windows/MyLib.sln +0 -33
  907. package/Folly/Folly.vcxproj +0 -383
  908. package/Folly/Folly.vcxproj.filters +0 -558
  909. package/Folly/Folly.win32.vcxproj +0 -11
  910. package/Folly/packages.lock.win32.json +0 -20
  911. package/Scripts/Warm-RnwFeedCache.ps1 +0 -413
  912. package/fmt/fmt.vcxproj +0 -163
  913. package/fmt/fmt.vcxproj.filters +0 -59
  914. package/fmt/fmt.win32.vcxproj +0 -10
  915. package/fmt/pch.cpp +0 -4
  916. package/fmt/pch.h +0 -2
  917. /package/{Folly → external/folly}/Folly.natvis +0 -0
  918. /package/{Folly → external/folly}/cgmanifest.json +0 -0
  919. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/ConstexprMath.h +0 -0
  920. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/Conv.cpp +0 -0
  921. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/chrono/Hardware.h +0 -0
  922. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/concurrency/CacheLocality.cpp +0 -0
  923. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/json/dynamic-inl.h +0 -0
  924. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/json/json.cpp +0 -0
  925. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/lang/SafeAssert.h +0 -0
  926. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/lang/ToAscii.cpp +0 -0
  927. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/lang/ToAscii.h +0 -0
  928. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/portability/Unistd.cpp +0 -0
@@ -0,0 +1,1055 @@
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
+ * Subprocess library, modeled after Python's subprocess module
19
+ * (http://docs.python.org/2/library/subprocess.html)
20
+ *
21
+ * This library defines one class (Subprocess) which represents a child
22
+ * process. Subprocess has two constructors: one that takes a vector<string>
23
+ * and executes the given executable without using the shell, and one
24
+ * that takes a string and executes the given command using the shell.
25
+ * Subprocess allows you to redirect the child's standard input, standard
26
+ * output, and standard error to/from child descriptors in the parent,
27
+ * or to create communication pipes between the child and the parent.
28
+ *
29
+ * The simplest example is a thread-safe [1] version of the system() library
30
+ * function:
31
+ * Subprocess(cmd).wait();
32
+ * which executes the command using the default shell and waits for it
33
+ * to complete, returning the exit status.
34
+ *
35
+ * A thread-safe [1] version of popen() (type="r", to read from the child):
36
+ * Subprocess proc(cmd, Subprocess::Options().pipeStdout());
37
+ * // read from proc.stdoutFd()
38
+ * proc.wait();
39
+ *
40
+ * A thread-safe [1] version of popen() (type="w", to write to the child):
41
+ * Subprocess proc(cmd, Subprocess::Options().pipeStdin());
42
+ * // write to proc.stdinFd()
43
+ * proc.wait();
44
+ *
45
+ * If you want to redirect both stdin and stdout to pipes, you can, but note
46
+ * that you're subject to a variety of deadlocks. You'll want to use
47
+ * nonblocking I/O, like the callback version of communicate().
48
+ *
49
+ * The string or IOBuf-based variants of communicate() are the simplest way
50
+ * to communicate with a child via its standard input, standard output, and
51
+ * standard error. They buffer everything in memory, so they are not great
52
+ * for large amounts of data (or long-running processes), but they are much
53
+ * simpler than the callback version.
54
+ *
55
+ * == A note on thread-safety ==
56
+ *
57
+ * [1] "thread-safe" refers ONLY to the fact that Subprocess is very careful
58
+ * to fork in a way that does not cause grief in multithreaded programs.
59
+ *
60
+ * Caveat: If your system does not have the atomic pipe2 system call, it is
61
+ * not safe to concurrently call Subprocess from different threads.
62
+ * Therefore, it is best to have a single thread be responsible for spawning
63
+ * subprocesses.
64
+ *
65
+ * A particular instances of Subprocess is emphatically **not** thread-safe.
66
+ * If you need to simultaneously communicate via the pipes, and interact
67
+ * with the Subprocess state, your best bet is to:
68
+ * - takeOwnershipOfPipes() to separate the pipe I/O from the subprocess.
69
+ * - Only interact with the Subprocess from one thread at a time.
70
+ *
71
+ * The current implementation of communicate() cannot be safely interrupted.
72
+ * To do so correctly, one would need to use EventFD, or open a dedicated
73
+ * pipe to be messaged from a different thread -- in particular, kill() will
74
+ * not do, since a descendant may keep the pipes open indefinitely.
75
+ *
76
+ * So, once you call communicate(), you must wait for it to return, and not
77
+ * touch the pipes from other threads. closeParentFd() is emphatically
78
+ * unsafe to call concurrently, and even sendSignal() is not a good idea.
79
+ * You can perhaps give the Subprocess's PID to a different thread before
80
+ * starting communicate(), and use that PID to send a signal without
81
+ * accessing the Subprocess object. In that case, you will need a mutex
82
+ * that ensures you don't wait() before you sent said signal. In a
83
+ * nutshell, don't do this.
84
+ *
85
+ * In fact, signals are inherently concurrency-unsafe on Unix: if you signal
86
+ * a PID, while another thread is in waitpid(), the signal may fire either
87
+ * before or after the process is reaped. This means that your signal can,
88
+ * in pathological circumstances, be delivered to the wrong process (ouch!).
89
+ * To avoid this, you should only use non-blocking waits (i.e. poll()), and
90
+ * make sure to serialize your signals (i.e. kill()) with the waits --
91
+ * either wait & signal from the same thread, or use a mutex.
92
+ */
93
+
94
+ #pragma once
95
+
96
+ #ifdef _WIN32
97
+ #error Subprocess is not supported on Windows.
98
+ #endif
99
+
100
+ #include <signal.h>
101
+ #include <sys/types.h>
102
+ #include <sys/wait.h>
103
+
104
+ #include <chrono>
105
+ #include <exception>
106
+ #include <string>
107
+ #include <vector>
108
+
109
+ #include <boost/container/flat_map.hpp>
110
+ #include <boost/operators.hpp>
111
+
112
+ #include <folly/Exception.h>
113
+ #include <folly/File.h>
114
+ #include <folly/FileUtil.h>
115
+ #include <folly/Function.h>
116
+ #include <folly/MapUtil.h>
117
+ #include <folly/Optional.h>
118
+ #include <folly/Portability.h>
119
+ #include <folly/Range.h>
120
+ #include <folly/gen/String.h>
121
+ #include <folly/io/IOBufQueue.h>
122
+ #include <folly/portability/SysResource.h>
123
+
124
+ namespace folly {
125
+
126
+ /**
127
+ * Class to wrap a process return code.
128
+ */
129
+ class Subprocess;
130
+ class ProcessReturnCode {
131
+ public:
132
+ enum State {
133
+ // Subprocess starts in the constructor, so this state designates only
134
+ // default-initialized or moved-out ProcessReturnCodes.
135
+ NOT_STARTED,
136
+ RUNNING,
137
+ EXITED,
138
+ KILLED,
139
+ };
140
+
141
+ static ProcessReturnCode makeNotStarted() {
142
+ return ProcessReturnCode(RV_NOT_STARTED);
143
+ }
144
+
145
+ static ProcessReturnCode makeRunning() {
146
+ return ProcessReturnCode(RV_RUNNING);
147
+ }
148
+
149
+ static ProcessReturnCode make(int status);
150
+
151
+ // Default-initialized for convenience. Subprocess::returnCode() will
152
+ // never produce this value.
153
+ ProcessReturnCode() : rawStatus_(RV_NOT_STARTED) {}
154
+
155
+ // Trivially copyable
156
+ ProcessReturnCode(const ProcessReturnCode& p) = default;
157
+ ProcessReturnCode& operator=(const ProcessReturnCode& p) = default;
158
+ // Non-default move: In order for Subprocess to be movable, the "moved
159
+ // out" state must not be "running", or ~Subprocess() will abort.
160
+ ProcessReturnCode(ProcessReturnCode&& p) noexcept;
161
+ ProcessReturnCode& operator=(ProcessReturnCode&& p) noexcept;
162
+
163
+ /**
164
+ * Process state. One of:
165
+ * NOT_STARTED: process hasn't been started successfully
166
+ * RUNNING: process is currently running
167
+ * EXITED: process exited (successfully or not)
168
+ * KILLED: process was killed by a signal.
169
+ */
170
+ State state() const;
171
+
172
+ /**
173
+ * Helper wrappers around state().
174
+ */
175
+ bool notStarted() const { return state() == NOT_STARTED; }
176
+ bool running() const { return state() == RUNNING; }
177
+ bool exited() const { return state() == EXITED; }
178
+ bool killed() const { return state() == KILLED; }
179
+
180
+ /**
181
+ * Exit status. Only valid if state() == EXITED; throws otherwise.
182
+ */
183
+ int exitStatus() const;
184
+
185
+ /**
186
+ * Signal that caused the process's termination. Only valid if
187
+ * state() == KILLED; throws otherwise.
188
+ */
189
+ int killSignal() const;
190
+
191
+ /**
192
+ * Was a core file generated? Only valid if state() == KILLED; throws
193
+ * otherwise.
194
+ */
195
+ bool coreDumped() const;
196
+
197
+ /**
198
+ * Process exited normally with a zero exit status
199
+ */
200
+ bool succeeded() const;
201
+
202
+ /**
203
+ * String representation; one of
204
+ * "not started"
205
+ * "running"
206
+ * "exited with status <status>"
207
+ * "killed by signal <signal>"
208
+ * "killed by signal <signal> (core dumped)"
209
+ */
210
+ std::string str() const;
211
+
212
+ /**
213
+ * Helper function to enforce a precondition based on this.
214
+ * Throws std::logic_error if in an unexpected state.
215
+ */
216
+ void enforce(State expected) const;
217
+
218
+ private:
219
+ explicit ProcessReturnCode(int rv) : rawStatus_(rv) {}
220
+ static constexpr int RV_NOT_STARTED = -2;
221
+ static constexpr int RV_RUNNING = -1;
222
+
223
+ int rawStatus_;
224
+ };
225
+
226
+ /**
227
+ * Base exception thrown by the Subprocess methods.
228
+ */
229
+ class FOLLY_EXPORT SubprocessError : public std::runtime_error {
230
+ public:
231
+ using std::runtime_error::runtime_error;
232
+ };
233
+
234
+ /**
235
+ * Exception thrown by *Checked methods of Subprocess.
236
+ */
237
+ class FOLLY_EXPORT CalledProcessError : public SubprocessError {
238
+ public:
239
+ explicit CalledProcessError(ProcessReturnCode rc);
240
+ ~CalledProcessError() noexcept override = default;
241
+ ProcessReturnCode returnCode() const { return returnCode_; }
242
+
243
+ private:
244
+ ProcessReturnCode returnCode_;
245
+ };
246
+
247
+ /**
248
+ * Exception thrown if the subprocess cannot be started.
249
+ */
250
+ class FOLLY_EXPORT SubprocessSpawnError : public SubprocessError {
251
+ public:
252
+ SubprocessSpawnError(const char* executable, int errCode, int errnoValue);
253
+ ~SubprocessSpawnError() noexcept override = default;
254
+ int errnoValue() const { return errnoValue_; }
255
+
256
+ private:
257
+ int errnoValue_;
258
+ };
259
+
260
+ /**
261
+ * Subprocess.
262
+ */
263
+ class Subprocess {
264
+ public:
265
+ using TimeoutDuration = std::chrono::milliseconds;
266
+
267
+ // removed CLOSE = -1
268
+ static const int PIPE = -2;
269
+ static const int PIPE_IN = -3;
270
+ static const int PIPE_OUT = -4;
271
+ static const int DEV_NULL = -5;
272
+
273
+ /**
274
+ * See Subprocess::Options::dangerousPostForkPreExecCallback() for usage.
275
+ * Every derived class should include the following warning:
276
+ *
277
+ * DANGER: This class runs after fork in a child processes. Be fast, the
278
+ * parent thread is waiting, but remember that other parent threads are
279
+ * running and may mutate your state. Avoid mutating any data belonging to
280
+ * the parent. Avoid interacting with non-POD data that originated in the
281
+ * parent. Avoid any libraries that may internally reference non-POD data.
282
+ * Especially beware parent mutexes -- for example, glog's LOG() uses one.
283
+ */
284
+ struct DangerousPostForkPreExecCallback {
285
+ virtual ~DangerousPostForkPreExecCallback() {}
286
+ // This must return 0 on success, or an `errno` error code.
287
+ virtual int operator()() = 0;
288
+ };
289
+
290
+ /**
291
+ * Class representing various options: file descriptor behavior, and
292
+ * whether to use $PATH for searching for the executable,
293
+ *
294
+ * By default, we don't use $PATH, file descriptors are closed if
295
+ * the close-on-exec flag is set (fcntl FD_CLOEXEC) and inherited
296
+ * otherwise.
297
+ */
298
+ class Options {
299
+ friend class Subprocess;
300
+
301
+ public:
302
+ Options() {} // E.g. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58328
303
+
304
+ /**
305
+ * Change action for file descriptor fd.
306
+ *
307
+ * "action" may be another file descriptor number (dup2()ed before the
308
+ * child execs), or one of CLOSE, PIPE_IN, and PIPE_OUT.
309
+ *
310
+ * CLOSE: close the file descriptor in the child
311
+ * PIPE_IN: open a pipe *from* the child
312
+ * PIPE_OUT: open a pipe *to* the child
313
+ *
314
+ * PIPE is a shortcut; same as PIPE_IN for stdin (fd 0), same as
315
+ * PIPE_OUT for stdout (fd 1) or stderr (fd 2), and an error for
316
+ * other file descriptors.
317
+ */
318
+ Options& fd(int fd, int action);
319
+
320
+ /**
321
+ * Shortcut to change the action for standard input.
322
+ */
323
+ Options& stdinFd(int action) { return fd(STDIN_FILENO, action); }
324
+
325
+ /**
326
+ * Shortcut to change the action for standard output.
327
+ */
328
+ Options& stdoutFd(int action) { return fd(STDOUT_FILENO, action); }
329
+
330
+ /**
331
+ * Shortcut to change the action for standard error.
332
+ * Note that stderr(1) will redirect the standard error to the same
333
+ * file descriptor as standard output; the equivalent of bash's "2>&1"
334
+ */
335
+ Options& stderrFd(int action) { return fd(STDERR_FILENO, action); }
336
+
337
+ Options& pipeStdin() { return fd(STDIN_FILENO, PIPE_IN); }
338
+ Options& pipeStdout() { return fd(STDOUT_FILENO, PIPE_OUT); }
339
+ Options& pipeStderr() { return fd(STDERR_FILENO, PIPE_OUT); }
340
+
341
+ /**
342
+ * Close all other fds (other than standard input, output, error,
343
+ * and file descriptors explicitly specified with fd()).
344
+ *
345
+ * This is potentially slow; it's generally a better idea to
346
+ * set the close-on-exec flag on all file descriptors that shouldn't
347
+ * be inherited by the child.
348
+ *
349
+ * Even with this option set, standard input, output, and error are
350
+ * not closed; use stdin(CLOSE), stdout(CLOSE), stderr(CLOSE) if you
351
+ * desire this.
352
+ */
353
+ Options& closeOtherFds() {
354
+ closeOtherFds_ = true;
355
+ return *this;
356
+ }
357
+
358
+ /**
359
+ * Use the search path ($PATH) when searching for the executable.
360
+ */
361
+ Options& usePath() {
362
+ usePath_ = true;
363
+ return *this;
364
+ }
365
+
366
+ /**
367
+ * Change the child's working directory, after the vfork.
368
+ */
369
+ Options& chdir(const std::string& dir) {
370
+ childDir_ = dir;
371
+ return *this;
372
+ }
373
+
374
+ #if defined(__linux__)
375
+ /**
376
+ * Child will receive a signal when the parent *thread* exits.
377
+ *
378
+ * This is especially important when this option is used but the calling
379
+ * thread does not block for the duration of the subprocess. If the original
380
+ * thread that created the subprocess ends then the subprocess will
381
+ * terminate. For example, thread pool executors which can reap unused
382
+ * threads may trigger this behavior.
383
+ */
384
+ Options& parentDeathSignal(int sig) {
385
+ parentDeathSignal_ = sig;
386
+ return *this;
387
+ }
388
+ #endif
389
+
390
+ /**
391
+ * Child will be made a process group leader when it starts. Upside: one
392
+ * can reliably kill all its non-daemonizing descendants. Downside: the
393
+ * child will not receive Ctrl-C etc during interactive use.
394
+ */
395
+ Options& processGroupLeader() {
396
+ processGroupLeader_ = true;
397
+ return *this;
398
+ }
399
+
400
+ /**
401
+ * Detach the spawned process, to allow destroying the Subprocess object
402
+ * without waiting for the child process to finish.
403
+ *
404
+ * This causes the code to fork twice before executing the command.
405
+ * The intermediate child process will exit immediately, causing the process
406
+ * running the executable to be reparented to init (pid 1).
407
+ *
408
+ * Subprocess objects created with detach() enabled will already be in an
409
+ * "EXITED" state when the constructor returns. The caller should not call
410
+ * wait() or poll() on the Subprocess, and pid() will return -1.
411
+ */
412
+ Options& detach() {
413
+ detach_ = true;
414
+ return *this;
415
+ }
416
+
417
+ /**
418
+ * If the Subprocess object is destroyed while the process is still running,
419
+ * automatically kill the child with SIGKILL and wait on the pid.
420
+ */
421
+ Options& killChildOnDestruction() {
422
+ destroyBehavior_ = 0;
423
+ return *this;
424
+ }
425
+
426
+ /**
427
+ * If the Subprocess object is destroyed while the process is still running,
428
+ * use terminateOrKill() to stop it and wait for it to exit.
429
+ *
430
+ * Beware that this may cause the Subprocess destructor to block while
431
+ * waiting on the child process to exit.
432
+ */
433
+ Options& terminateChildOnDestruction(TimeoutDuration timeout) {
434
+ destroyBehavior_ = std::max(TimeoutDuration::rep(0), timeout.count());
435
+ return *this;
436
+ }
437
+
438
+ /**
439
+ * By default, if Subprocess is destroyed while the child process is
440
+ * still RUNNING, the destructor will log a fatal. You can skip this
441
+ * behavior by setting it to true here.
442
+ *
443
+ * Note that detach()ed processes are never in RUNNING state, so this
444
+ * setting does not impact such processes.
445
+ *
446
+ * BEWARE: setting this flag can leave zombie processes behind on the system
447
+ * after the folly::Subprocess is destroyed. In general you should avoid
448
+ * using this setting. In general, prefer using one of the following
449
+ * options instead:
450
+ * - If you do not care about monitoring the child process or waiting for it
451
+ * to complete, use detach().
452
+ * - If you want to automatically clean up the child process when the
453
+ * Subprocess is destroyed, use killChildOnDestruction() or
454
+ * terminateChildOnDestruction()
455
+ * - If you want to allow the parent process to exit without waiting on thie
456
+ * child, prefer simply leaking the folly::Subprocess object when the
457
+ * parent process exits. You could exit with _exit(), or you could
458
+ * explicitly leak the Subprocess using std::unique_ptr::release() or
459
+ * similar mechanisms.
460
+ */
461
+ Options& allowDestructionWhileProcessRunning(bool val) {
462
+ destroyBehavior_ = val ? DestroyBehaviorLeak : DestroyBehaviorFatal;
463
+ return *this;
464
+ }
465
+
466
+ /**
467
+ * *** READ THIS WHOLE DOCBLOCK BEFORE USING ***
468
+ *
469
+ * Run this callback in the child after the fork, just before the
470
+ * exec(), and after the child's state has been completely set up:
471
+ * - signal handlers have been reset to default handling and unblocked
472
+ * - the working directory was set
473
+ * - closed any file descriptors specified via Options()
474
+ * - set child process flags (see code)
475
+ *
476
+ * This is EXTREMELY DANGEROUS. For example, this innocuous-looking code
477
+ * can cause a fraction of your Subprocess launches to hang forever:
478
+ *
479
+ * LOG(INFO) << "Hello from the child";
480
+ *
481
+ * The reason is that glog has an internal mutex. If your fork() happens
482
+ * when the parent has the mutex locked, the child will wait forever.
483
+ *
484
+ * == GUIDELINES ==
485
+ *
486
+ * - Be quick -- the parent thread is blocked until you exit.
487
+ * - Remember that other parent threads are running, and may mutate your
488
+ * state.
489
+ * - Avoid mutating any data belonging to the parent.
490
+ * - Avoid interacting with non-POD data that came from the parent.
491
+ * - Avoid any libraries that may internally reference non-POD state.
492
+ * - Especially beware parent mutexes, e.g. LOG() uses a global mutex.
493
+ * - Avoid invoking the parent's destructors (you can accidentally
494
+ * delete files, terminate network connections, etc).
495
+ * - Read http://ewontfix.com/7/
496
+ */
497
+ Options& dangerousPostForkPreExecCallback(
498
+ DangerousPostForkPreExecCallback* cob) {
499
+ dangerousPostForkPreExecCallback_ = cob;
500
+ return *this;
501
+ }
502
+
503
+ #if defined(__linux__)
504
+ /**
505
+ * This is an experimental feature, it is best you don't use it at this
506
+ * point of time.
507
+ * Although folly would support cloning with custom flags in some form, this
508
+ * API might change in the near future. So use the following assuming it is
509
+ * experimental. (Apr 11, 2017)
510
+ *
511
+ * This unlocks Subprocess to support clone flags, many of them need
512
+ * CAP_SYS_ADMIN permissions. It might also require you to go through the
513
+ * implementation to understand what happens before, between and after the
514
+ * fork-and-exec.
515
+ *
516
+ * `man 2 clone` would be a starting point for knowing about the available
517
+ * flags.
518
+ */
519
+ using clone_flags_t = uint64_t;
520
+ Options& useCloneWithFlags(clone_flags_t cloneFlags) noexcept {
521
+ cloneFlags_ = cloneFlags;
522
+ return *this;
523
+ }
524
+ #endif
525
+
526
+ #if defined(__linux__)
527
+ Options& setCpuSet(const cpu_set_t& cpuSet) {
528
+ cpuSet_ = cpuSet;
529
+ return *this;
530
+ }
531
+ #endif
532
+
533
+ private:
534
+ typedef boost::container::flat_map<int, int> FdMap;
535
+ FdMap fdActions_;
536
+ bool closeOtherFds_{false};
537
+ bool usePath_{false};
538
+ bool processGroupLeader_{false};
539
+ bool detach_{false};
540
+ // The behavior to take if the Subprocess destructor is invoked while the
541
+ // child process is still running. This is either
542
+ // DestroyBehaviorFatal, DestroyBehaviorLeak, or a timeout value to pass to
543
+ // terminateOrKill() to kill the child process.
544
+ TimeoutDuration::rep destroyBehavior_{DestroyBehaviorFatal};
545
+ std::string childDir_; // "" keeps the parent's working directory
546
+ #if defined(__linux__)
547
+ int parentDeathSignal_{0};
548
+ #endif
549
+ DangerousPostForkPreExecCallback* dangerousPostForkPreExecCallback_{
550
+ nullptr};
551
+ #if defined(__linux__)
552
+ // none means `vfork()` instead of a custom `clone()`
553
+ // Optional<> is used because value of '0' means do clone without any flags.
554
+ Optional<clone_flags_t> cloneFlags_;
555
+ #endif
556
+ #if defined(__linux__)
557
+ Optional<cpu_set_t> cpuSet_;
558
+ #endif
559
+ };
560
+
561
+ // Non-copyable, but movable
562
+ Subprocess(const Subprocess&) = delete;
563
+ Subprocess& operator=(const Subprocess&) = delete;
564
+ Subprocess(Subprocess&&) = default;
565
+ Subprocess& operator=(Subprocess&&) = default;
566
+
567
+ /**
568
+ * Create an uninitialized subprocess.
569
+ *
570
+ * In this state it can only be destroyed, or assigned to using the move
571
+ * assignment operator.
572
+ */
573
+ Subprocess();
574
+
575
+ /**
576
+ * Create a subprocess from the given arguments. argv[0] must be listed.
577
+ * If not-null, executable must be the actual executable
578
+ * being used (otherwise it's the same as argv[0]).
579
+ *
580
+ * If env is not-null, it must contain name=value strings to be used
581
+ * as the child's environment; otherwise, we inherit the environment
582
+ * from the parent. env must be null if options.usePath is set.
583
+ */
584
+ explicit Subprocess(
585
+ const std::vector<std::string>& argv,
586
+ const Options& options = Options(),
587
+ const char* executable = nullptr,
588
+ const std::vector<std::string>* env = nullptr);
589
+ ~Subprocess();
590
+
591
+ /**
592
+ * Create a Subprocess object for an existing child process ID.
593
+ *
594
+ * The process ID must refer to an immediate child process of the current
595
+ * process. This allows using the poll() and wait() APIs on a process ID
596
+ * that was not originally spawned by Subprocess.
597
+ */
598
+ static Subprocess fromExistingProcess(pid_t pid);
599
+
600
+ /**
601
+ * Create a subprocess run as a shell command (as shell -c 'command')
602
+ *
603
+ * The shell to use is taken from the environment variable $SHELL,
604
+ * or /bin/sh if $SHELL is unset.
605
+ */
606
+ // clang-format off
607
+ [[deprecated(
608
+ "Prefer not running in a shell or use `shellify`.")]]
609
+ explicit Subprocess(
610
+ const std::string& cmd,
611
+ const Options& options = Options(),
612
+ const std::vector<std::string>* env = nullptr);
613
+ // clang-format on
614
+
615
+ ////
616
+ //// The methods below only manipulate the process state, and do not
617
+ //// affect its communication pipes.
618
+ ////
619
+
620
+ /**
621
+ * Return the child's pid, or -1 if the child wasn't successfully spawned
622
+ * or has already been wait()ed upon.
623
+ */
624
+ pid_t pid() const;
625
+
626
+ /**
627
+ * Return the child's status (as per wait()) if the process has already
628
+ * been waited on, -1 if the process is still running, or -2 if the
629
+ * process hasn't been successfully started. NOTE that this does not call
630
+ * waitpid() or Subprocess::poll(), but simply returns the status stored
631
+ * in the Subprocess object.
632
+ */
633
+ ProcessReturnCode returnCode() const { return returnCode_; }
634
+
635
+ /**
636
+ * Poll the child's status and return it. Return the exit status if the
637
+ * subprocess had quit, or RUNNING otherwise. Throws an std::logic_error
638
+ * if called on a Subprocess whose status is no longer RUNNING. No other
639
+ * exceptions are possible. Aborts on egregious violations of contract,
640
+ * e.g. if you wait for the underlying process without going through this
641
+ * Subprocess instance.
642
+ */
643
+ ProcessReturnCode poll(struct rusage* ru = nullptr);
644
+
645
+ /**
646
+ * Poll the child's status. If the process is still running, return false.
647
+ * Otherwise, return true if the process exited with status 0 (success),
648
+ * or throw CalledProcessError if the process exited with a non-zero status.
649
+ */
650
+ bool pollChecked();
651
+
652
+ /**
653
+ * Wait for the process to terminate and return its status. Like poll(),
654
+ * the only exception this can throw is std::logic_error if you call this
655
+ * on a Subprocess whose status is not RUNNING. Aborts on egregious
656
+ * violations of contract, like an out-of-band waitpid(p.pid(), 0, 0).
657
+ */
658
+ ProcessReturnCode wait();
659
+
660
+ /**
661
+ * Wait for the process to terminate, throw if unsuccessful.
662
+ */
663
+ void waitChecked();
664
+
665
+ /**
666
+ * Call `waitpid` non-blockingly up to `timeout`. Throws std::logic_error if
667
+ * called on a Subprocess whose status is not RUNNING.
668
+ *
669
+ * The return code will be running() if waiting timed out.
670
+ */
671
+ ProcessReturnCode waitTimeout(TimeoutDuration timeout);
672
+
673
+ /**
674
+ * Send a signal to the child. Shortcuts for the commonly used Unix
675
+ * signals are below.
676
+ */
677
+ void sendSignal(int signal);
678
+ void terminate() { sendSignal(SIGTERM); }
679
+ void kill() { sendSignal(SIGKILL); }
680
+
681
+ /**
682
+ * Call `waitpid` non-blockingly up to `waitTimeout`. If the process hasn't
683
+ * terminated after that, fall back on `terminateOrKill` with
684
+ * `sigtermTimeoutSeconds`.
685
+ */
686
+ ProcessReturnCode waitOrTerminateOrKill(
687
+ TimeoutDuration waitTimeout, TimeoutDuration sigtermTimeout);
688
+
689
+ /**
690
+ * Send the SIGTERM to terminate the process, poll `waitpid` non-blockingly
691
+ * several times up to `sigtermTimeout`. If the process hasn't terminated
692
+ * after that, send SIGKILL to kill the process and call `waitpid` blockingly.
693
+ * Return the exit code of process.
694
+ *
695
+ * If sigtermTimeout is 0 or negative, this will immediately send SIGKILL
696
+ * without first sending SIGTERM.
697
+ */
698
+ ProcessReturnCode terminateOrKill(TimeoutDuration sigtermTimeout);
699
+
700
+ ////
701
+ //// The methods below only affect the process's communication pipes, but
702
+ //// not its return code or state (they do not poll() or wait()).
703
+ ////
704
+
705
+ /**
706
+ * Communicate with the child until all pipes to/from the child are closed.
707
+ *
708
+ * The input buffer is written to the process' stdin pipe, and data is read
709
+ * from the stdout and stderr pipes. Non-blocking I/O is performed on all
710
+ * pipes simultaneously to avoid deadlocks.
711
+ *
712
+ * The stdin pipe will be closed after the full input buffer has been written.
713
+ * An error will be thrown if a non-empty input buffer is supplied but stdin
714
+ * was not configured as a pipe.
715
+ *
716
+ * Returns a pair of buffers containing the data read from stdout and stderr.
717
+ * If stdout or stderr is not a pipe, an empty IOBuf queue will be returned
718
+ * for the respective buffer.
719
+ *
720
+ * Note that communicate() and communicateIOBuf() both return when all
721
+ * pipes to/from the child are closed; the child might stay alive after
722
+ * that, so you must still wait().
723
+ *
724
+ * communicateIOBuf() uses IOBufQueue for buffering (which has the
725
+ * advantage that it won't try to allocate all data at once), but it does
726
+ * store the subprocess's entire output in memory before returning.
727
+ *
728
+ * communicate() uses strings for simplicity.
729
+ */
730
+ std::pair<IOBufQueue, IOBufQueue> communicateIOBuf(
731
+ IOBufQueue input = IOBufQueue());
732
+
733
+ std::pair<std::string, std::string> communicate(
734
+ StringPiece input = StringPiece());
735
+
736
+ /**
737
+ * Communicate with the child until all pipes to/from the child are closed.
738
+ *
739
+ * == Semantics ==
740
+ *
741
+ * readCallback(pfd, cfd) will be called whenever there's data available
742
+ * on any pipe *from* the child (PIPE_OUT). pfd is the file descriptor
743
+ * in the parent (that you use to read from); cfd is the file descriptor
744
+ * in the child (used for identifying the stream; 1 = child's standard
745
+ * output, 2 = child's standard error, etc)
746
+ *
747
+ * writeCallback(pfd, cfd) will be called whenever a pipe *to* the child is
748
+ * writable (PIPE_IN). pfd is the file descriptor in the parent (that you
749
+ * use to write to); cfd is the file descriptor in the child (used for
750
+ * identifying the stream; 0 = child's standard input, etc)
751
+ *
752
+ * The read and write callbacks must read from / write to pfd and return
753
+ * false during normal operation. Return true to tell communicate() to
754
+ * close the pipe. For readCallback, this might send SIGPIPE to the
755
+ * child, or make its writes fail with EPIPE, so you should generally
756
+ * avoid returning true unless you've reached end-of-file.
757
+ *
758
+ * communicate() returns when all pipes to/from the child are closed; the
759
+ * child might stay alive after that, so you must still wait().
760
+ * Conversely, the child may quit long before its pipes are closed, since
761
+ * its descendants can keep them alive forever.
762
+ *
763
+ * Most users won't need to use this callback version; the simpler version
764
+ * of communicate (which buffers data in memory) will probably work fine.
765
+ *
766
+ * == Things you must get correct ==
767
+ *
768
+ * 1) You MUST consume all data passed to readCallback (or return true to
769
+ * close the pipe). Similarly, you MUST write to a writable pipe (or
770
+ * return true to close the pipe). To do otherwise is an error that can
771
+ * result in a deadlock. You must do this even for pipes you are not
772
+ * interested in.
773
+ *
774
+ * 2) pfd is nonblocking, so be prepared for read() / write() to return -1
775
+ * and set errno to EAGAIN (in which case you should return false). Use
776
+ * readNoInt() from FileUtil.h to handle interrupted reads for you.
777
+ *
778
+ * 3) Your callbacks MUST NOT call any of the Subprocess methods that
779
+ * manipulate the pipe FDs. Check the docblocks, but, for example,
780
+ * neither closeParentFd (return true instead) nor takeOwnershipOfPipes
781
+ * are safe. Stick to reading/writing from pfd, as appropriate.
782
+ *
783
+ * == Good to know ==
784
+ *
785
+ * 1) See ReadLinesCallback for an easy way to consume the child's output
786
+ * streams line-by-line (or tokenized by another delimiter).
787
+ *
788
+ * 2) "Wait until the descendants close the pipes" is usually the behavior
789
+ * you want, since the descendants may have something to say even if the
790
+ * immediate child is dead. If you need to be able to force-close all
791
+ * parent FDs, communicate() will NOT work for you. Do it your own way by
792
+ * using takeOwnershipOfPipes().
793
+ *
794
+ * Why not? You can return "true" from your callbacks to sever active
795
+ * pipes, but inactive ones can remain open indefinitely. It is
796
+ * impossible to safely close inactive pipes while another thread is
797
+ * blocked in communicate(). This is BY DESIGN. Racing communicate()'s
798
+ * read/write callbacks can result in wrong I/O and data corruption. This
799
+ * class would need internal synchronization and timeouts, a poor and
800
+ * expensive implementation choice, in order to make closeParentFd()
801
+ * thread-safe.
802
+ */
803
+ using FdCallback = folly::Function<bool(int, int)>;
804
+ void communicate(FdCallback readCallback, FdCallback writeCallback);
805
+
806
+ /**
807
+ * A readCallback for Subprocess::communicate() that helps you consume
808
+ * lines (or other delimited pieces) from your subprocess's file
809
+ * descriptors. Use the readLinesCallback() helper to get template
810
+ * deduction. For example:
811
+ *
812
+ * subprocess.communicate(
813
+ * Subprocess::readLinesCallback(
814
+ * [](int fd, folly::StringPiece s) {
815
+ * std::cout << fd << " said: " << s;
816
+ * return false; // Keep reading from the child
817
+ * }
818
+ * ),
819
+ * [](int pdf, int cfd){ return true; } // Don't write to the child
820
+ * );
821
+ *
822
+ * If a file line exceeds maxLineLength, your callback will get some
823
+ * initial chunks of maxLineLength with no trailing delimiters. The final
824
+ * chunk of a line is delimiter-terminated iff the delimiter was present
825
+ * in the input. In particular, the last line in a file always lacks a
826
+ * delimiter -- so if a file ends on a delimiter, the final line is empty.
827
+ *
828
+ * Like a regular communicate() callback, your fdLineCb() normally returns
829
+ * false. It may return true to tell Subprocess to close the underlying
830
+ * file descriptor. The child process may then receive SIGPIPE or get
831
+ * EPIPE errors on writes.
832
+ */
833
+ template <class Callback>
834
+ class ReadLinesCallback {
835
+ private:
836
+ // Binds an FD to the client-provided FD+line callback
837
+ struct StreamSplitterCallback {
838
+ StreamSplitterCallback(Callback& cb, int fd) : cb_(cb), fd_(fd) {}
839
+ // The return value semantics are inverted vs StreamSplitter
840
+ bool operator()(StringPiece s) { return !cb_(fd_, s); }
841
+ Callback& cb_;
842
+ int fd_;
843
+ };
844
+ typedef gen::StreamSplitter<StreamSplitterCallback> LineSplitter;
845
+
846
+ public:
847
+ explicit ReadLinesCallback(
848
+ Callback&& fdLineCb,
849
+ uint64_t maxLineLength = 0, // No line length limit by default
850
+ char delimiter = '\n',
851
+ uint64_t bufSize = 1024)
852
+ : fdLineCb_(std::forward<Callback>(fdLineCb)),
853
+ maxLineLength_(maxLineLength),
854
+ delimiter_(delimiter),
855
+ bufSize_(bufSize) {}
856
+
857
+ bool operator()(int pfd, int cfd) {
858
+ // Make a splitter for this cfd if it doesn't already exist
859
+ auto it = fdToSplitter_.find(cfd);
860
+ auto& splitter = (it != fdToSplitter_.end())
861
+ ? it->second
862
+ : fdToSplitter_
863
+ .emplace(
864
+ cfd,
865
+ LineSplitter(
866
+ delimiter_,
867
+ StreamSplitterCallback(fdLineCb_, cfd),
868
+ maxLineLength_))
869
+ .first->second;
870
+ // Read as much as we can from this FD
871
+ char buf[bufSize_];
872
+ while (true) {
873
+ ssize_t ret = readNoInt(pfd, buf, bufSize_);
874
+ if (ret == -1 && errno == EAGAIN) { // No more data for now
875
+ return false;
876
+ }
877
+ checkUnixError(ret, "read");
878
+ if (ret == 0) { // Reached end-of-file
879
+ splitter.flush(); // Ignore return since the file is over anyway
880
+ return true;
881
+ }
882
+ if (!splitter(StringPiece(buf, ret))) {
883
+ return true; // The callback told us to stop
884
+ }
885
+ }
886
+ }
887
+
888
+ private:
889
+ Callback fdLineCb_;
890
+ const uint64_t maxLineLength_;
891
+ const char delimiter_;
892
+ const uint64_t bufSize_;
893
+ // We lazily make splitters for all cfds that get used.
894
+ std::unordered_map<int, LineSplitter> fdToSplitter_;
895
+ };
896
+
897
+ // Helper to enable template deduction
898
+ template <class Callback>
899
+ static auto readLinesCallback(
900
+ Callback&& fdLineCb,
901
+ uint64_t maxLineLength = 0, // No line length limit by default
902
+ char delimiter = '\n',
903
+ uint64_t bufSize = 1024)
904
+ -> ReadLinesCallback<typename std::decay<Callback>::type> {
905
+ return ReadLinesCallback<typename std::decay<Callback>::type>(
906
+ std::forward<Callback>(fdLineCb), maxLineLength, delimiter, bufSize);
907
+ }
908
+
909
+ /**
910
+ * communicate() callbacks can use this to temporarily enable/disable
911
+ * notifications (callbacks) for a pipe to/from the child. By default,
912
+ * all are enabled. Useful for "chatty" communication -- you want to
913
+ * disable write callbacks until you receive the expected message.
914
+ *
915
+ * Disabling a pipe does not free you from the requirement to consume all
916
+ * incoming data. Failing to do so will easily create deadlock bugs.
917
+ *
918
+ * Throws if the childFd is not known.
919
+ */
920
+ void enableNotifications(int childFd, bool enabled);
921
+
922
+ /**
923
+ * Are notifications for one pipe to/from child enabled? Throws if the
924
+ * childFd is not known.
925
+ */
926
+ bool notificationsEnabled(int childFd) const;
927
+
928
+ ////
929
+ //// The following methods are meant for the cases when communicate() is
930
+ //// not suitable. You should not need them when you call communicate(),
931
+ //// and, in fact, it is INHERENTLY UNSAFE to use closeParentFd() or
932
+ //// takeOwnershipOfPipes() from a communicate() callback.
933
+ ////
934
+
935
+ /**
936
+ * Close the parent file descriptor given a file descriptor in the child.
937
+ * DO NOT USE from communicate() callbacks; make them return true instead.
938
+ */
939
+ void closeParentFd(int childFd);
940
+
941
+ /**
942
+ * Set all pipes from / to child to be non-blocking. communicate() does
943
+ * this for you.
944
+ */
945
+ void setAllNonBlocking();
946
+
947
+ /**
948
+ * Get parent file descriptor corresponding to the given file descriptor
949
+ * in the child. Throws if childFd isn't a pipe (PIPE_IN / PIPE_OUT).
950
+ * Do not close() the returned file descriptor; use closeParentFd, above.
951
+ */
952
+ int parentFd(int childFd) const {
953
+ return pipes_[findByChildFd(childFd)].pipe.fd();
954
+ }
955
+ int stdinFd() const { return parentFd(0); }
956
+ int stdoutFd() const { return parentFd(1); }
957
+ int stderrFd() const { return parentFd(2); }
958
+
959
+ /**
960
+ * The child's pipes are logically separate from the process metadata
961
+ * (they may even be kept alive by the child's descendants). This call
962
+ * lets you manage the pipes' lifetime separately from the lifetime of the
963
+ * child process.
964
+ *
965
+ * After this call, the Subprocess instance will have no knowledge of
966
+ * these pipes, and the caller assumes responsibility for managing their
967
+ * lifetimes. Pro-tip: prefer to explicitly close() the pipes, since
968
+ * folly::File would otherwise silently suppress I/O errors.
969
+ *
970
+ * No, you may NOT call this from a communicate() callback.
971
+ */
972
+ struct ChildPipe {
973
+ ChildPipe(int fd, folly::File&& ppe) : childFd(fd), pipe(std::move(ppe)) {}
974
+ int childFd;
975
+ folly::File pipe; // Owns the parent FD
976
+ };
977
+ std::vector<ChildPipe> takeOwnershipOfPipes();
978
+
979
+ private:
980
+ // spawn() sets up a pipe to read errors from the child,
981
+ // then calls spawnInternal() to do the bulk of the work. Once
982
+ // spawnInternal() returns it reads the error pipe to see if the child
983
+ // encountered any errors.
984
+ void spawn(
985
+ std::unique_ptr<const char*[]> argv,
986
+ const char* executable,
987
+ const Options& options,
988
+ const std::vector<std::string>* env);
989
+ void spawnInternal(
990
+ std::unique_ptr<const char*[]> argv,
991
+ const char* executable,
992
+ Options& options,
993
+ const std::vector<std::string>* env,
994
+ int errFd);
995
+
996
+ // Actions to run in child.
997
+ // Note that this runs after vfork(), so tread lightly.
998
+ // Returns 0 on success, or an errno value on failure.
999
+ int prepareChild(
1000
+ const Options& options,
1001
+ const sigset_t* sigmask,
1002
+ const char* childDir) const;
1003
+ int runChild(
1004
+ const char* executable,
1005
+ char** argv,
1006
+ char** env,
1007
+ const Options& options) const;
1008
+
1009
+ // Closes fds inherited from parent in child process
1010
+ static void closeInheritedFds(const Options::FdMap& fdActions);
1011
+
1012
+ /**
1013
+ * Read from the error pipe, and throw SubprocessSpawnError if the child
1014
+ * failed before calling exec().
1015
+ */
1016
+ void readChildErrorPipe(int pfd, const char* executable);
1017
+
1018
+ // Returns an index into pipes_. Throws std::invalid_argument if not found.
1019
+ size_t findByChildFd(const int childFd) const;
1020
+
1021
+ static constexpr TimeoutDuration::rep DestroyBehaviorFatal = -1;
1022
+ static constexpr TimeoutDuration::rep DestroyBehaviorLeak = -2;
1023
+
1024
+ pid_t pid_{-1};
1025
+ ProcessReturnCode returnCode_;
1026
+ TimeoutDuration::rep destroyBehavior_ = DestroyBehaviorFatal;
1027
+
1028
+ /**
1029
+ * Represents a pipe between this process, and the child process (or its
1030
+ * descendant). To interact with these pipes, you can use communicate(),
1031
+ * or use parentFd() and related methods, or separate them from the
1032
+ * Subprocess instance entirely via takeOwnershipOfPipes().
1033
+ */
1034
+ struct Pipe : private boost::totally_ordered<Pipe> {
1035
+ folly::File pipe; // Our end of the pipe, wrapped in a File to auto-close.
1036
+ int childFd = -1; // Identifies the pipe: what FD is this in the child?
1037
+ int direction = PIPE_IN; // one of PIPE_IN / PIPE_OUT
1038
+ bool enabled = true; // Are notifications enabled in communicate()?
1039
+
1040
+ bool operator<(const Pipe& other) const { return childFd < other.childFd; }
1041
+ bool operator==(const Pipe& other) const {
1042
+ return childFd == other.childFd;
1043
+ }
1044
+ };
1045
+
1046
+ // Populated at process start according to fdActions, empty after
1047
+ // takeOwnershipOfPipes(). Sorted by childFd. Can only have elements
1048
+ // erased, but not inserted, after being populated.
1049
+ //
1050
+ // The number of pipes between parent and child is assumed to be small,
1051
+ // so we're happy with a vector here, even if it means linear erase.
1052
+ std::vector<Pipe> pipes_;
1053
+ };
1054
+
1055
+ } // namespace folly