Iros
 
Loading...
Searching...
No Matches
process.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/assert/prelude.h"
7#include "di/util/prelude.h"
8#include "dius/config.h"
9#include "dius/error.h"
10#include "dius/sync_file.h"
11
12#include DIUS_PLATFORM_PATH(process.h)
13
14namespace dius::system {
16public:
17 explicit ProcessResult(int exit_code_or_signal, bool signaled)
18 : m_exit_code_or_signal(exit_code_or_signal), m_signaled(signaled) {}
19
20 auto signaled() const -> bool { return m_signaled; }
21 auto exited() const -> bool { return !m_signaled; }
22
23 auto exit_code() const -> int {
24 ASSERT(exited());
25 return m_exit_code_or_signal;
26 }
27
28 auto signal() const -> int {
30 return m_exit_code_or_signal;
31 }
32
33private:
34 int m_exit_code_or_signal { 0 };
35 bool m_signaled { false };
36};
37
38class Process {
39 struct FileAction {
40 enum class Type {
41 Open,
42 Dup,
43 Close,
44 };
45
46 Type type { Type::Dup };
47 i32 arg0 = 0;
48 i32 arg1 = 0;
49 i32 arg2 = 0;
50 di::Path path;
51 };
52
53public:
54 explicit Process(di::Vector<di::TransparentString> arguments) : m_arguments(di::move(arguments)) {}
55
56 auto with_file_open(i32 fd, di::Path path, OpenMode open_mode, u16 create_mode = 0666) && -> Process {
57 m_file_actions.push_back(
58 { FileAction::Type::Open, fd, static_cast<i32>(open_mode), i32(create_mode), di::move(path) });
59 return di::move(*this);
60 }
61
62 auto with_file_close(i32 fd) && -> Process {
63 m_file_actions.push_back({ FileAction::Type::Close, fd, 0, 0, {} });
64 return di::move(*this);
65 }
66
67 auto with_file_dup(i32 old_fd, i32 new_fd) && -> Process {
68 m_file_actions.push_back({ FileAction::Type::Dup, old_fd, new_fd, 0, {} });
69 return di::move(*this);
70 }
71
73 m_new_session = true;
74 return di::move(*this);
75 }
76
78
79private:
81 di::Vector<FileAction> m_file_actions;
82 bool m_new_session { false };
83};
84
89
93[[noreturn]] void exit_thread();
94
95[[noreturn]] void exit_process(int status_code);
96}
#define ASSERT
Definition assert_bool.h:16
Definition vector_forward_declaration.h:8
auto signaled() const -> bool
Definition process.h:20
ProcessResult(int exit_code_or_signal, bool signaled)
Definition process.h:17
auto exited() const -> bool
Definition process.h:21
auto exit_code() const -> int
Definition process.h:23
auto signal() const -> int
Definition process.h:28
auto with_file_dup(i32 old_fd, i32 new_fd) &&-> Process
Definition process.h:67
auto with_file_close(i32 fd) &&-> Process
Definition process.h:62
auto with_file_open(i32 fd, di::Path path, OpenMode open_mode, u16 create_mode=0666) &&-> Process
Definition process.h:56
auto spawn_and_wait() &&-> di::Result< ProcessResult >
Definition process.cpp:35
auto with_new_session() &&-> Process
Definition process.h:72
Process(di::Vector< di::TransparentString > arguments)
Definition process.h:54
PathImpl< TransparentString > Path
Definition path.h:10
__INT32_TYPE__ i32
Definition integers.h:16
__UINT16_TYPE__ u16
Definition integers.h:10
Expected< T, Error > Result
Definition result.h:8
Definition zstring_parser.h:9
Definition system_call.h:11
void exit_process(int status_code)
Definition process.cpp:127
auto mask_signal(Signal signal) -> di::Result< void >
Definition process.cpp:92
auto wait_for_signal(Signal signal) -> di::Result< Signal >
Definition process.cpp:111
auto send_signal(ProcessId id, Signal signal) -> di::Result< void >
Definition process.cpp:103
auto get_process_id() -> ProcessId
Definition process.cpp:88
void exit_thread()
Exit the currently executing thread.
Definition process.cpp:123
int ProcessId
Definition process.h:4
OpenMode
Definition sync_file.h:109
Signal
Definition process.h:6
void(*)(int) signal(int __sig, void(*__handler)(int))
Definition signal.h:10