1e3645eadSSiva Chandra Reddy //===-- ExecuteFunction.h ---------------------------------------*- C++ -*-===// 2e3645eadSSiva Chandra Reddy // 3e3645eadSSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e3645eadSSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information. 5e3645eadSSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e3645eadSSiva Chandra Reddy // 7e3645eadSSiva Chandra Reddy //===----------------------------------------------------------------------===// 8e3645eadSSiva Chandra Reddy 9330793c9SNick Desaulniers #ifndef LLVM_LIBC_TEST_UNITTEST_EXECUTEFUNCTION_H 10330793c9SNick Desaulniers #define LLVM_LIBC_TEST_UNITTEST_EXECUTEFUNCTION_H 11e3645eadSSiva Chandra Reddy 12*5ff3ff33SPetr Hosek #include "src/__support/macros/config.h" 13e3645eadSSiva Chandra Reddy #include <stdint.h> 14e3645eadSSiva Chandra Reddy 15*5ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL { 16e3645eadSSiva Chandra Reddy namespace testutils { 17e3645eadSSiva Chandra Reddy 18e3645eadSSiva Chandra Reddy class FunctionCaller { 19e3645eadSSiva Chandra Reddy public: 20e3645eadSSiva Chandra Reddy virtual ~FunctionCaller() {} 21e3645eadSSiva Chandra Reddy virtual void operator()() = 0; 22e3645eadSSiva Chandra Reddy }; 23e3645eadSSiva Chandra Reddy 24e3645eadSSiva Chandra Reddy struct ProcessStatus { 25e3645eadSSiva Chandra Reddy int platform_defined; 26e3645eadSSiva Chandra Reddy const char *failure = nullptr; 27e3645eadSSiva Chandra Reddy 28e3645eadSSiva Chandra Reddy static constexpr unsigned TIMEOUT = ~0U; 29e3645eadSSiva Chandra Reddy 30e3645eadSSiva Chandra Reddy static ProcessStatus error(const char *error) { return {0, error}; } 31e3645eadSSiva Chandra Reddy static ProcessStatus timed_out_ps() { 32e3645eadSSiva Chandra Reddy return {0, reinterpret_cast<const char *>(TIMEOUT)}; 33e3645eadSSiva Chandra Reddy } 34e3645eadSSiva Chandra Reddy 35e3645eadSSiva Chandra Reddy bool timed_out() const { 36e3645eadSSiva Chandra Reddy return failure == reinterpret_cast<const char *>(TIMEOUT); 37e3645eadSSiva Chandra Reddy } 38e3645eadSSiva Chandra Reddy const char *get_error() const { return timed_out() ? nullptr : failure; } 39e3645eadSSiva Chandra Reddy bool exited_normally(); 40e3645eadSSiva Chandra Reddy int get_exit_code(); 41e3645eadSSiva Chandra Reddy int get_fatal_signal(); 42e3645eadSSiva Chandra Reddy }; 43e3645eadSSiva Chandra Reddy 44e3645eadSSiva Chandra Reddy ProcessStatus 45e3645eadSSiva Chandra Reddy invoke_in_subprocess(FunctionCaller *func, 46e3645eadSSiva Chandra Reddy unsigned timeout_ms = ProcessStatus::TIMEOUT); 47e3645eadSSiva Chandra Reddy 48e3645eadSSiva Chandra Reddy const char *signal_as_string(int signum); 49e3645eadSSiva Chandra Reddy 50e3645eadSSiva Chandra Reddy } // namespace testutils 51*5ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL 52e3645eadSSiva Chandra Reddy 53330793c9SNick Desaulniers #endif // LLVM_LIBC_TEST_UNITTEST_EXECUTEFUNCTION_H 54