| @@ -118,19 +118,20 @@ impl::child_timer::child_timer(const uns | | | @@ -118,19 +118,20 @@ impl::child_timer::child_timer(const uns |
118 | timer(seconds), | | 118 | timer(seconds), |
119 | m_pid(pid), | | 119 | m_pid(pid), |
120 | m_terminate(terminate) | | 120 | m_terminate(terminate) |
121 | { | | 121 | { |
122 | } | | 122 | } |
123 | | | 123 | |
124 | impl::child_timer::~child_timer(void) | | 124 | impl::child_timer::~child_timer(void) |
125 | { | | 125 | { |
126 | } | | 126 | } |
127 | | | 127 | |
128 | void | | 128 | void |
129 | impl::child_timer::timeout_callback(void) | | 129 | impl::child_timer::timeout_callback(void) |
130 | { | | 130 | { |
| | | 131 | static const timespec ts = { 1, 0 }; |
131 | m_terminate = true; | | 132 | m_terminate = true; |
132 | | | 133 | ::kill(-m_pid, SIGTERM); |
133 | // Should use killpg(2) but, according to signal(7), using this system | | 134 | ::nanosleep(&ts, NULL); |
134 | // call in a signal handler context is not safe. | | 135 | if (::kill(-m_pid, 0) != -1) |
135 | ::killpg(-m_pid, SIGKILL); | | 136 | ::kill(-m_pid, SIGKILL); |
136 | } | | 137 | } |