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#include <cassert>
11#include <iostream>
12#include <thread>
13#include <map>
14#include <utility>
15#include <functional>
16#include <vector>
17#include <atomic>
18#include <systemc>
19#include <unordered_map>
20#include <scp/report.h>
21#include <mutex>
22#include <cstdlib>
23#include <csignal>
24
25#ifndef _WIN32
26#include <fcntl.h>
27#include <sys/mman.h>
28#include <sys/stat.h>
29#include <signal.h>
30#include <sys/types.h>
31#include <sys/socket.h>
32#include <unistd.h>
33#include <poll.h>
34#include <sys/wait.h>
35#else
36#include <windows.h>
37#endif
38
39namespace gs {
40
41enum class Handler_CB {
42 EXIT, // run signal_handler then exit
43 PASS, // run signal_handler
44 FORCE_EXIT, // just exit
45 IGN, // ignore
46 DFL, // default
47};
48
49class SigHandler : public sc_core::sc_prim_channel
50{
51public:
52 static SigHandler& get();
53
58 void add_sigint_handler(Handler_CB s_cb);
59
60 template <typename CONT_TYPE>
61 void register_cb(const std::string& name, std::unordered_map<std::string, std::function<CONT_TYPE>>& container,
62 const std::function<CONT_TYPE>& cb, const std::string& type_of_cb);
63
64 template <typename CONT_TYPE>
65 void deregister_cb(const std::string& name, std::unordered_map<std::string, std::function<CONT_TYPE>>& container,
66 const std::string& type_of_cb);
67
68 void register_on_exit_cb(const std::string& name, const std::function<void()>& cb);
69
70 void deregister_on_exit_cb(const std::string& name);
71
72 void register_handler(const std::string& name, const std::function<void(int)>& handler);
73
74 void deregister_handler(const std::string& name);
75
77
78 void end_of_simulation();
79
80 void set_sig_num(int val);
81
82#ifdef _WIN32
83 void console_signal_dispatch(int sig_num);
86#else
87 static void pass_sig_handler(int sig);
88
89 static void force_exit_sig_handler(int sig);
90
91 void add_to_block_set(int signum);
92
93 void reset_block_set();
94
95 void block_signal_set();
96
101 void add_sigchld_handler(Handler_CB s_cb);
102
107 void set_nosig_chld_stop();
108
116
117 int get_write_sock_end();
118
119 void mark_error_signal(int signum, std::string error_msg);
120
121#endif // _WIN32
122private:
123 void update();
124
125 SigHandler();
126
127 SigHandler(const SigHandler&) = delete;
128 SigHandler& operator()(const SigHandler&) = delete;
129
130 void _start_pass_signal_handler();
131 void _update_sig_cb(int signum, Handler_CB s_cb);
132
133 void _update_all_sigs_cb();
134
135 void _change_sig_cbs_to_dfl();
136
137 void add_sig_handler(int signum, Handler_CB s_cb);
138
139private:
140 std::map<int, Handler_CB> m_signals;
141 std::map<int, std::string> error_signals;
142 std::unordered_map<std::string, std::function<void(int)>> handlers;
143 std::unordered_map<std::string, std::function<void()>> exit_handlers;
144 std::mutex cb_mutex;
145 std::mutex thread_start_mutex;
146 std::mutex signals_mutex;
147 std::thread pass_handler;
148 std::atomic_bool stop_running;
149 std::atomic_bool is_pass_handler_requested;
150 std::atomic_int32_t sig_num;
151
152#ifdef _WIN32
154#else
155 sigset_t m_sigs_to_block;
156 struct pollfd self_pipe_monitor;
157
158 int self_sockpair_fd[2];
159 struct sigaction exit_act;
160 struct sigaction pass_act;
161 struct sigaction force_exit_act;
162 struct sigaction ign_act;
163 struct sigaction dfl_act;
164#endif // _WIN32
165};
166
167#ifndef _WIN32
169{
170public:
172
174
175 void wait_child(pid_t cpid);
176
177 void recv_sockpair_fds_from_remote(int fd0, int fd1);
178
179 int get_sockpair_fd0() const;
180
181 int get_sockpair_fd1() const;
182
183 pid_t get_ppid() const;
184
185 void setup_parent_conn_checker();
186
190 void check_parent_conn_sth(std::function<void()> on_parent_exit);
191
195 void check_parent_conn_nth(std::function<void()> on_parent_exit);
196
197private:
198 void _set_ppid();
199 void init_peer_conn_checker();
200
201private:
202 std::atomic_bool stop_running;
203 pid_t m_ppid = -1;
204 std::thread child_waiter;
205 std::thread parent_alive_checker;
206 int m_sock_pair_fds[2];
207};
208#endif //
209} // namespace gs
210
211#endif // _GREENSOCS_BASE_COMPONENTS_UUTILS
Definition target.h:160
Definition uutils.h:169
void check_parent_conn_nth(std::function< void()> on_parent_exit)
Definition uutils.cc:486
void check_parent_conn_sth(std::function< void()> on_parent_exit)
Definition uutils.cc:461
Definition uutils.h:50
void set_nosig_chld_stop()
Definition uutils.cc:225
void block_curr_handled_signals()
Definition uutils.cc:227
void add_sigint_handler(Handler_CB s_cb)
Add a SIGINT handler with the specified callback type.
Definition uutils.cc:92
void add_sigchld_handler(Handler_CB s_cb)
Add a SIGCHLD handler with the specified callback type.
Definition uutils.cc:398
Tool which reads a Lua configuration file and sets parameters.
Definition biflow.cc:10