X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fsignals.c;h=152afcf6cb8669e55840db487d9a9f4502bae6fc;hb=bc7a5acdff087b7e7a162da42ae608a83f3cf902;hp=37f063732660f187f1d835101b53f2957a07b59f;hpb=279c9e030818e039bb1c26be76e2cc1e8f6b13a6;p=openvswitch diff --git a/lib/signals.c b/lib/signals.c index 37f06373..152afcf6 100644 --- a/lib/signals.c +++ b/lib/signals.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2011 Nicira Networks. + * Copyright (c) 2008, 2009, 2011, 2012 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ #include #include #include +#include #include #include "poll-loop.h" #include "socket-util.h" @@ -40,6 +41,7 @@ VLOG_DEFINE_THIS_MODULE(signals); #endif struct signal { + struct sigaction saved_sa; int signr; }; @@ -61,9 +63,7 @@ signal_init(void) static bool inited; if (!inited) { inited = true; - xpipe(fds); - set_nonblocking(fds[0]); - set_nonblocking(fds[1]); + xpipe_nonblocking(fds); } } @@ -78,20 +78,31 @@ signal_register(int signr) signal_init(); + s = xmalloc(sizeof *s); + s->signr = signr; + /* Set up signal handler. */ assert(signr >= 1 && signr < N_SIGNALS); memset(&sa, 0, sizeof sa); sa.sa_handler = signal_handler; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; - xsigaction(signr, &sa, NULL); + xsigaction(signr, &sa, &s->saved_sa); - /* Return structure. */ - s = xmalloc(sizeof *s); - s->signr = signr; return s; } +/* Unregisters the handler for 's', restores the signal handler that was in + * effect before signal_register() was called, and frees 's'. */ +void +signal_unregister(struct signal *s) +{ + if (s) { + xsigaction(s->signr, &s->saved_sa, NULL); + free(s); + } +} + /* Returns true if signal 's' has been received since the last call to this * function with argument 's'. */ bool