xref: /netbsd/external/mit/libuv/dist/src/unix/signal.c (revision b29f2fbf)
1 /* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
2  * Permission is hereby granted, free of charge, to any person obtaining a copy
3  * of this software and associated documentation files (the "Software"), to
4  * deal in the Software without restriction, including without limitation the
5  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
6  * sell copies of the Software, and to permit persons to whom the Software is
7  * furnished to do so, subject to the following conditions:
8  *
9  * The above copyright notice and this permission notice shall be included in
10  * all copies or substantial portions of the Software.
11  *
12  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
15  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
17  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
18  * IN THE SOFTWARE.
19  */
20 
21 #include "uv.h"
22 #include "internal.h"
23 
24 #include <assert.h>
25 #include <errno.h>
26 #include <signal.h>
27 #include <stdlib.h>
28 #include <string.h>
29 #include <unistd.h>
30 
31 #ifndef SA_RESTART
32 # define SA_RESTART 0
33 #endif
34 
35 typedef struct {
36   uv_signal_t* handle;
37   int signum;
38 } uv__signal_msg_t;
39 
40 RB_HEAD(uv__signal_tree_s, uv_signal_s);
41 
42 
43 static int uv__signal_unlock(void);
44 static int uv__signal_start(uv_signal_t* handle,
45                             uv_signal_cb signal_cb,
46                             int signum,
47                             int oneshot);
48 static void uv__signal_event(uv_loop_t* loop, uv__io_t* w, unsigned int events);
49 static int uv__signal_compare(uv_signal_t* w1, uv_signal_t* w2);
50 static void uv__signal_stop(uv_signal_t* handle);
51 static void uv__signal_unregister_handler(int signum);
52 
53 
54 static uv_once_t uv__signal_global_init_guard = UV_ONCE_INIT;
55 static struct uv__signal_tree_s uv__signal_tree =
56     RB_INITIALIZER(uv__signal_tree);
57 static int uv__signal_lock_pipefd[2] = { -1, -1 };
58 
59 RB_GENERATE_STATIC(uv__signal_tree_s,
60                    uv_signal_s, tree_entry,
61                    uv__signal_compare)
62 
63 static void uv__signal_global_reinit(void);
64 
uv__signal_global_init(void)65 static void uv__signal_global_init(void) {
66   if (uv__signal_lock_pipefd[0] == -1)
67     /* pthread_atfork can register before and after handlers, one
68      * for each child. This only registers one for the child. That
69      * state is both persistent and cumulative, so if we keep doing
70      * it the handler functions will be called multiple times. Thus
71      * we only want to do it once.
72      */
73     if (pthread_atfork(NULL, NULL, &uv__signal_global_reinit))
74       abort();
75 
76   uv__signal_global_reinit();
77 }
78 
79 
uv__signal_cleanup(void)80 void uv__signal_cleanup(void) {
81   /* We can only use signal-safe functions here.
82    * That includes read/write and close, fortunately.
83    * We do all of this directly here instead of resetting
84    * uv__signal_global_init_guard because
85    * uv__signal_global_once_init is only called from uv_loop_init
86    * and this needs to function in existing loops.
87    */
88   if (uv__signal_lock_pipefd[0] != -1) {
89     uv__close(uv__signal_lock_pipefd[0]);
90     uv__signal_lock_pipefd[0] = -1;
91   }
92 
93   if (uv__signal_lock_pipefd[1] != -1) {
94     uv__close(uv__signal_lock_pipefd[1]);
95     uv__signal_lock_pipefd[1] = -1;
96   }
97 }
98 
99 
uv__signal_global_reinit(void)100 static void uv__signal_global_reinit(void) {
101   uv__signal_cleanup();
102 
103   if (uv__make_pipe(uv__signal_lock_pipefd, 0))
104     abort();
105 
106   if (uv__signal_unlock())
107     abort();
108 }
109 
110 
uv__signal_global_once_init(void)111 void uv__signal_global_once_init(void) {
112   uv_once(&uv__signal_global_init_guard, uv__signal_global_init);
113 }
114 
115 
uv__signal_lock(void)116 static int uv__signal_lock(void) {
117   int r;
118   char data;
119 
120   do {
121     r = read(uv__signal_lock_pipefd[0], &data, sizeof data);
122   } while (r < 0 && errno == EINTR);
123 
124   return (r < 0) ? -1 : 0;
125 }
126 
127 
uv__signal_unlock(void)128 static int uv__signal_unlock(void) {
129   int r;
130   char data = 42;
131 
132   do {
133     r = write(uv__signal_lock_pipefd[1], &data, sizeof data);
134   } while (r < 0 && errno == EINTR);
135 
136   return (r < 0) ? -1 : 0;
137 }
138 
139 
uv__signal_block_and_lock(sigset_t * saved_sigmask)140 static void uv__signal_block_and_lock(sigset_t* saved_sigmask) {
141   sigset_t new_mask;
142 
143   if (sigfillset(&new_mask))
144     abort();
145 
146   /* to shut up valgrind */
147   sigemptyset(saved_sigmask);
148   if (pthread_sigmask(SIG_SETMASK, &new_mask, saved_sigmask))
149     abort();
150 
151   if (uv__signal_lock())
152     abort();
153 }
154 
155 
uv__signal_unlock_and_unblock(sigset_t * saved_sigmask)156 static void uv__signal_unlock_and_unblock(sigset_t* saved_sigmask) {
157   if (uv__signal_unlock())
158     abort();
159 
160   if (pthread_sigmask(SIG_SETMASK, saved_sigmask, NULL))
161     abort();
162 }
163 
164 
uv__signal_first_handle(int signum)165 static uv_signal_t* uv__signal_first_handle(int signum) {
166   /* This function must be called with the signal lock held. */
167   uv_signal_t lookup;
168   uv_signal_t* handle;
169 
170   lookup.signum = signum;
171   lookup.flags = 0;
172   lookup.loop = NULL;
173 
174   handle = RB_NFIND(uv__signal_tree_s, &uv__signal_tree, &lookup);
175 
176   if (handle != NULL && handle->signum == signum)
177     return handle;
178 
179   return NULL;
180 }
181 
182 
uv__signal_handler(int signum)183 static void uv__signal_handler(int signum) {
184   uv__signal_msg_t msg;
185   uv_signal_t* handle;
186   int saved_errno;
187 
188   saved_errno = errno;
189   memset(&msg, 0, sizeof msg);
190 
191   if (uv__signal_lock()) {
192     errno = saved_errno;
193     return;
194   }
195 
196   for (handle = uv__signal_first_handle(signum);
197        handle != NULL && handle->signum == signum;
198        handle = RB_NEXT(uv__signal_tree_s, &uv__signal_tree, handle)) {
199     int r;
200 
201     msg.signum = signum;
202     msg.handle = handle;
203 
204     /* write() should be atomic for small data chunks, so the entire message
205      * should be written at once. In theory the pipe could become full, in
206      * which case the user is out of luck.
207      */
208     do {
209       r = write(handle->loop->signal_pipefd[1], &msg, sizeof msg);
210     } while (r == -1 && errno == EINTR);
211 
212     assert(r == sizeof msg ||
213            (r == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)));
214 
215     if (r != -1)
216       handle->caught_signals++;
217   }
218 
219   uv__signal_unlock();
220   errno = saved_errno;
221 }
222 
223 
uv__signal_register_handler(int signum,int oneshot)224 static int uv__signal_register_handler(int signum, int oneshot) {
225   /* When this function is called, the signal lock must be held. */
226   struct sigaction sa;
227 
228   /* XXX use a separate signal stack? */
229   memset(&sa, 0, sizeof(sa));
230   if (sigfillset(&sa.sa_mask))
231     abort();
232   sa.sa_handler = uv__signal_handler;
233   sa.sa_flags = SA_RESTART;
234   if (oneshot)
235     sa.sa_flags |= SA_RESETHAND;
236 
237   /* XXX save old action so we can restore it later on? */
238   if (sigaction(signum, &sa, NULL))
239     return UV__ERR(errno);
240 
241   return 0;
242 }
243 
244 
uv__signal_unregister_handler(int signum)245 static void uv__signal_unregister_handler(int signum) {
246   /* When this function is called, the signal lock must be held. */
247   struct sigaction sa;
248 
249   memset(&sa, 0, sizeof(sa));
250   sa.sa_handler = SIG_DFL;
251 
252   /* sigaction can only fail with EINVAL or EFAULT; an attempt to deregister a
253    * signal implies that it was successfully registered earlier, so EINVAL
254    * should never happen.
255    */
256   if (sigaction(signum, &sa, NULL))
257     abort();
258 }
259 
260 
uv__signal_loop_once_init(uv_loop_t * loop)261 static int uv__signal_loop_once_init(uv_loop_t* loop) {
262   int err;
263 
264   /* Return if already initialized. */
265   if (loop->signal_pipefd[0] != -1)
266     return 0;
267 
268   err = uv__make_pipe(loop->signal_pipefd, UV_NONBLOCK_PIPE);
269   if (err)
270     return err;
271 
272   uv__io_init(&loop->signal_io_watcher,
273               uv__signal_event,
274               loop->signal_pipefd[0]);
275   uv__io_start(loop, &loop->signal_io_watcher, POLLIN);
276 
277   return 0;
278 }
279 
280 
uv__signal_loop_fork(uv_loop_t * loop)281 int uv__signal_loop_fork(uv_loop_t* loop) {
282   uv__io_stop(loop, &loop->signal_io_watcher, POLLIN);
283   uv__close(loop->signal_pipefd[0]);
284   uv__close(loop->signal_pipefd[1]);
285   loop->signal_pipefd[0] = -1;
286   loop->signal_pipefd[1] = -1;
287   return uv__signal_loop_once_init(loop);
288 }
289 
290 
uv__signal_loop_cleanup(uv_loop_t * loop)291 void uv__signal_loop_cleanup(uv_loop_t* loop) {
292   QUEUE* q;
293 
294   /* Stop all the signal watchers that are still attached to this loop. This
295    * ensures that the (shared) signal tree doesn't contain any invalid entries
296    * entries, and that signal handlers are removed when appropriate.
297    * It's safe to use QUEUE_FOREACH here because the handles and the handle
298    * queue are not modified by uv__signal_stop().
299    */
300   QUEUE_FOREACH(q, &loop->handle_queue) {
301     uv_handle_t* handle = QUEUE_DATA(q, uv_handle_t, handle_queue);
302 
303     if (handle->type == UV_SIGNAL)
304       uv__signal_stop((uv_signal_t*) handle);
305   }
306 
307   if (loop->signal_pipefd[0] != -1) {
308     uv__close(loop->signal_pipefd[0]);
309     loop->signal_pipefd[0] = -1;
310   }
311 
312   if (loop->signal_pipefd[1] != -1) {
313     uv__close(loop->signal_pipefd[1]);
314     loop->signal_pipefd[1] = -1;
315   }
316 }
317 
318 
uv_signal_init(uv_loop_t * loop,uv_signal_t * handle)319 int uv_signal_init(uv_loop_t* loop, uv_signal_t* handle) {
320   int err;
321 
322   err = uv__signal_loop_once_init(loop);
323   if (err)
324     return err;
325 
326   uv__handle_init(loop, (uv_handle_t*) handle, UV_SIGNAL);
327   handle->signum = 0;
328   handle->caught_signals = 0;
329   handle->dispatched_signals = 0;
330 
331   return 0;
332 }
333 
334 
uv__signal_close(uv_signal_t * handle)335 void uv__signal_close(uv_signal_t* handle) {
336   uv__signal_stop(handle);
337 }
338 
339 
uv_signal_start(uv_signal_t * handle,uv_signal_cb signal_cb,int signum)340 int uv_signal_start(uv_signal_t* handle, uv_signal_cb signal_cb, int signum) {
341   return uv__signal_start(handle, signal_cb, signum, 0);
342 }
343 
344 
uv_signal_start_oneshot(uv_signal_t * handle,uv_signal_cb signal_cb,int signum)345 int uv_signal_start_oneshot(uv_signal_t* handle,
346                             uv_signal_cb signal_cb,
347                             int signum) {
348   return uv__signal_start(handle, signal_cb, signum, 1);
349 }
350 
351 
uv__signal_start(uv_signal_t * handle,uv_signal_cb signal_cb,int signum,int oneshot)352 static int uv__signal_start(uv_signal_t* handle,
353                             uv_signal_cb signal_cb,
354                             int signum,
355                             int oneshot) {
356   sigset_t saved_sigmask;
357   int err;
358   uv_signal_t* first_handle;
359 
360   assert(!uv__is_closing(handle));
361 
362   /* If the user supplies signum == 0, then return an error already. If the
363    * signum is otherwise invalid then uv__signal_register will find out
364    * eventually.
365    */
366   if (signum == 0)
367     return UV_EINVAL;
368 
369   /* Short circuit: if the signal watcher is already watching {signum} don't
370    * go through the process of deregistering and registering the handler.
371    * Additionally, this avoids pending signals getting lost in the small
372    * time frame that handle->signum == 0.
373    */
374   if (signum == handle->signum) {
375     handle->signal_cb = signal_cb;
376     return 0;
377   }
378 
379   /* If the signal handler was already active, stop it first. */
380   if (handle->signum != 0) {
381     uv__signal_stop(handle);
382   }
383 
384   uv__signal_block_and_lock(&saved_sigmask);
385 
386   /* If at this point there are no active signal watchers for this signum (in
387    * any of the loops), it's time to try and register a handler for it here.
388    * Also in case there's only one-shot handlers and a regular handler comes in.
389    */
390   first_handle = uv__signal_first_handle(signum);
391   if (first_handle == NULL ||
392       (!oneshot && (first_handle->flags & UV_SIGNAL_ONE_SHOT))) {
393     err = uv__signal_register_handler(signum, oneshot);
394     if (err) {
395       /* Registering the signal handler failed. Must be an invalid signal. */
396       uv__signal_unlock_and_unblock(&saved_sigmask);
397       return err;
398     }
399   }
400 
401   handle->signum = signum;
402   if (oneshot)
403     handle->flags |= UV_SIGNAL_ONE_SHOT;
404 
405   RB_INSERT(uv__signal_tree_s, &uv__signal_tree, handle);
406 
407   uv__signal_unlock_and_unblock(&saved_sigmask);
408 
409   handle->signal_cb = signal_cb;
410   uv__handle_start(handle);
411 
412   return 0;
413 }
414 
415 
uv__signal_event(uv_loop_t * loop,uv__io_t * w,unsigned int events)416 static void uv__signal_event(uv_loop_t* loop,
417                              uv__io_t* w,
418                              unsigned int events) {
419   uv__signal_msg_t* msg;
420   uv_signal_t* handle;
421   char buf[sizeof(uv__signal_msg_t) * 32];
422   size_t bytes, end, i;
423   int r;
424 
425   bytes = 0;
426   end = 0;
427 
428   do {
429     r = read(loop->signal_pipefd[0], buf + bytes, sizeof(buf) - bytes);
430 
431     if (r == -1 && errno == EINTR)
432       continue;
433 
434     if (r == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) {
435       /* If there are bytes in the buffer already (which really is extremely
436        * unlikely if possible at all) we can't exit the function here. We'll
437        * spin until more bytes are read instead.
438        */
439       if (bytes > 0)
440         continue;
441 
442       /* Otherwise, there was nothing there. */
443       return;
444     }
445 
446     /* Other errors really should never happen. */
447     if (r == -1)
448       abort();
449 
450     bytes += r;
451 
452     /* `end` is rounded down to a multiple of sizeof(uv__signal_msg_t). */
453     end = (bytes / sizeof(uv__signal_msg_t)) * sizeof(uv__signal_msg_t);
454 
455     for (i = 0; i < end; i += sizeof(uv__signal_msg_t)) {
456       msg = (uv__signal_msg_t*) (buf + i);
457       handle = msg->handle;
458 
459       if (msg->signum == handle->signum) {
460         assert(!(handle->flags & UV_HANDLE_CLOSING));
461         handle->signal_cb(handle, handle->signum);
462       }
463 
464       handle->dispatched_signals++;
465 
466       if (handle->flags & UV_SIGNAL_ONE_SHOT)
467         uv__signal_stop(handle);
468     }
469 
470     bytes -= end;
471 
472     /* If there are any "partial" messages left, move them to the start of the
473      * the buffer, and spin. This should not happen.
474      */
475     if (bytes) {
476       memmove(buf, buf + end, bytes);
477       continue;
478     }
479   } while (end == sizeof buf);
480 }
481 
482 
uv__signal_compare(uv_signal_t * w1,uv_signal_t * w2)483 static int uv__signal_compare(uv_signal_t* w1, uv_signal_t* w2) {
484   int f1;
485   int f2;
486   /* Compare signums first so all watchers with the same signnum end up
487    * adjacent.
488    */
489   if (w1->signum < w2->signum) return -1;
490   if (w1->signum > w2->signum) return 1;
491 
492   /* Handlers without UV_SIGNAL_ONE_SHOT set will come first, so if the first
493    * handler returned is a one-shot handler, the rest will be too.
494    */
495   f1 = w1->flags & UV_SIGNAL_ONE_SHOT;
496   f2 = w2->flags & UV_SIGNAL_ONE_SHOT;
497   if (f1 < f2) return -1;
498   if (f1 > f2) return 1;
499 
500   /* Sort by loop pointer, so we can easily look up the first item after
501    * { .signum = x, .loop = NULL }.
502    */
503   if (w1->loop < w2->loop) return -1;
504   if (w1->loop > w2->loop) return 1;
505 
506   if (w1 < w2) return -1;
507   if (w1 > w2) return 1;
508 
509   return 0;
510 }
511 
512 
uv_signal_stop(uv_signal_t * handle)513 int uv_signal_stop(uv_signal_t* handle) {
514   assert(!uv__is_closing(handle));
515   uv__signal_stop(handle);
516   return 0;
517 }
518 
519 
uv__signal_stop(uv_signal_t * handle)520 static void uv__signal_stop(uv_signal_t* handle) {
521   uv_signal_t* removed_handle;
522   sigset_t saved_sigmask;
523   uv_signal_t* first_handle;
524   int rem_oneshot;
525   int first_oneshot;
526   int ret;
527 
528   /* If the watcher wasn't started, this is a no-op. */
529   if (handle->signum == 0)
530     return;
531 
532   uv__signal_block_and_lock(&saved_sigmask);
533 
534   removed_handle = RB_REMOVE(uv__signal_tree_s, &uv__signal_tree, handle);
535   assert(removed_handle == handle);
536   (void) removed_handle;
537 
538   /* Check if there are other active signal watchers observing this signal. If
539    * not, unregister the signal handler.
540    */
541   first_handle = uv__signal_first_handle(handle->signum);
542   if (first_handle == NULL) {
543     uv__signal_unregister_handler(handle->signum);
544   } else {
545     rem_oneshot = handle->flags & UV_SIGNAL_ONE_SHOT;
546     first_oneshot = first_handle->flags & UV_SIGNAL_ONE_SHOT;
547     if (first_oneshot && !rem_oneshot) {
548       ret = uv__signal_register_handler(handle->signum, 1);
549       assert(ret == 0);
550       (void)ret;
551     }
552   }
553 
554   uv__signal_unlock_and_unblock(&saved_sigmask);
555 
556   handle->signum = 0;
557   uv__handle_stop(handle);
558 }
559