OLD | NEW |
(Empty) | |
| 1 Async signals support in Non-SFI mode |
| 2 ===================================== |
| 3 |
| 4 Issue: https://code.google.com/p/nativeclient/issues/detail?id=4065 |
| 5 |
| 6 This provides a way to asynchronously interrupt another thread in the same |
| 7 process, in a similar fashion to POSIX signals. Signal support is limited to |
| 8 Non-SFI mode (see nacl_irt_async_signal_handling in src/untrusted/irt/irt.h). |
| 9 |
| 10 Async signals have several differences from POSIX signals: |
| 11 |
| 12 * Synchronous signals (from hardware exceptions) are separate and their behavior |
| 13 is not changed. Furthermore, synchronous signals cannot be handled with this |
| 14 interface. |
| 15 * There is a single type of signal, and only a single, global async signal |
| 16 handler is supported. This means that there is no support for POSIX signal |
| 17 numbers. |
| 18 * There is no way to block signals, not even when the signal handler is running. |
| 19 * There is no equivalent to sigaltstack(), so the signal handler always runs on |
| 20 the same stack as the thread. |
| 21 * We don't provide libc wrapper functions for this interface in libnacl at the |
| 22 moment. If full POSIX support is needed, it can be implemented in user code, |
| 23 on top of the IRT interfaces provided. |
| 24 * NaCl signals are not intended to abort any in-process operations (such as |
| 25 syscalls, IRT calls or PPAPI calls) and they will restart once the signal |
| 26 handler returns. There are two exceptions that will be interrupted and do |
| 27 fail with EINTR: |
| 28 * futex_wait_abs() with a non-NULL timeout |
| 29 * nanosleep() |
| 30 |
| 31 Similar to POSIX signals, NaCl signals are delivered the next time the thread is |
| 32 scheduled to run but before giving the process control of execution. This also |
| 33 means that if several signals are sent to a thread before it is scheduled to |
| 34 run, a single async signal will be delivered, and the signal handler will be run |
| 35 just once. That also means that the signal handler can run at any point during |
| 36 the program execution, so the signal handler must be written with care to avoid |
| 37 doing unsafe operations, such as acquiring mutexes that may be held by the |
| 38 interrupted thread. Invoking any unsafe operation from within a signal handler |
| 39 is undefined. NaCl only guarantees that the following IRT interfaces are |
| 40 async-signal-safe and can be called from within the signal handler: |
| 41 |
| 42 * tls_get() |
| 43 * futex_wait_abs() |
| 44 * futex_wake() |
| 45 * send_async_signal() |
| 46 |
| 47 In order to deliver signals to the correct thread, a new version of the |
| 48 nacl_irt_thread IRT functions has been introduced which will assign an opaque |
| 49 thread identifier to each new thread and will populate it into the |child_tid| |
| 50 parameter. Since the initial thread is not created using nacl_irt_thread, the |
| 51 constant NACL_IRT_MAIN_THREAD_TID can be used to refer to it. This thread |
| 52 identifier can be used as a parameter to send_async_signal(). Providing a |
| 53 thread identifier that is not NACL_IRT_MAIN_THREAD_TID, was not obtained from |
| 54 thread_create, or belonged to a thread that has already terminated will produce |
| 55 undefined behavior. |
OLD | NEW |