SignalHandler.cpp
Go to the documentation of this file.
2 
3 namespace signal_handler
4 {
5 /*****************************************************************************/
6 /* Static Member Initialization */
7 /*****************************************************************************/
8 
9 std::map<int, std::list<SignalHandler::Handler> > SignalHandler::handlers_;
10 std::mutex SignalHandler::mutex_;
11 
12 /*****************************************************************************/
13 /* Methods */
14 /*****************************************************************************/
15 
16 void SignalHandler::bind(int signal_, const Handler& handler)
17 {
18  std::lock_guard<std::mutex> lock(mutex_);
19 
20  auto it = handlers_.find(signal_);
21  if (it == handlers_.end())
22  {
23  it = handlers_.emplace(std::make_pair(signal_, std::list<Handler>())).first;
24  signal(signal_, &SignalHandler::signaled);
25  }
26 
27  for (auto& jt : it->second)
28  {
29  if (jt.target_type().name() == handler.target_type().name())
30  {
31  return;
32  }
33  }
34 
35  it->second.push_back(handler);
36 }
37 
38 void SignalHandler::unbind(int signal_, const Handler& handler)
39 {
40  std::lock_guard<std::mutex> lock(mutex_);
41  auto it = handlers_.find(signal_);
42 
43  if (it == handlers_.end())
44  {
45  return;
46  }
47 
48  for (auto jt = it->second.begin(); jt != it->second.end(); ++jt)
49  {
50  if (jt->target_type().name() == handler.target_type().name())
51  { // jt->target
52  it->second.erase(jt);
53 
54  if (it->second.empty())
55  {
56  handlers_.erase(it);
57  signal(signal_, SIG_DFL);
58  }
59 
60  return;
61  }
62  }
63 }
64 
65 void SignalHandler::signaled(int signal)
66 {
67  std::lock_guard<std::mutex> lock(mutex_);
68  auto it = handlers_.find(signal);
69 
70  if (it == handlers_.end())
71  {
72  return;
73  }
74 
75  for (auto& jt : it->second)
76  {
77  jt(signal);
78  }
79 }
80 
81 } // namespace signal_handler
static void unbind(int signal, void(T::*fp)(int), T *object)
static std::map< int, std::list< Handler > > handlers_
static void bind(int signal, void(T::*fp)(int), T *object)
static void signaled(int signal)
std::function< void(int)> Handler


bota_signal_handler
Author(s):
autogenerated on Wed Mar 3 2021 03:09:09