| # Zircon Signals |
| |
| ## Introduction |
| |
| A signal is a single bit of information that waitable zircon kernel objects expose to |
| applications. Each object can expose one or more signals, most of which are specific |
| to the type of object. |
| |
| For example, the signal **ZX_CHANNEL_READABLE** indicates "this channel endpoint has |
| messages to read", and **ZX_PROCESS_TERMINATED** indicates "this process stopped running." |
| |
| The signals for an object are stored in a `uint32` bitmask, and their values (which are |
| object-specific) are defined in the header[`zircon/types.h`](/zircon/system/public/zircon/types.h). |
| The typedef `zx_signals_t` is used to refer to signal bitmasks in syscalls and other APIs. |
| |
| Most objects are waitable. Ports are an example of a non-waitable object. |
| |
| ## State, State Changes and their Terminology |
| |
| A signal is said to be **Active** when its bit is 1 and **Inactive** when its bit is 0. |
| |
| A signal is said to be **Asserted** when it is made **Active** in response to an event |
| (even if it was already **Active**), and is said to be **Deasserted** when it is made |
| **Inactive** in response to an event (even if it was already **Inactive**). |
| |
| For example: When a message is written into a Channel endpoint, the **ZX_CHANNEL_READABLE** |
| signal of the opposing endpoint is **asserted** (which causes that signal to become **active**, |
| if it were not already active). When the last message in a Channel endpoint's |
| queue is read from that endpoint, the **ZX_CHANNEL_READABLE** signal of that endpoint is |
| **deasserted** (which causes that signal to become **inactive**) |
| |
| ## Observing Signals |
| |
| The syscalls [`zx_object_wait_one()`], [`zx_object_wait_many()`], and |
| [`zx_object_wait_async()`], in combination with a Port, can be used to wait for |
| specified signals on one or more objects. |
| |
| If multiple threads are operating on an object, the results of these syscalls |
| may already be out of date by the time the calling thread actually acts on them. |
| For example, a thread waiting on a Channel for the **ZX_CHANNEL_READABLE** |
| signal may wake from a [`zx_object_wait_one()`] syscall only to find that there |
| are no pending messages, because another thread has already read it. |
| |
| ## Synthetic Signals |
| |
| The signal `ZX_SIGNAL_HANDLE_CLOSED` is a synthetic signal only exists in the |
| results of [`zx_object_wait_one()`] or [`zx_object_wait_many()`] and indicates |
| that a handle that was being waited upon has been been closed causing the wait |
| operation to be aborted. |
| |
| This signal can only be obtained as a result of the above two wait calls when the wait itself |
| returns with **ZX_ERR_CANCELED**. |
| |
| ## User Signals |
| |
| There are eight User Signals (**ZX_USER_SIGNAL_0** through **ZX_USER_SIGNAL_7**) which may |
| asserted or deasserted using the [`zx_object_signal()`] and [`zx_object_signal_peer()`] syscalls, |
| provided the handle has the appropriate rights (**ZX_RIGHT_SIGNAL** or **ZX_RIGHT_SIGNAL_PEER**, |
| respectively). These User Signals are always initially inactive, and are only modified by |
| the object signal syscalls. |
| |
| ## See Also |
| |
| - [`zx_object_signal()`] |
| - [`zx_object_signal_peer()`] |
| - [`zx_object_wait_async()`] |
| - [`zx_object_wait_many()`] |
| - [`zx_object_wait_one()`] |
| |
| |
| |
| [`zx_object_get_info()`]: /docs/reference/syscalls/object_get_info.md |
| [`zx_object_signal()`]: /docs/reference/syscalls/object_signal.md |
| [`zx_object_signal_peer()`]: /docs/reference/syscalls/object_signal.md |
| [`zx_object_wait_async()`]: /docs/reference/syscalls/object_wait_async.md |
| [`zx_object_wait_many()`]: /docs/reference/syscalls/object_wait_many.md |
| [`zx_object_wait_one()`]: /docs/reference/syscalls/object_wait_one.md |