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