react-native-windows 0.81.34 → 0.81.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Directory.Build.props +1 -16
- package/Folly/ThreadNameStub.cpp +4 -6
- package/Microsoft.ReactNative/Fabric/Composition/BorderPrimitive.cpp +1 -1
- package/Microsoft.ReactNative/Fabric/Composition/CompositionEventHandler.cpp +27 -4
- package/Microsoft.ReactNative/Fabric/Composition/ScrollViewComponentView.cpp +8 -4
- package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp +7 -3
- package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj +1 -7
- package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj.filters +0 -3
- package/PropertySheets/Generated/PackageVersion.g.props +3 -3
- package/PropertySheets/React.Cpp.props +3 -3
- package/ReactCommon/ReactCommon.vcxproj +0 -10
- package/ReactCommon/packages.lock.win32.json +0 -10
- package/Scripts/Tfs/Layout-Desktop-Headers.ps1 +4 -37
- package/Shared/Shared.vcxitems +2 -0
- package/{Folly → external}/.clang-format +0 -1
- package/external/External.vcxitems +10 -0
- package/external/fast-float/.syncignore +11 -0
- package/external/fast-float/LICENSE-APACHE +190 -0
- package/external/fast-float/LICENSE-BOOST +23 -0
- package/external/fast-float/LICENSE-MIT +27 -0
- package/external/fast-float/cgmanifest.json +15 -0
- package/external/fast-float/fast-float.vcxitems +14 -0
- package/external/fast-float/include/fast_float/ascii_number.h +588 -0
- package/external/fast-float/include/fast_float/bigint.h +638 -0
- package/external/fast-float/include/fast_float/constexpr_feature_detect.h +46 -0
- package/external/fast-float/include/fast_float/decimal_to_binary.h +212 -0
- package/external/fast-float/include/fast_float/digit_comparison.h +457 -0
- package/external/fast-float/include/fast_float/fast_float.h +59 -0
- package/external/fast-float/include/fast_float/fast_table.h +708 -0
- package/external/fast-float/include/fast_float/float_common.h +1240 -0
- package/external/fast-float/include/fast_float/parse_number.h +399 -0
- package/external/fast-float/sync-config.json +8 -0
- package/external/fmt/.syncignore +12 -0
- package/external/fmt/CONTRIBUTING.md +20 -0
- package/external/fmt/LICENSE +27 -0
- package/{fmt → external/fmt}/cgmanifest.json +1 -1
- package/external/fmt/fmt.vcxitems +28 -0
- package/external/fmt/include/fmt/args.h +228 -0
- package/{fmt/TEMP_UntilFmtUpdate/core.h → external/fmt/include/fmt/base.h} +1188 -1036
- package/external/fmt/include/fmt/chrono.h +2432 -0
- package/external/fmt/include/fmt/color.h +612 -0
- package/external/fmt/include/fmt/compile.h +529 -0
- package/external/fmt/include/fmt/core.h +5 -0
- package/external/fmt/include/fmt/format-inl.h +1928 -0
- package/external/fmt/include/fmt/format.h +4427 -0
- package/external/fmt/include/fmt/os.h +439 -0
- package/external/fmt/include/fmt/ostream.h +211 -0
- package/external/fmt/include/fmt/printf.h +656 -0
- package/external/fmt/include/fmt/ranges.h +882 -0
- package/external/fmt/include/fmt/std.h +699 -0
- package/external/fmt/include/fmt/xchar.h +322 -0
- package/external/fmt/src/fmt.cc +135 -0
- package/external/fmt/src/format.cc +43 -0
- package/external/fmt/src/os.cc +403 -0
- package/external/fmt/sync-config.json +8 -0
- package/external/folly/.syncignore +61 -0
- package/external/folly/LICENSE +200 -0
- package/{fmt → external/folly/folly}/.clang-format +0 -1
- package/external/folly/folly/AtomicHashArray-inl.h +546 -0
- package/external/folly/folly/AtomicHashArray.h +431 -0
- package/external/folly/folly/AtomicHashMap-inl.h +653 -0
- package/external/folly/folly/AtomicHashMap.h +484 -0
- package/external/folly/folly/AtomicIntrusiveLinkedList.h +206 -0
- package/external/folly/folly/AtomicLinkedList.h +110 -0
- package/external/folly/folly/AtomicUnorderedMap.h +522 -0
- package/external/folly/folly/BUCK +1631 -0
- package/external/folly/folly/BUILD_MODE.bzl +72 -0
- package/external/folly/folly/Benchmark.cpp +986 -0
- package/external/folly/folly/Benchmark.h +680 -0
- package/external/folly/folly/BenchmarkUtil.h +47 -0
- package/external/folly/folly/Bits.h +17 -0
- package/external/folly/folly/CMakeLists.txt +110 -0
- package/external/folly/folly/CPortability.h +338 -0
- package/external/folly/folly/CancellationToken-inl.h +449 -0
- package/external/folly/folly/CancellationToken.cpp +250 -0
- package/external/folly/folly/CancellationToken.h +365 -0
- package/external/folly/folly/Chrono.h +132 -0
- package/external/folly/folly/ClockGettimeWrappers.cpp +93 -0
- package/external/folly/folly/ClockGettimeWrappers.h +29 -0
- package/external/folly/folly/ConcurrentBitSet.h +157 -0
- package/external/folly/folly/ConcurrentLazy.h +74 -0
- package/external/folly/folly/ConcurrentSkipList-inl.h +341 -0
- package/external/folly/folly/ConcurrentSkipList.h +824 -0
- package/external/folly/folly/ConstructorCallbackList.h +158 -0
- package/external/folly/folly/Conv.h +2026 -0
- package/external/folly/folly/CppAttributes.h +170 -0
- package/external/folly/folly/CpuId.h +297 -0
- package/external/folly/folly/DefaultKeepAliveExecutor.h +172 -0
- package/external/folly/folly/Demangle.cpp +255 -0
- package/external/folly/folly/Demangle.h +73 -0
- package/external/folly/folly/DiscriminatedPtr.h +236 -0
- package/external/folly/folly/DynamicConverter.h +17 -0
- package/external/folly/folly/Exception.h +150 -0
- package/external/folly/folly/ExceptionString.cpp +51 -0
- package/external/folly/folly/ExceptionString.h +33 -0
- package/external/folly/folly/ExceptionWrapper-inl.h +264 -0
- package/external/folly/folly/ExceptionWrapper.cpp +37 -0
- package/external/folly/folly/ExceptionWrapper.h +377 -0
- package/external/folly/folly/Executor.cpp +111 -0
- package/external/folly/folly/Executor.h +351 -0
- package/external/folly/folly/Expected.h +1725 -0
- package/external/folly/folly/FBString.h +2888 -0
- package/external/folly/folly/FBVector.h +17 -0
- package/external/folly/folly/File.cpp +180 -0
- package/external/folly/folly/File.h +177 -0
- package/external/folly/folly/FileUtil.cpp +378 -0
- package/external/folly/folly/FileUtil.h +332 -0
- package/external/folly/folly/Fingerprint.cpp +135 -0
- package/external/folly/folly/Fingerprint.h +289 -0
- package/external/folly/folly/FixedString.h +2965 -0
- package/external/folly/folly/FollyMemcpy.cpp +30 -0
- package/external/folly/folly/FollyMemcpy.h +23 -0
- package/external/folly/folly/FollyMemset.cpp +29 -0
- package/external/folly/folly/FollyMemset.h +25 -0
- package/external/folly/folly/Format-inl.h +1152 -0
- package/external/folly/folly/Format.cpp +429 -0
- package/external/folly/folly/Format.h +463 -0
- package/external/folly/folly/FormatArg.h +285 -0
- package/external/folly/folly/FormatTraits.h +65 -0
- package/external/folly/folly/Function.h +1159 -0
- package/external/folly/folly/GLog.h +85 -0
- package/external/folly/folly/GroupVarint.cpp +153 -0
- package/external/folly/folly/GroupVarint.h +630 -0
- package/external/folly/folly/Hash.h +20 -0
- package/external/folly/folly/IPAddress.cpp +490 -0
- package/external/folly/folly/IPAddress.h +667 -0
- package/external/folly/folly/IPAddressException.h +82 -0
- package/external/folly/folly/IPAddressV4.cpp +305 -0
- package/external/folly/folly/IPAddressV4.h +495 -0
- package/external/folly/folly/IPAddressV6.cpp +541 -0
- package/external/folly/folly/IPAddressV6.h +627 -0
- package/external/folly/folly/Indestructible.h +164 -0
- package/external/folly/folly/IndexedMemPool.h +550 -0
- package/external/folly/folly/IntrusiveList.h +17 -0
- package/external/folly/folly/Lazy.h +142 -0
- package/external/folly/folly/Likely.h +76 -0
- package/external/folly/folly/MPMCPipeline.h +280 -0
- package/external/folly/folly/MPMCQueue.h +1556 -0
- package/external/folly/folly/MacAddress.cpp +188 -0
- package/external/folly/folly/MacAddress.h +260 -0
- package/external/folly/folly/MapUtil.h +17 -0
- package/external/folly/folly/Math.h +258 -0
- package/external/folly/folly/MaybeManagedPtr.h +120 -0
- package/external/folly/folly/Memory.h +900 -0
- package/external/folly/folly/MicroLock.cpp +76 -0
- package/external/folly/folly/MicroLock.h +354 -0
- package/external/folly/folly/MicroSpinLock.h +17 -0
- package/external/folly/folly/MoveWrapper.h +76 -0
- package/external/folly/folly/ObserverContainer.h +1026 -0
- package/external/folly/folly/Optional.h +743 -0
- package/external/folly/folly/Overload.h +325 -0
- package/external/folly/folly/PackedSyncPtr.h +147 -0
- package/external/folly/folly/Padded.h +464 -0
- package/external/folly/folly/Poly-inl.h +230 -0
- package/external/folly/folly/Poly.h +1095 -0
- package/external/folly/folly/PolyException.h +43 -0
- package/external/folly/folly/Portability.h +644 -0
- package/external/folly/folly/Preprocessor.h +236 -0
- package/external/folly/folly/ProducerConsumerQueue.h +182 -0
- package/external/folly/folly/RWSpinLock.h +17 -0
- package/external/folly/folly/Random-inl.h +86 -0
- package/external/folly/folly/Random.cpp +184 -0
- package/external/folly/folly/Random.h +434 -0
- package/external/folly/folly/Range.h +1772 -0
- package/external/folly/folly/Replaceable.h +636 -0
- package/external/folly/folly/ScopeGuard.cpp +29 -0
- package/external/folly/folly/ScopeGuard.h +420 -0
- package/external/folly/folly/SharedMutex.cpp +81 -0
- package/external/folly/folly/SharedMutex.h +1751 -0
- package/external/folly/folly/Singleton-inl.h +332 -0
- package/external/folly/folly/Singleton.cpp +512 -0
- package/external/folly/folly/Singleton.h +891 -0
- package/external/folly/folly/SingletonThreadLocal.cpp +53 -0
- package/external/folly/folly/SingletonThreadLocal.h +263 -0
- package/external/folly/folly/SocketAddress.cpp +786 -0
- package/external/folly/folly/SocketAddress.h +768 -0
- package/external/folly/folly/SpinLock.h +55 -0
- package/external/folly/folly/String-inl.h +668 -0
- package/external/folly/folly/String.cpp +777 -0
- package/external/folly/folly/String.h +767 -0
- package/external/folly/folly/Subprocess.cpp +1142 -0
- package/external/folly/folly/Subprocess.h +1055 -0
- package/external/folly/folly/Synchronized.h +1833 -0
- package/external/folly/folly/SynchronizedPtr.h +106 -0
- package/external/folly/folly/ThreadCachedInt.h +175 -0
- package/external/folly/folly/ThreadLocal.h +478 -0
- package/external/folly/folly/TimeoutQueue.cpp +78 -0
- package/external/folly/folly/TimeoutQueue.h +123 -0
- package/external/folly/folly/TokenBucket.h +673 -0
- package/external/folly/folly/Traits.h +1442 -0
- package/external/folly/folly/Try-inl.h +372 -0
- package/external/folly/folly/Try.cpp +23 -0
- package/external/folly/folly/Try.h +728 -0
- package/external/folly/folly/UTF8String.h +56 -0
- package/external/folly/folly/Unicode.cpp +201 -0
- package/external/folly/folly/Unicode.h +94 -0
- package/external/folly/folly/Unit.h +65 -0
- package/external/folly/folly/Uri-inl.h +101 -0
- package/external/folly/folly/Uri.cpp +190 -0
- package/external/folly/folly/Uri.h +142 -0
- package/external/folly/folly/Utility.h +932 -0
- package/external/folly/folly/VERSION +1 -0
- package/external/folly/folly/Varint.h +230 -0
- package/external/folly/folly/VirtualExecutor.h +17 -0
- package/external/folly/folly/algorithm/simd/BUCK +47 -0
- package/external/folly/folly/algorithm/simd/Contains.cpp +42 -0
- package/external/folly/folly/algorithm/simd/Contains.h +116 -0
- package/external/folly/folly/algorithm/simd/FindFixed.h +301 -0
- package/external/folly/folly/algorithm/simd/Ignore.h +52 -0
- package/external/folly/folly/algorithm/simd/Movemask.h +207 -0
- package/external/folly/folly/algorithm/simd/detail/BUCK +70 -0
- package/external/folly/folly/algorithm/simd/detail/ContainsImpl.h +91 -0
- package/external/folly/folly/algorithm/simd/detail/SimdAnyOf.h +83 -0
- package/external/folly/folly/algorithm/simd/detail/SimdForEach.h +209 -0
- package/external/folly/folly/algorithm/simd/detail/SimdPlatform.h +445 -0
- package/external/folly/folly/algorithm/simd/detail/Traits.h +125 -0
- package/external/folly/folly/algorithm/simd/detail/UnrollUtils.h +126 -0
- package/external/folly/folly/base64.h +264 -0
- package/external/folly/folly/chrono/BUCK +29 -0
- package/external/folly/folly/chrono/Clock.h +65 -0
- package/external/folly/folly/chrono/Conv.h +712 -0
- package/external/folly/folly/chrono/test/BUCK +26 -0
- package/external/folly/folly/chrono/test/ClockTest.cpp +68 -0
- package/external/folly/folly/chrono/test/ConvTest.cpp +652 -0
- package/external/folly/folly/concurrency/AtomicSharedPtr.h +387 -0
- package/external/folly/folly/concurrency/BUCK +170 -0
- package/external/folly/folly/concurrency/CacheLocality.h +460 -0
- package/external/folly/folly/concurrency/ConcurrentHashMap.h +822 -0
- package/external/folly/folly/concurrency/CoreCachedSharedPtr.h +232 -0
- package/external/folly/folly/concurrency/DeadlockDetector.cpp +27 -0
- package/external/folly/folly/concurrency/DeadlockDetector.h +44 -0
- package/external/folly/folly/concurrency/DynamicBoundedQueue.h +751 -0
- package/external/folly/folly/concurrency/PriorityUnboundedQueueSet.h +207 -0
- package/external/folly/folly/concurrency/ProcessLocalUniqueId.cpp +46 -0
- package/external/folly/folly/concurrency/ProcessLocalUniqueId.h +38 -0
- package/external/folly/folly/concurrency/SingletonRelaxedCounter.h +325 -0
- package/external/folly/folly/concurrency/ThreadCachedSynchronized.h +227 -0
- package/external/folly/folly/concurrency/UnboundedQueue.h +891 -0
- package/external/folly/folly/concurrency/container/BUCK +77 -0
- package/external/folly/folly/concurrency/container/FlatCombiningPriorityQueue.h +426 -0
- package/external/folly/folly/concurrency/container/LockFreeRingBuffer.h +306 -0
- package/external/folly/folly/concurrency/container/RelaxedConcurrentPriorityQueue.h +1212 -0
- package/external/folly/folly/concurrency/container/SingleWriterFixedHashMap.h +322 -0
- package/external/folly/folly/concurrency/container/atomic_grow_array.h +564 -0
- package/external/folly/folly/concurrency/container/test/BUCK +75 -0
- package/external/folly/folly/concurrency/container/test/FlatCombiningPriorityQueueTest.cpp +570 -0
- package/external/folly/folly/concurrency/container/test/LockFreeRingBufferTest.cpp +276 -0
- package/external/folly/folly/concurrency/container/test/RelaxedConcurrentPriorityQueueTest.cpp +1570 -0
- package/external/folly/folly/concurrency/container/test/SingleWriterFixedHashMapTest.cpp +401 -0
- package/external/folly/folly/concurrency/container/test/atomic_grow_array_test.cpp +187 -0
- package/external/folly/folly/concurrency/detail/AtomicSharedPtr-detail.h +212 -0
- package/external/folly/folly/concurrency/detail/ConcurrentHashMap-detail.h +1911 -0
- package/external/folly/folly/concurrency/memory/AtomicReadMostlyMainPtr.cpp +43 -0
- package/external/folly/folly/concurrency/memory/AtomicReadMostlyMainPtr.h +190 -0
- package/external/folly/folly/concurrency/memory/BUCK +53 -0
- package/external/folly/folly/concurrency/memory/PrimaryPtr.h +338 -0
- package/external/folly/folly/concurrency/memory/ReadMostlySharedPtr.h +511 -0
- package/external/folly/folly/concurrency/memory/TLRefCount.h +228 -0
- package/external/folly/folly/concurrency/memory/test/AtomicReadMostlyMainPtrBenchmark.cpp +56 -0
- package/external/folly/folly/concurrency/memory/test/AtomicReadMostlyMainPtrTest.cpp +454 -0
- package/external/folly/folly/concurrency/memory/test/BUCK +95 -0
- package/external/folly/folly/concurrency/memory/test/PrimaryPtrTest.cpp +303 -0
- package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrBenchmark.cpp +138 -0
- package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrStressTest.cpp +75 -0
- package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrTest.cpp +378 -0
- package/external/folly/folly/concurrency/memory/test/RefCountBenchmark.cpp +90 -0
- package/external/folly/folly/concurrency/memory/test/RefCountTest.cpp +168 -0
- package/external/folly/folly/concurrency/test/AtomicSharedPtrCounted.h +156 -0
- package/external/folly/folly/concurrency/test/AtomicSharedPtrPerformance.cpp +255 -0
- package/external/folly/folly/concurrency/test/AtomicSharedPtrTest.cpp +257 -0
- package/external/folly/folly/concurrency/test/BUCK +229 -0
- package/external/folly/folly/concurrency/test/CacheLocalityBenchmark.cpp +392 -0
- package/external/folly/folly/concurrency/test/CacheLocalityTest.cpp +1229 -0
- package/external/folly/folly/concurrency/test/ConcurrentHashMapBench.cpp +260 -0
- package/external/folly/folly/concurrency/test/ConcurrentHashMapTest.cpp +1242 -0
- package/external/folly/folly/concurrency/test/CoreCachedSharedPtrTest.cpp +408 -0
- package/external/folly/folly/concurrency/test/DynamicBoundedQueueTest.cpp +984 -0
- package/external/folly/folly/concurrency/test/PriorityUnboundedQueueSetTest.cpp +73 -0
- package/external/folly/folly/concurrency/test/ProcessLocalUniqueIdTest.cpp +66 -0
- package/external/folly/folly/concurrency/test/SingletonRelaxedCounterBench.cpp +101 -0
- package/external/folly/folly/concurrency/test/SingletonRelaxedCounterTest.cpp +185 -0
- package/external/folly/folly/concurrency/test/ThreadCachedSynchronizedBench.cpp +76 -0
- package/external/folly/folly/concurrency/test/ThreadCachedSynchronizedTest.cpp +93 -0
- package/external/folly/folly/concurrency/test/UnboundedQueueTest.cpp +1302 -0
- package/external/folly/folly/container/Access.h +57 -0
- package/external/folly/folly/container/Array.h +87 -0
- package/external/folly/folly/container/BUCK +353 -0
- package/external/folly/folly/container/BitIterator.h +203 -0
- package/external/folly/folly/container/Enumerate.h +162 -0
- package/external/folly/folly/container/EvictingCacheMap.h +730 -0
- package/external/folly/folly/container/F14.md +300 -0
- package/external/folly/folly/container/F14Map-fwd.h +113 -0
- package/external/folly/folly/container/F14Map.h +2108 -0
- package/external/folly/folly/container/F14Set-fwd.h +95 -0
- package/external/folly/folly/container/F14Set.h +1603 -0
- package/external/folly/folly/container/FBVector.h +1711 -0
- package/external/folly/folly/container/Foreach-inl.h +316 -0
- package/external/folly/folly/container/Foreach.h +209 -0
- package/external/folly/folly/container/HeterogeneousAccess-fwd.h +33 -0
- package/external/folly/folly/container/HeterogeneousAccess.h +171 -0
- package/external/folly/folly/container/IntrusiveHeap.h +268 -0
- package/external/folly/folly/container/IntrusiveList.h +131 -0
- package/external/folly/folly/container/Iterator.h +843 -0
- package/external/folly/folly/container/MapUtil.h +376 -0
- package/external/folly/folly/container/Merge.h +90 -0
- package/external/folly/folly/container/RegexMatchCache.cpp +521 -0
- package/external/folly/folly/container/RegexMatchCache.h +699 -0
- package/external/folly/folly/container/Reserve.h +109 -0
- package/external/folly/folly/container/SparseByteSet.h +123 -0
- package/external/folly/folly/container/View.h +81 -0
- package/external/folly/folly/container/WeightedEvictingCacheMap.h +651 -0
- package/external/folly/folly/container/detail/BUCK +115 -0
- package/external/folly/folly/container/detail/BitIteratorDetail.h +87 -0
- package/external/folly/folly/container/detail/F14Defaults.h +34 -0
- package/external/folly/folly/container/detail/F14IntrinsicsAvailability.h +67 -0
- package/external/folly/folly/container/detail/F14MapFallback.h +717 -0
- package/external/folly/folly/container/detail/F14Mask.h +235 -0
- package/external/folly/folly/container/detail/F14Policy.h +1523 -0
- package/external/folly/folly/container/detail/F14SetFallback.h +528 -0
- package/external/folly/folly/container/detail/F14Table.cpp +71 -0
- package/external/folly/folly/container/detail/F14Table.h +2680 -0
- package/external/folly/folly/container/detail/Util.h +303 -0
- package/external/folly/folly/container/detail/tape_detail.h +135 -0
- package/external/folly/folly/container/detail/test/BUCK +14 -0
- package/external/folly/folly/container/detail/test/F14DetailTest.cpp +47 -0
- package/external/folly/folly/container/heap_vector_types.h +1683 -0
- package/external/folly/folly/container/range_traits.h +81 -0
- package/external/folly/folly/container/small_vector.h +1476 -0
- package/external/folly/folly/container/sorted_vector_types.h +1652 -0
- package/external/folly/folly/container/span.h +408 -0
- package/external/folly/folly/container/tape.h +608 -0
- package/external/folly/folly/container/test/.clang-tidy +12 -0
- package/external/folly/folly/container/test/AccessTest.cpp +138 -0
- package/external/folly/folly/container/test/ArrayTest.cpp +84 -0
- package/external/folly/folly/container/test/BUCK +568 -0
- package/external/folly/folly/container/test/BitIteratorBench.cpp +112 -0
- package/external/folly/folly/container/test/BitIteratorTest.cpp +109 -0
- package/external/folly/folly/container/test/EnumerateTest.cpp +294 -0
- package/external/folly/folly/container/test/EvictingCacheMapBench.cpp +80 -0
- package/external/folly/folly/container/test/EvictingCacheMapTest.cpp +842 -0
- package/external/folly/folly/container/test/F14AsanSupportTest.cpp +143 -0
- package/external/folly/folly/container/test/F14FwdTest.cpp +37 -0
- package/external/folly/folly/container/test/F14InterprocessTest.cpp +404 -0
- package/external/folly/folly/container/test/F14MapTest.cpp +2543 -0
- package/external/folly/folly/container/test/F14PolicyTest.cpp +49 -0
- package/external/folly/folly/container/test/F14SetTest.cpp +1738 -0
- package/external/folly/folly/container/test/F14SmallOverheads.cpp +215 -0
- package/external/folly/folly/container/test/F14TestUtil.h +117 -0
- package/external/folly/folly/container/test/FBVectorBenchmark.cpp +380 -0
- package/external/folly/folly/container/test/FBVectorBenchmarks.cpp.h +100 -0
- package/external/folly/folly/container/test/FBVectorTest.cpp +326 -0
- package/external/folly/folly/container/test/FBVectorTests.cpp.h +304 -0
- package/external/folly/folly/container/test/ForeachBenchmark.cpp +388 -0
- package/external/folly/folly/container/test/ForeachTest.cpp +338 -0
- package/external/folly/folly/container/test/HashMapsBench.cpp +458 -0
- package/external/folly/folly/container/test/HeterogeneousAccessTest.cpp +242 -0
- package/external/folly/folly/container/test/IntrusiveHeapTest.cpp +262 -0
- package/external/folly/folly/container/test/IteratorTest.cpp +989 -0
- package/external/folly/folly/container/test/MapUtilTest.cpp +365 -0
- package/external/folly/folly/container/test/MergeTest.cpp +66 -0
- package/external/folly/folly/container/test/RegexMatchCacheTest.cpp +634 -0
- package/external/folly/folly/container/test/ReserveTest.cpp +173 -0
- package/external/folly/folly/container/test/SparseByteSetBenchmark.cpp +153 -0
- package/external/folly/folly/container/test/SparseByteSetTest.cpp +117 -0
- package/external/folly/folly/container/test/TrackingTypes.h +584 -0
- package/external/folly/folly/container/test/UtilTest.cpp +609 -0
- package/external/folly/folly/container/test/WeightedEvictingCacheMapTest.cpp +800 -0
- package/external/folly/folly/container/test/heap_vector_types_test.cpp +1774 -0
- package/external/folly/folly/container/test/range_traits_test.cpp +59 -0
- package/external/folly/folly/container/test/small_vector_test.cpp +1571 -0
- package/external/folly/folly/container/test/sorted_vector_test.cpp +1589 -0
- package/external/folly/folly/container/test/span_test.cpp +520 -0
- package/external/folly/folly/container/test/tape_bench.cpp +200 -0
- package/external/folly/folly/container/test/tape_test.cpp +590 -0
- package/external/folly/folly/defs.bzl +238 -0
- package/external/folly/folly/detail/AsyncTrace.cpp +36 -0
- package/external/folly/folly/detail/AsyncTrace.h +44 -0
- package/external/folly/folly/detail/AtomicHashUtils.h +42 -0
- package/external/folly/folly/detail/AtomicUnorderedMapUtils.h +80 -0
- package/external/folly/folly/detail/BUCK +406 -0
- package/external/folly/folly/detail/DiscriminatedPtrDetail.h +172 -0
- package/external/folly/folly/detail/FileUtilDetail.cpp +63 -0
- package/external/folly/folly/detail/FileUtilDetail.h +85 -0
- package/external/folly/folly/detail/FileUtilVectorDetail.h +81 -0
- package/external/folly/folly/detail/FingerprintPolynomial.h +132 -0
- package/external/folly/folly/detail/Futex-inl.h +123 -0
- package/external/folly/folly/detail/Futex.cpp +273 -0
- package/external/folly/folly/detail/Futex.h +109 -0
- package/external/folly/folly/detail/GroupVarintDetail.h +101 -0
- package/external/folly/folly/detail/IPAddress.cpp +37 -0
- package/external/folly/folly/detail/IPAddress.h +57 -0
- package/external/folly/folly/detail/IPAddressSource.h +278 -0
- package/external/folly/folly/detail/Iterators.h +156 -0
- package/external/folly/folly/detail/MPMCPipelineDetail.h +122 -0
- package/external/folly/folly/detail/MemoryIdler.cpp +233 -0
- package/external/folly/folly/detail/MemoryIdler.h +216 -0
- package/external/folly/folly/detail/PerfScoped.cpp +112 -0
- package/external/folly/folly/detail/PerfScoped.h +70 -0
- package/external/folly/folly/detail/PolyDetail.h +921 -0
- package/external/folly/folly/detail/RangeCommon.cpp +55 -0
- package/external/folly/folly/detail/RangeCommon.h +93 -0
- package/external/folly/folly/detail/RangeSse42.cpp +198 -0
- package/external/folly/folly/detail/RangeSse42.h +30 -0
- package/external/folly/folly/detail/SimpleSimdStringUtils.cpp +31 -0
- package/external/folly/folly/detail/SimpleSimdStringUtils.h +27 -0
- package/external/folly/folly/detail/SimpleSimdStringUtilsImpl.h +63 -0
- package/external/folly/folly/detail/Singleton.h +34 -0
- package/external/folly/folly/detail/SlowFingerprint.h +90 -0
- package/external/folly/folly/detail/SocketFastOpen.cpp +175 -0
- package/external/folly/folly/detail/SocketFastOpen.h +89 -0
- package/external/folly/folly/detail/SplitStringSimd.cpp +84 -0
- package/external/folly/folly/detail/SplitStringSimd.h +151 -0
- package/external/folly/folly/detail/SplitStringSimdImpl.h +149 -0
- package/external/folly/folly/detail/Sse.cpp +35 -0
- package/external/folly/folly/detail/Sse.h +45 -0
- package/external/folly/folly/detail/StaticSingletonManager.cpp +119 -0
- package/external/folly/folly/detail/StaticSingletonManager.h +298 -0
- package/external/folly/folly/detail/ThreadLocalDetail.cpp +492 -0
- package/external/folly/folly/detail/ThreadLocalDetail.h +800 -0
- package/external/folly/folly/detail/TrapOnAvx512.cpp +41 -0
- package/external/folly/folly/detail/TrapOnAvx512.h +21 -0
- package/external/folly/folly/detail/TurnSequencer.h +295 -0
- package/external/folly/folly/detail/TypeList.h +551 -0
- package/external/folly/folly/detail/UniqueInstance.cpp +136 -0
- package/external/folly/folly/detail/UniqueInstance.h +68 -0
- package/external/folly/folly/detail/base64_detail/BUCK +102 -0
- package/external/folly/folly/detail/base64_detail/Base64Api.cpp +40 -0
- package/external/folly/folly/detail/base64_detail/Base64Api.h +101 -0
- package/external/folly/folly/detail/base64_detail/Base64Common.h +80 -0
- package/external/folly/folly/detail/base64_detail/Base64Constants.h +79 -0
- package/external/folly/folly/detail/base64_detail/Base64HiddenConstants.h +129 -0
- package/external/folly/folly/detail/base64_detail/Base64SWAR.cpp +161 -0
- package/external/folly/folly/detail/base64_detail/Base64SWAR.h +32 -0
- package/external/folly/folly/detail/base64_detail/Base64Scalar.h +262 -0
- package/external/folly/folly/detail/base64_detail/Base64Simd.h +102 -0
- package/external/folly/folly/detail/base64_detail/Base64_SSE4_2.cpp +42 -0
- package/external/folly/folly/detail/base64_detail/Base64_SSE4_2.h +33 -0
- package/external/folly/folly/detail/base64_detail/Base64_SSE4_2_Platform.h +167 -0
- package/external/folly/folly/detail/base64_detail/README.md +392 -0
- package/external/folly/folly/detail/base64_detail/tests/BUCK +36 -0
- package/external/folly/folly/detail/base64_detail/tests/Base64AgainstScalarTest.cpp +141 -0
- package/external/folly/folly/detail/base64_detail/tests/Base64PlatformTest.cpp +273 -0
- package/external/folly/folly/detail/base64_detail/tests/Base64SpecialCasesTest.cpp +555 -0
- package/external/folly/folly/detail/test/AsyncTraceTest.cpp +43 -0
- package/external/folly/folly/detail/test/BUCK +118 -0
- package/external/folly/folly/detail/test/FileUtilDetailTest.cpp +56 -0
- package/external/folly/folly/detail/test/PerfScopedTest.cpp +107 -0
- package/external/folly/folly/detail/test/SimpleSimdStringUtilsTest.cpp +92 -0
- package/external/folly/folly/detail/test/SplitStringSimdTest.cpp +242 -0
- package/external/folly/folly/detail/test/StaticSingletonManagerTest.cpp +121 -0
- package/external/folly/folly/detail/test/ThreadLocalBenchmark.cpp +116 -0
- package/external/folly/folly/detail/test/ThreadLocalDetailTest.cpp +194 -0
- package/external/folly/folly/detail/test/TrapOnAvx512TestNegative.cpp +29 -0
- package/external/folly/folly/detail/test/UniqueInstanceTest.cpp +60 -0
- package/external/folly/folly/detail/thread_local_globals.cpp +69 -0
- package/external/folly/folly/detail/thread_local_globals.h +36 -0
- package/external/folly/folly/dynamic-inl.h +17 -0
- package/external/folly/folly/dynamic.h +17 -0
- package/external/folly/folly/folly_extended_library.bzl +28 -0
- package/external/folly/folly/functional/ApplyTuple.h +204 -0
- package/external/folly/folly/functional/BUCK +57 -0
- package/external/folly/folly/functional/Invoke.h +880 -0
- package/external/folly/folly/functional/Partial.h +130 -0
- package/external/folly/folly/functional/protocol.h +203 -0
- package/external/folly/folly/functional/test/ApplyTupleTest.cpp +549 -0
- package/external/folly/folly/functional/test/BUCK +57 -0
- package/external/folly/folly/functional/test/InvokeTest.cpp +483 -0
- package/external/folly/folly/functional/test/PartialTest.cpp +141 -0
- package/external/folly/folly/functional/test/protocol_test.cpp +177 -0
- package/external/folly/folly/functional/test/traits_test.cpp +551 -0
- package/external/folly/folly/functional/traits.h +675 -0
- package/external/folly/folly/hash/BUCK +86 -0
- package/external/folly/folly/hash/Checksum.cpp +275 -0
- package/external/folly/folly/hash/Checksum.h +94 -0
- package/external/folly/folly/hash/FarmHash.h +46 -0
- package/external/folly/folly/hash/Hash.h +1045 -0
- package/external/folly/folly/hash/MurmurHash.h +86 -0
- package/external/folly/folly/hash/SpookyHashV1.cpp +391 -0
- package/external/folly/folly/hash/SpookyHashV1.h +307 -0
- package/external/folly/folly/hash/SpookyHashV2.cpp +392 -0
- package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/hash/SpookyHashV2.h +6 -1
- package/external/folly/folly/hash/detail/BUCK +26 -0
- package/external/folly/folly/hash/detail/ChecksumDetail.cpp +296 -0
- package/external/folly/folly/hash/detail/ChecksumDetail.h +137 -0
- package/external/folly/folly/hash/detail/Crc32CombineDetail.cpp +191 -0
- package/external/folly/folly/hash/detail/Crc32cDetail.cpp +303 -0
- package/external/folly/folly/hash/test/BUCK +132 -0
- package/external/folly/folly/hash/test/ChecksumBenchmark.cpp +91 -0
- package/external/folly/folly/hash/test/ChecksumTest.cpp +587 -0
- package/external/folly/folly/hash/test/FarmHashTest.cpp +41 -0
- package/external/folly/folly/hash/test/HashBenchmark.cpp +238 -0
- package/external/folly/folly/hash/test/HashTest.cpp +997 -0
- package/external/folly/folly/hash/test/MurmurHashTest.cpp +76 -0
- package/external/folly/folly/hash/test/SpookyHashV1Test.cpp +559 -0
- package/external/folly/folly/hash/test/SpookyHashV2Test.cpp +549 -0
- package/external/folly/folly/hash/test/traits_test.cpp +69 -0
- package/external/folly/folly/hash/traits.h +115 -0
- package/external/folly/folly/json/BUCK +155 -0
- package/external/folly/folly/json/DynamicConverter.h +464 -0
- package/external/folly/folly/json/DynamicParser-inl.h +316 -0
- package/external/folly/folly/json/DynamicParser.cpp +198 -0
- package/external/folly/folly/json/DynamicParser.h +394 -0
- package/external/folly/folly/json/JSONSchema.cpp +1030 -0
- package/external/folly/folly/json/JSONSchema.h +73 -0
- package/external/folly/folly/json/JsonMockUtil.h +73 -0
- package/external/folly/folly/json/JsonTestUtil.cpp +167 -0
- package/external/folly/folly/json/JsonTestUtil.h +88 -0
- package/external/folly/folly/json/bser/BUCK +24 -0
- package/external/folly/folly/json/bser/Bser.h +107 -0
- package/external/folly/folly/json/bser/Dump.cpp +253 -0
- package/external/folly/folly/json/bser/Load.cpp +246 -0
- package/external/folly/folly/json/bser/test/BUCK +14 -0
- package/external/folly/folly/json/bser/test/BserTest.cpp +149 -0
- package/external/folly/folly/json/dynamic.cpp +552 -0
- package/external/folly/folly/json/dynamic.h +1346 -0
- package/external/folly/folly/json/json.h +238 -0
- package/external/folly/folly/json/json_patch.cpp +325 -0
- package/external/folly/folly/json/json_patch.h +126 -0
- package/external/folly/folly/json/json_pointer.cpp +114 -0
- package/external/folly/folly/json/json_pointer.h +87 -0
- package/external/folly/folly/json/test/BUCK +147 -0
- package/external/folly/folly/json/test/DynamicBenchmark.cpp +146 -0
- package/external/folly/folly/json/test/DynamicConverterTest.cpp +518 -0
- package/external/folly/folly/json/test/DynamicOtherTest.cpp +344 -0
- package/external/folly/folly/json/test/DynamicParserTest.cpp +443 -0
- package/external/folly/folly/json/test/DynamicTest.cpp +1647 -0
- package/external/folly/folly/json/test/JSONSchemaTest.cpp +450 -0
- package/external/folly/folly/json/test/JsonBenchmark.cpp +264 -0
- package/external/folly/folly/json/test/JsonOtherTest.cpp +51 -0
- package/external/folly/folly/json/test/JsonTest.cpp +1153 -0
- package/external/folly/folly/json/test/JsonTestUtilTest.cpp +97 -0
- package/external/folly/folly/json/test/json_patch_test.cpp +361 -0
- package/external/folly/folly/json/test/json_pointer_test.cpp +58 -0
- package/external/folly/folly/json/tool/BUCK +13 -0
- package/external/folly/folly/json/tool/JSONSchemaTester.cpp +58 -0
- package/external/folly/folly/json.h +17 -0
- package/external/folly/folly/json_patch.h +17 -0
- package/external/folly/folly/json_pointer.h +17 -0
- package/external/folly/folly/lang/Access.h +29 -0
- package/external/folly/folly/lang/Align.h +240 -0
- package/external/folly/folly/lang/Aligned.h +92 -0
- package/external/folly/folly/lang/Assume.h +82 -0
- package/external/folly/folly/lang/BUCK +287 -0
- package/external/folly/folly/lang/Badge.h +108 -0
- package/external/folly/folly/lang/Bits.h +570 -0
- package/external/folly/folly/lang/BitsClass.h +312 -0
- package/external/folly/folly/lang/Builtin.h +74 -0
- package/external/folly/folly/lang/CArray.h +34 -0
- package/external/folly/folly/lang/CString.cpp +86 -0
- package/external/folly/folly/lang/CString.h +55 -0
- package/external/folly/folly/lang/Cast.h +51 -0
- package/external/folly/folly/lang/CheckedMath.h +253 -0
- package/external/folly/folly/lang/CustomizationPoint.h +58 -0
- package/external/folly/folly/lang/Exception.cpp +822 -0
- package/external/folly/folly/lang/Exception.h +716 -0
- package/external/folly/folly/lang/Extern.h +55 -0
- package/external/folly/folly/lang/Hint-inl.h +144 -0
- package/external/folly/folly/lang/Hint.h +238 -0
- package/external/folly/folly/lang/Keep.h +98 -0
- package/external/folly/folly/lang/New.h +124 -0
- package/external/folly/folly/lang/Ordering.h +140 -0
- package/external/folly/folly/lang/Pretty.h +159 -0
- package/external/folly/folly/lang/PropagateConst.h +413 -0
- package/external/folly/folly/lang/RValueReferenceWrapper.h +152 -0
- package/external/folly/folly/lang/SafeAssert.cpp +589 -0
- package/external/folly/folly/lang/StaticConst.h +33 -0
- package/external/folly/folly/lang/Thunk.h +100 -0
- package/external/folly/folly/lang/TypeInfo.h +58 -0
- package/external/folly/folly/lang/UncaughtExceptions.cpp +17 -0
- package/external/folly/folly/lang/UncaughtExceptions.h +19 -0
- package/external/folly/folly/lang/test/AlignTest.cpp +87 -0
- package/external/folly/folly/lang/test/AlignedTest.cpp +130 -0
- package/external/folly/folly/lang/test/BUCK +258 -0
- package/external/folly/folly/lang/test/BadgeTest.cpp +89 -0
- package/external/folly/folly/lang/test/BitsBenchmark.cpp +164 -0
- package/external/folly/folly/lang/test/BitsClassBenchmark.cpp +122 -0
- package/external/folly/folly/lang/test/BitsClassTest.cpp +379 -0
- package/external/folly/folly/lang/test/BitsTest.cpp +577 -0
- package/external/folly/folly/lang/test/CStringTest.cpp +60 -0
- package/external/folly/folly/lang/test/CastTest.cpp +47 -0
- package/external/folly/folly/lang/test/CheckedMathTest.cpp +394 -0
- package/external/folly/folly/lang/test/ExceptionBench.cpp +427 -0
- package/external/folly/folly/lang/test/ExceptionTest.cpp +413 -0
- package/external/folly/folly/lang/test/ExternTest.cpp +39 -0
- package/external/folly/folly/lang/test/HintTest.cpp +100 -0
- package/external/folly/folly/lang/test/NewTest.cpp +38 -0
- package/external/folly/folly/lang/test/OrderingTest.cpp +105 -0
- package/external/folly/folly/lang/test/PrettyTest.cpp +44 -0
- package/external/folly/folly/lang/test/PropagateConstTest.cpp +356 -0
- package/external/folly/folly/lang/test/RValueReferenceWrapperTest.cpp +85 -0
- package/external/folly/folly/lang/test/SafeAssertTest.cpp +75 -0
- package/external/folly/folly/lang/test/ThunkTest.cpp +105 -0
- package/external/folly/folly/lang/test/ToAsciiBench.cpp +466 -0
- package/external/folly/folly/lang/test/ToAsciiTest.cpp +266 -0
- package/external/folly/folly/lang/test/TypeInfoTest.cpp +56 -0
- package/external/folly/folly/memcpy.S +292 -0
- package/external/folly/folly/memcpy_select_aarch64.cpp +145 -0
- package/external/folly/folly/memory/Arena-inl.h +83 -0
- package/external/folly/folly/memory/Arena.h +325 -0
- package/external/folly/folly/memory/BUCK +191 -0
- package/external/folly/folly/memory/JemallocHugePageAllocator.cpp +449 -0
- package/external/folly/folly/memory/JemallocHugePageAllocator.h +105 -0
- package/external/folly/folly/memory/JemallocHugePageAllocatorTest.cpp +341 -0
- package/external/folly/folly/memory/JemallocNodumpAllocator.cpp +176 -0
- package/external/folly/folly/memory/JemallocNodumpAllocator.h +119 -0
- package/external/folly/folly/memory/JemallocNodumpAllocatorTest.cpp +61 -0
- package/external/folly/folly/memory/MallctlHelper.cpp +37 -0
- package/external/folly/folly/memory/MallctlHelper.h +167 -0
- package/external/folly/folly/memory/Malloc.h +551 -0
- package/external/folly/folly/memory/MemoryResource.h +57 -0
- package/external/folly/folly/memory/ReentrantAllocator.cpp +162 -0
- package/external/folly/folly/memory/ReentrantAllocator.h +261 -0
- package/external/folly/folly/memory/SanitizeAddress.cpp +75 -0
- package/external/folly/folly/memory/SanitizeAddress.h +117 -0
- package/external/folly/folly/memory/SanitizeLeak.cpp +119 -0
- package/external/folly/folly/memory/SanitizeLeak.h +108 -0
- package/external/folly/folly/memory/ThreadCachedArena.cpp +53 -0
- package/external/folly/folly/memory/ThreadCachedArena.h +90 -0
- package/external/folly/folly/memory/UninitializedMemoryHacks.h +426 -0
- package/external/folly/folly/memory/detail/BUCK +10 -0
- package/external/folly/folly/memory/detail/MallocImpl.cpp +52 -0
- package/external/folly/folly/memory/detail/MallocImpl.h +97 -0
- package/external/folly/folly/memory/not_null-inl.h +522 -0
- package/external/folly/folly/memory/not_null.h +449 -0
- package/external/folly/folly/memory/test/ArenaTest.cpp +354 -0
- package/external/folly/folly/memory/test/BUCK +146 -0
- package/external/folly/folly/memory/test/MallctlHelperTest.cpp +169 -0
- package/external/folly/folly/memory/test/MallocBenchmark.cpp +91 -0
- package/external/folly/folly/memory/test/MallocTest.cpp +78 -0
- package/external/folly/folly/memory/test/MemoryResourceTest.cpp +31 -0
- package/external/folly/folly/memory/test/ReentrantAllocatorTest.cpp +144 -0
- package/external/folly/folly/memory/test/SanitizeAddressTest.cpp +67 -0
- package/external/folly/folly/memory/test/SanitizeLeakTest.cpp +139 -0
- package/external/folly/folly/memory/test/ThreadCachedArenaTest.cpp +276 -0
- package/external/folly/folly/memory/test/UninitializedMemoryHacksODR.cpp +21 -0
- package/external/folly/folly/memory/test/UninitializedMemoryHacksTest.cpp +327 -0
- package/external/folly/folly/memory/test/not_null_test.cpp +608 -0
- package/external/folly/folly/memset.S +245 -0
- package/external/folly/folly/memset_select_aarch64.cpp +72 -0
- package/external/folly/folly/portability/Asm.h +50 -0
- package/external/folly/folly/portability/Atomic.h +31 -0
- package/external/folly/folly/portability/BUCK +456 -0
- package/external/folly/folly/portability/Builtins.cpp +31 -0
- package/external/folly/folly/portability/Builtins.h +161 -0
- package/external/folly/folly/portability/Config.h +43 -0
- package/external/folly/folly/portability/Constexpr.h +145 -0
- package/external/folly/folly/portability/Dirent.cpp +140 -0
- package/external/folly/folly/portability/Dirent.h +41 -0
- package/external/folly/folly/portability/Event.h +44 -0
- package/external/folly/folly/portability/Fcntl.cpp +120 -0
- package/external/folly/folly/portability/Fcntl.h +67 -0
- package/external/folly/folly/portability/Filesystem.cpp +67 -0
- package/external/folly/folly/portability/Filesystem.h +114 -0
- package/external/folly/folly/portability/FmtCompile.h +40 -0
- package/external/folly/folly/portability/GFlags.h +139 -0
- package/external/folly/folly/portability/GMock.h +35 -0
- package/external/folly/folly/portability/GTest.h +35 -0
- package/external/folly/folly/portability/IOVec.h +34 -0
- package/external/folly/folly/portability/Libgen.cpp +59 -0
- package/external/folly/folly/portability/Libgen.h +29 -0
- package/external/folly/folly/portability/Libunwind.h +21 -0
- package/external/folly/folly/portability/Malloc.cpp +31 -0
- package/external/folly/folly/portability/Malloc.h +53 -0
- package/external/folly/folly/portability/Math.h +90 -0
- package/external/folly/folly/portability/Memory.h +26 -0
- package/external/folly/folly/portability/OpenSSL.cpp +17 -0
- package/external/folly/folly/portability/OpenSSL.h +102 -0
- package/external/folly/folly/portability/PThread.cpp +697 -0
- package/external/folly/folly/portability/PThread.h +148 -0
- package/external/folly/folly/portability/README.md +21 -0
- package/external/folly/folly/portability/Sched.cpp +41 -0
- package/external/folly/folly/portability/Sched.h +45 -0
- package/external/folly/folly/portability/Sockets.cpp +245 -0
- package/external/folly/folly/portability/Sockets.h +155 -0
- package/external/folly/folly/portability/SourceLocation.h +49 -0
- package/external/folly/folly/portability/Stdio.cpp +77 -0
- package/external/folly/folly/portability/Stdio.h +32 -0
- package/external/folly/folly/portability/Stdlib.cpp +172 -0
- package/external/folly/folly/portability/Stdlib.h +64 -0
- package/external/folly/folly/portability/String.cpp +53 -0
- package/external/folly/folly/portability/String.h +39 -0
- package/external/folly/folly/portability/SysFile.cpp +46 -0
- package/external/folly/folly/portability/SysFile.h +27 -0
- package/external/folly/folly/portability/SysMembarrier.cpp +104 -0
- package/external/folly/folly/portability/SysMembarrier.h +26 -0
- package/external/folly/folly/portability/SysMman.cpp +242 -0
- package/external/folly/folly/portability/SysMman.h +68 -0
- package/external/folly/folly/portability/SysResource.cpp +108 -0
- package/external/folly/folly/portability/SysResource.h +71 -0
- package/external/folly/folly/portability/SysStat.cpp +66 -0
- package/external/folly/folly/portability/SysStat.h +52 -0
- package/external/folly/folly/portability/SysSyscall.h +73 -0
- package/external/folly/folly/portability/SysTime.cpp +62 -0
- package/external/folly/folly/portability/SysTime.h +50 -0
- package/external/folly/folly/portability/SysTypes.h +44 -0
- package/external/folly/folly/portability/SysUio.cpp +179 -0
- package/external/folly/folly/portability/SysUio.h +51 -0
- package/external/folly/folly/portability/Syslog.h +39 -0
- package/external/folly/folly/portability/Time.cpp +357 -0
- package/external/folly/folly/portability/Time.h +74 -0
- package/external/folly/folly/portability/Unistd.h +111 -0
- package/external/folly/folly/portability/Windows.h +108 -0
- package/external/folly/folly/portability/openat2.c +30 -0
- package/external/folly/folly/portability/openat2.h +39 -0
- package/external/folly/folly/portability/test/BUCK +59 -0
- package/external/folly/folly/portability/test/ConstexprTest.cpp +102 -0
- package/external/folly/folly/portability/test/FilesystemTest.cpp +35 -0
- package/external/folly/folly/portability/test/LibgenTest.cpp +35 -0
- package/external/folly/folly/portability/test/OpenSSLPortabilityTest.cpp +108 -0
- package/external/folly/folly/portability/test/PThreadTest.cpp +80 -0
- package/external/folly/folly/portability/test/TimeTest.cpp +90 -0
- package/external/folly/folly/small_vector.h +17 -0
- package/external/folly/folly/somerge_defs.bzl +399 -0
- package/external/folly/folly/sorted_vector_types.h +17 -0
- package/external/folly/folly/stop_watch.h +317 -0
- package/external/folly/folly/synchronization/AsymmetricThreadFence.cpp +91 -0
- package/external/folly/folly/synchronization/AsymmetricThreadFence.h +60 -0
- package/external/folly/folly/synchronization/AtomicNotification-inl.h +146 -0
- package/external/folly/folly/synchronization/AtomicNotification.cpp +34 -0
- package/external/folly/folly/synchronization/AtomicNotification.h +117 -0
- package/external/folly/folly/synchronization/AtomicRef.h +181 -0
- package/external/folly/folly/synchronization/AtomicStruct.h +150 -0
- package/external/folly/folly/synchronization/AtomicUtil-inl.h +482 -0
- package/external/folly/folly/synchronization/AtomicUtil.h +179 -0
- package/external/folly/folly/synchronization/BUCK +418 -0
- package/external/folly/folly/synchronization/Baton.h +419 -0
- package/external/folly/folly/synchronization/CallOnce.h +263 -0
- package/external/folly/folly/synchronization/DelayedInit.h +179 -0
- package/external/folly/folly/synchronization/DistributedMutex-inl.h +1744 -0
- package/external/folly/folly/synchronization/DistributedMutex.cpp +27 -0
- package/external/folly/folly/synchronization/DistributedMutex.h +342 -0
- package/external/folly/folly/synchronization/EventCount.h +200 -0
- package/external/folly/folly/synchronization/FlatCombining.h +629 -0
- package/external/folly/folly/synchronization/Hazptr-fwd.h +217 -0
- package/external/folly/folly/synchronization/Hazptr.cpp +36 -0
- package/external/folly/folly/synchronization/Hazptr.h +209 -0
- package/external/folly/folly/synchronization/HazptrDomain.cpp +68 -0
- package/external/folly/folly/synchronization/HazptrDomain.h +832 -0
- package/external/folly/folly/synchronization/HazptrHolder.h +431 -0
- package/external/folly/folly/synchronization/HazptrObj.h +533 -0
- package/external/folly/folly/synchronization/HazptrObjLinked.h +315 -0
- package/external/folly/folly/synchronization/HazptrRec.h +68 -0
- package/external/folly/folly/synchronization/HazptrThrLocal.h +180 -0
- package/external/folly/folly/synchronization/HazptrThreadPoolExecutor.cpp +46 -0
- package/external/folly/folly/synchronization/HazptrThreadPoolExecutor.h +25 -0
- package/external/folly/folly/synchronization/Latch.h +160 -0
- package/external/folly/folly/synchronization/LifoSem.h +767 -0
- package/external/folly/folly/synchronization/Lock.h +887 -0
- package/external/folly/folly/synchronization/MicroSpinLock.h +154 -0
- package/external/folly/folly/synchronization/NativeSemaphore.h +187 -0
- package/external/folly/folly/synchronization/ParkingLot.cpp +37 -0
- package/external/folly/folly/synchronization/ParkingLot.h +330 -0
- package/external/folly/folly/synchronization/PicoSpinLock.h +167 -0
- package/external/folly/folly/synchronization/RWSpinLock.h +549 -0
- package/external/folly/folly/synchronization/Rcu.cpp +26 -0
- package/external/folly/folly/synchronization/Rcu.h +553 -0
- package/external/folly/folly/synchronization/RelaxedAtomic.h +336 -0
- package/external/folly/folly/synchronization/SanitizeThread.cpp +141 -0
- package/external/folly/folly/synchronization/SanitizeThread.h +166 -0
- package/external/folly/folly/synchronization/SaturatingSemaphore.h +324 -0
- package/external/folly/folly/synchronization/SmallLocks.h +36 -0
- package/external/folly/folly/synchronization/ThrottledLifoSem.h +362 -0
- package/external/folly/folly/synchronization/WaitOptions.cpp +25 -0
- package/external/folly/folly/synchronization/WaitOptions.h +75 -0
- package/external/folly/folly/synchronization/detail/AtomicUtils.h +59 -0
- package/external/folly/folly/synchronization/detail/BUCK +104 -0
- package/external/folly/folly/synchronization/detail/Hardware.cpp +192 -0
- package/external/folly/folly/synchronization/detail/Hardware.h +75 -0
- package/external/folly/folly/synchronization/detail/HazptrUtils.h +339 -0
- package/external/folly/folly/synchronization/detail/InlineFunctionRef.h +229 -0
- package/external/folly/folly/synchronization/detail/Sleeper.cpp +27 -0
- package/external/folly/folly/synchronization/detail/Sleeper.h +62 -0
- package/external/folly/folly/synchronization/detail/Spin.h +96 -0
- package/external/folly/folly/synchronization/detail/ThreadCachedLists.h +174 -0
- package/external/folly/folly/synchronization/detail/ThreadCachedReaders.h +189 -0
- package/external/folly/folly/synchronization/detail/ThreadCachedTag.h +26 -0
- package/external/folly/folly/synchronization/detail/test/BUCK +28 -0
- package/external/folly/folly/synchronization/detail/test/HardwareTest.cpp +74 -0
- package/external/folly/folly/synchronization/detail/test/InlineFunctionRefTest.cpp +286 -0
- package/external/folly/folly/synchronization/example/BUCK +27 -0
- package/external/folly/folly/synchronization/example/HazptrLockFreeLIFO.h +88 -0
- package/external/folly/folly/synchronization/example/HazptrSWMRSet.h +133 -0
- package/external/folly/folly/synchronization/example/HazptrWideCAS.h +62 -0
- package/external/folly/folly/synchronization/test/AtomicNotificationTest.cpp +236 -0
- package/external/folly/folly/synchronization/test/AtomicRefTest.cpp +170 -0
- package/external/folly/folly/synchronization/test/AtomicStructTest.cpp +65 -0
- package/external/folly/folly/synchronization/test/AtomicUtilBench.cpp +457 -0
- package/external/folly/folly/synchronization/test/AtomicUtilTest.cpp +650 -0
- package/external/folly/folly/synchronization/test/BUCK +495 -0
- package/external/folly/folly/synchronization/test/Barrier.h +52 -0
- package/external/folly/folly/synchronization/test/BarrierTest.cpp +56 -0
- package/external/folly/folly/synchronization/test/BatonBenchmark.cpp +77 -0
- package/external/folly/folly/synchronization/test/BatonTest.cpp +164 -0
- package/external/folly/folly/synchronization/test/BatonTestHelpers.h +118 -0
- package/external/folly/folly/synchronization/test/CallOnceBenchmark.cpp +72 -0
- package/external/folly/folly/synchronization/test/CallOnceTest.cpp +153 -0
- package/external/folly/folly/synchronization/test/DelayedInitTest.cpp +281 -0
- package/external/folly/folly/synchronization/test/DistributedMutexTest.cpp +2074 -0
- package/external/folly/folly/synchronization/test/EventCountTest.cpp +124 -0
- package/external/folly/folly/synchronization/test/FlatCombiningBenchmark.cpp +1789 -0
- package/external/folly/folly/synchronization/test/FlatCombiningExamples.h +222 -0
- package/external/folly/folly/synchronization/test/FlatCombiningTest.cpp +121 -0
- package/external/folly/folly/synchronization/test/FlatCombiningTestHelpers.h +227 -0
- package/external/folly/folly/synchronization/test/HazptrTest.cpp +1689 -0
- package/external/folly/folly/synchronization/test/LatchTest.cpp +224 -0
- package/external/folly/folly/synchronization/test/LifoSemBench.cpp +185 -0
- package/external/folly/folly/synchronization/test/LifoSemTests.cpp +353 -0
- package/external/folly/folly/synchronization/test/LockTest.cpp +1239 -0
- package/external/folly/folly/synchronization/test/NativeSemaphoreTest.cpp +37 -0
- package/external/folly/folly/synchronization/test/ParkingLotBenchmark.cpp +239 -0
- package/external/folly/folly/synchronization/test/ParkingLotTest.cpp +170 -0
- package/external/folly/folly/synchronization/test/RWSpinLockTest.cpp +235 -0
- package/external/folly/folly/synchronization/test/RcuBench.cpp +66 -0
- package/external/folly/folly/synchronization/test/RcuTest.cpp +330 -0
- package/external/folly/folly/synchronization/test/RelaxedAtomicTest.cpp +389 -0
- package/external/folly/folly/synchronization/test/SaturatingSemaphoreTest.cpp +166 -0
- package/external/folly/folly/synchronization/test/Semaphore.h +242 -0
- package/external/folly/folly/synchronization/test/SemaphoreTest.cpp +271 -0
- package/external/folly/folly/synchronization/test/SmallLocksBenchmark.cpp +1296 -0
- package/external/folly/folly/synchronization/test/SmallLocksTest.cpp +510 -0
- package/external/folly/folly/synchronization/test/ThreadCachedEpochBench.h +67 -0
- package/external/folly/folly/synchronization/test/ThreadCachedReadersBench.cpp +42 -0
- package/external/folly/folly/synchronization/test/ThreadCachedReadersTest.cpp +52 -0
- package/external/folly/folly/synchronization/test/ThrottledLifoSemTest.cpp +243 -0
- package/external/folly/folly/system/AtFork.cpp +205 -0
- package/external/folly/folly/system/AtFork.h +116 -0
- package/external/folly/folly/system/AuxVector.h +198 -0
- package/external/folly/folly/system/BUCK +144 -0
- package/external/folly/folly/system/EnvUtil.cpp +93 -0
- package/external/folly/folly/system/EnvUtil.h +113 -0
- package/external/folly/folly/system/HardwareConcurrency.cpp +39 -0
- package/external/folly/folly/system/HardwareConcurrency.h +23 -0
- package/external/folly/folly/system/MemoryMapping.cpp +477 -0
- package/external/folly/folly/system/MemoryMapping.h +287 -0
- package/external/folly/folly/system/Pid.cpp +87 -0
- package/external/folly/folly/system/Pid.h +34 -0
- package/external/folly/folly/system/Shell.cpp +33 -0
- package/external/folly/folly/system/Shell.h +93 -0
- package/external/folly/folly/system/ThreadId.cpp +89 -0
- package/external/folly/folly/system/ThreadId.h +62 -0
- package/external/folly/folly/system/ThreadName.cpp +330 -0
- package/external/folly/folly/system/ThreadName.h +72 -0
- package/external/folly/folly/system/test/AtForkTest.cpp +309 -0
- package/external/folly/folly/system/test/AuxVectorTest.cpp +55 -0
- package/external/folly/folly/system/test/BUCK +120 -0
- package/external/folly/folly/system/test/EnvUtilSubprocess.cpp +26 -0
- package/external/folly/folly/system/test/EnvUtilTest.cpp +197 -0
- package/external/folly/folly/system/test/MemoryMappingTest.cpp +179 -0
- package/external/folly/folly/system/test/PidTest.cpp +46 -0
- package/external/folly/folly/system/test/ShellTest.cpp +66 -0
- package/external/folly/folly/system/test/ThreadIdTest.cpp +114 -0
- package/external/folly/folly/system/test/ThreadNameTest.cpp +85 -0
- package/external/folly/folly.vcxitems +164 -0
- package/external/folly/sync-config.json +8 -0
- package/package.json +3 -3
- package/template/cpp-app/proj/MyApp.sln +0 -33
- package/template/cpp-lib/proj/MyLib.sln +0 -33
- package/template/cs-app/proj/MyApp.sln +0 -33
- package/template/cs-lib/proj/MyLib.sln +0 -33
- package/templates/cpp-app/windows/MyApp.sln +0 -33
- package/templates/cpp-lib/windows/MyLib.sln +0 -33
- package/Folly/Folly.vcxproj +0 -383
- package/Folly/Folly.vcxproj.filters +0 -558
- package/Folly/Folly.win32.vcxproj +0 -11
- package/Folly/packages.lock.win32.json +0 -20
- package/fmt/fmt.vcxproj +0 -163
- package/fmt/fmt.vcxproj.filters +0 -59
- package/fmt/fmt.win32.vcxproj +0 -10
- package/fmt/pch.cpp +0 -4
- package/fmt/pch.h +0 -2
- /package/{Folly → external/folly}/Folly.natvis +0 -0
- /package/{Folly → external/folly}/cgmanifest.json +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/ConstexprMath.h +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/Conv.cpp +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/chrono/Hardware.h +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/concurrency/CacheLocality.cpp +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/json/dynamic-inl.h +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/json/json.cpp +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/lang/SafeAssert.h +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/lang/ToAscii.cpp +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/lang/ToAscii.h +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/portability/Unistd.cpp +0 -0
|
@@ -0,0 +1,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
|