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

source code of libc/test/UnitTest/ExecuteFunction.h