| # Copyright 2016 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import contextlib |
| import signal |
| |
| |
| @contextlib.contextmanager |
| def SignalHandler(signalnum, handler): |
| """Sets the signal handler for the given signal in the wrapped context. |
| |
| Args: |
| signum: The signal for which a handler should be added. |
| additional_handler: The handler to add. |
| """ |
| existing_handler = signal.getsignal(signalnum) |
| |
| try: |
| signal.signal(signalnum, handler) |
| yield |
| finally: |
| signal.signal(signalnum, existing_handler) |
| |
| |
| @contextlib.contextmanager |
| def AddSignalHandler(signalnum, additional_handler): |
| """Adds a signal handler for the given signal in the wrapped context. |
| |
| This runs the new handler after any existing handler rather than |
| replacing the existing handler. |
| |
| Args: |
| signum: The signal for which a handler should be added. |
| additional_handler: The handler to add. |
| """ |
| existing_handler = signal.getsignal(signalnum) |
| |
| def handler(signum, frame): |
| if callable(existing_handler): |
| existing_handler(signum, frame) |
| additional_handler(signum, frame) |
| |
| try: |
| signal.signal(signalnum, handler) |
| yield |
| finally: |
| signal.signal(signalnum, existing_handler) |