quic/qbox
Loading...
Searching...
No Matches
uutils.h
1/*
2 * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All Rights Reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#ifndef _GREENSOCS_BASE_COMPONENTS_UUTILS
8#define _GREENSOCS_BASE_COMPONENTS_UUTILS
9
10#ifndef WIN32
11
12#include <fcntl.h>
13#include <sys/mman.h>
14#include <sys/stat.h>
15#include <csignal>
16#include <signal.h>
17#include <cstdlib>
18#include <sys/types.h>
19#include <sys/socket.h>
20#include <unistd.h>
21#include <poll.h>
22#include <sys/wait.h>
23#include <cassert>
24#include <iostream>
25#include <thread>
26#include <map>
27#include <utility>
28#include <functional>
29#include <vector>
30#include <atomic>
31#include <systemc>
32#include <unordered_map>
33#include <scp/report.h>
34#include <mutex>
35
36namespace gs {
37
38class SigHandler : public sc_core::sc_prim_channel
39{
40public:
41 static SigHandler& get();
42
43 enum class Handler_CB {
44 EXIT, // run signal_handler then exit
45 PASS, // run signal_handler
46 FORCE_EXIT, // just exit
47 IGN, // ignore
48 DFL, // default
49 };
50
51 static void pass_sig_handler(int sig);
52
53 static void force_exit_sig_handler(int sig);
54
55 void add_sig_handler(int signum, Handler_CB s_cb);
56
57 template <typename CONT_TYPE>
58 void register_cb(const std::string& name, std::unordered_map<std::string, std::function<CONT_TYPE>>& container,
59 const std::function<CONT_TYPE>& cb, const std::string& type_of_cb);
60
61 template <typename CONT_TYPE>
62 void deregister_cb(const std::string& name, std::unordered_map<std::string, std::function<CONT_TYPE>>& container,
63 const std::string& type_of_cb);
64
65 void register_on_exit_cb(const std::string& name, const std::function<void()>& cb);
66
67 void deregister_on_exit_cb(const std::string& name);
68
69 void add_to_block_set(int signum);
70
71 void reset_block_set();
72
73 void block_signal_set();
74
80
88
89 void register_handler(const std::string& name, const std::function<void(int)>& handler);
90
91 void deregister_handler(const std::string& name);
92
93 int get_write_sock_end();
94
95 void set_sig_num(int val);
96
97 void mark_error_signal(int signum, std::string error_msg);
98
100
101 void end_of_simulation();
102
103private:
104 void _start_pass_signal_handler();
105
106 void update();
107
108 SigHandler();
109
110 SigHandler(const SigHandler&) = delete;
111 SigHandler& operator()(const SigHandler&) = delete;
112
113 void _update_sig_cb(int signum, Handler_CB s_cb);
114
115 void _update_all_sigs_cb();
116
117 void _change_sig_cbs_to_dfl();
118
119private:
120 std::map<int, Handler_CB> m_signals;
121 std::map<int, std::string> error_signals;
122 sigset_t m_sigs_to_block;
123 struct pollfd self_pipe_monitor;
124 std::thread pass_handler;
125 std::unordered_map<std::string, std::function<void(int)>> handlers;
126 std::unordered_map<std::string, std::function<void()>> exit_handlers;
127 std::atomic_bool is_pass_handler_requested;
128 std::atomic_bool stop_running;
129 std::atomic_int32_t sig_num;
130 int self_sockpair_fd[2];
131 struct sigaction exit_act;
132 struct sigaction pass_act;
133 struct sigaction force_exit_act;
134 struct sigaction ign_act;
135 struct sigaction dfl_act;
136 std::mutex cb_mutex;
137 std::mutex thread_start_mutex;
138 std::mutex signals_mutex;
139};
140
142{
143public:
145
147
148 void wait_child(pid_t cpid);
149
150 void recv_sockpair_fds_from_remote(int fd0, int fd1);
151
152 int get_sockpair_fd0() const;
153
154 int get_sockpair_fd1() const;
155
156 pid_t get_ppid() const;
157
158 void init_peer_conn_checker();
159
160 void setup_parent_conn_checker();
161
165 void check_parent_conn_sth(std::function<void()> on_parent_exit);
166
170 void check_parent_conn_nth(std::function<void()> on_parent_exit);
171
172private:
173 void _set_ppid();
174
175private:
176 std::atomic_bool stop_running;
177 pid_t m_ppid;
178 std::thread child_waiter;
179 std::thread parent_alive_checker;
180 int m_sock_pair_fds[2];
181 bool m_is_ppid_set;
182 bool m_is_parent_setup_called;
183};
184
185} // namespace gs
186
187#endif // WIN32
188
189#endif // _GREENSOCS_BASE_COMPONENTS_UUTILS
Definition target.h:160
Definition uutils.h:142
void check_parent_conn_nth(std::function< void()> on_parent_exit)
Definition uutils.cc:376
void check_parent_conn_sth(std::function< void()> on_parent_exit)
Definition uutils.cc:351
Definition uutils.h:39
void set_nosig_chld_stop()
Definition uutils.cc:87
void block_curr_handled_signals()
Definition uutils.cc:89
Tool which reads a Lua configuration file and sets parameters.
Definition biflow.cc:10