Manpages - sd_event_wait.3

Table of Contents

NAME

sd_event_wait, sd_event_prepare, sd_event_dispatch, sd_event_get_state, sd_event_get_iteration, SD_EVENT_INITIAL, SD_EVENT_PREPARING, SD_EVENT_ARMED, SD_EVENT_PENDING, SD_EVENT_RUNNING, SD_EVENT_EXITING, SD_EVENT_FINISHED - Low-level event loop operations

SYNOPSIS

  #include <systemd/sd-event.h>
  enum {
          SD_EVENT_INITIAL,
          SD_EVENT_PREPARING,
          SD_EVENT_ARMED,
          SD_EVENT_PENDING,
          SD_EVENT_RUNNING,
          SD_EVENT_EXITING,
          SD_EVENT_FINISHED,
  };

int sd_event_prepare(sd_event **/event/);*

int sd_event_wait(sd_event **/event/, uint64_t usec);*

int sd_event_dispatch(sd_event **/event/);*

int sd_event_get_state(sd_event **/event/);*

int sd_event_get_iteration(sd_event **/event/, uint64_t */ret/);*

DESCRIPTION

The low-level sd_event_prepare(), sd_event_wait() and sd_event_dispatch() functions may be used to execute specific phases of an event loop. See *sd_event_run*(3) and *sd_event_loop*(3) for higher-level functions that execute individual but complete iterations of an event loop or run it continuously.

sd_event_prepare() checks for pending events and arms necessary timers. If any events are ready to be processed (“pending”), it returns a positive, non-zero value, and the caller should process these events with sd_event_dispatch().

sd_event_dispatch() dispatches the highest priority event source that has a pending event. On success, sd_event_dispatch() returns either zero, which indicates that no further event sources may be dispatched and exiting of the event loop was requested via sd_event_exit*(3); or a positive non-zero value, which means that an event source was dispatched and the loop returned to its initial state, and the caller should initiate the next event loop iteration by invoking *sd_event_prepare() again.

In case sd_event_prepare() returned zero, sd_event_wait() should be called to wait for further events or a timeout. If any events are ready to be processed, it returns a positive, non-zero value, and the events should be dispatched with sd_event_dispatch(). Otherwise, the event loop returned to its initial state and the next event loop iteration should be initiated by invoking sd_event_prepare() again.

sd_event_get_state() may be used to determine the state the event loop is currently in. It returns one of the states described below.

sd_event_get_iteration() may be used to determine the current iteration of the event loop. It returns an unsigned 64bit integer containing a counter that increases monotonically with each iteration of the event loop, starting with 0. The counter is increased at the time of the sd_event_prepare() invocation.

All five functions take, as the first argument, the event loop object event that has been created with sd_event_new(). The timeout for sd_event_wait() is specified in usec in microseconds. (uint64_t) -1 may be used to specify an infinite timeout.

STATE MACHINE

The event loop knows the following states, that may be queried with sd_event_get_state().

SD_EVENT_INITIAL

The initial state the event loop is in, before each event loop iteration. Use sd_event_prepare() to transition the event loop into the SD_EVENT_ARMED or SD_EVENT_PENDING states.

SD_EVENT_PREPARING

An event source is currently being prepared, i.e. the preparation handler is currently being executed, as set with sd_event_source_set_prepare*(3). This state is only seen in the event source preparation handler that is invoked from the *sd_event_prepare() call and is immediately followed by SD_EVENT_ARMED or SD_EVENT_PENDING.

SD_EVENT_ARMED

sd_event_prepare() has been called and no event sources were ready to be dispatched. Use sd_event_wait() to wait for new events, and transition into SD_EVENT_PENDING or back into SD_EVENT_INITIAL.

SD_EVENT_PENDING

sd_event_prepare() or sd_event_wait() have been called and there were event sources with events pending. Use sd_event_dispatch() to dispatch the highest priority event source and transition back to SD_EVENT_INITIAL, or SD_EVENT_FINISHED.

SD_EVENT_RUNNING

A regular event source is currently being dispatched. This state is only seen in the event source handler that is invoked from the sd_event_dispatch() call, and is immediately followed by SD_EVENT_INITIAL or SD_EVENT_FINISHED as soon the event source handler returns. Note that during dispatching of exit event sources the SD_EVENT_EXITING state is seen instead.

SD_EVENT_EXITING

Similar to SD_EVENT_RUNNING but is the state in effect while dispatching exit event sources. It is followed by SD_EVENT_INITIAL or SD_EVENT_FINISHED as soon as the event handler returns.

SD_EVENT_FINISHED

The event loop has exited. All exit event sources have run. If the event loop is in this state it serves no purpose anymore, and should be freed.

A simplified flow chart of the states and the calls to transition between them is shown below. Note that SD_EVENT_PREPARING, SD_EVENT_RUNNING and SD_EVENT_EXITING are not shown here.

              INITIAL -<---<---<---<---<---<---<---<---<---<---<---<---\
                 |                                                     |
                 |                                                     ^
                 |                                                     |
                 v                 ret == 0                            |
          sd_event_prepare() >--->--->--->--->- ARMED                  |
                 |                                |                    ^
                 | ret > 0                        |                    |
                 |                                |                    |
                 v                                v          ret == 0  |
              PENDING <---<---<---<---<---< sd_event_wait() >--->--->--+
                 |           ret > 0                                   ^
                 |                                                     |
                 |                                                     |
                 v                                                     |
          sd_event_dispatch() >--->--->--->--->--->--->--->--->--->--->/
                 |                             ret > 0
                 | ret == 0
                 |
                 v
              FINISHED
        

RETURN VALUE

On success, these functions return 0 or a positive integer. On failure, they return a negative errno-style error code. In case of sd_event_prepare() and sd_event_wait(), a positive, non-zero return code indicates that events are ready to be processed and zero indicates that no events are ready. In case of sd_event_dispatch(), a positive, non-zero return code indicates that the event loop returned to its initial state and zero indicates the event loop has exited. sd_event_get_state() returns a positive or zero state on success.

Errors

Returned errors may indicate the following problems:

-EINVAL

The event parameter is invalid or NULL.

-EBUSY

The event loop object is not in the right state.

-ESTALE

The event loop is already terminated.

-ECHILD

The event loop has been created in a different process.

Other errors are possible, too.

NOTES

These APIs are implemented as a shared library, which can be compiled and linked to with the libsystemd *pkg-config*(1) file.

SEE ALSO

*systemd*(1), *sd_event_new*(3), *sd_event_add_io*(3), *sd_event_add_time*(3), *sd_event_add_signal*(3), *sd_event_add_child*(3), *sd_event_add_inotify*(3), *sd_event_add_defer*(3), *sd_event_run*(3), *sd_event_get_fd*(3), *sd_event_source_set_prepare*(3)

Author: dt

Created: 2022-02-21 Mon 12:10