PipeWire 1.2.1
|
Event loop interface More...
Files | |
file | loop.h |
spa/support/loop.h | |
Data Structures | |
struct | spa_loop |
struct | spa_loop_control |
struct | spa_loop_utils |
struct | spa_source |
struct | spa_loop_methods |
Register sources and work items to an event loop. More... | |
struct | spa_loop_control_hooks |
Control hooks. More... | |
struct | spa_loop_control_methods |
Control an event loop. More... | |
struct | spa_loop_utils_methods |
Create sources for an event loop. More... | |
Typedefs | |
typedef void(* | spa_source_func_t) (struct spa_source *source) |
typedef int(* | spa_invoke_func_t) (struct spa_loop *loop, bool async, uint32_t seq, const void *data, size_t size, void *user_data) |
typedef void(* | spa_source_io_func_t) (void *data, int fd, uint32_t mask) |
typedef void(* | spa_source_idle_func_t) (void *data) |
typedef void(* | spa_source_event_func_t) (void *data, uint64_t count) |
typedef void(* | spa_source_timer_func_t) (void *data, uint64_t expirations) |
typedef void(* | spa_source_signal_func_t) (void *data, int signal_number) |
Macros | |
#define | SPA_TYPE_INTERFACE_Loop SPA_TYPE_INFO_INTERFACE_BASE "Loop" |
#define | SPA_TYPE_INTERFACE_DataLoop SPA_TYPE_INFO_INTERFACE_BASE "DataLoop" |
#define | SPA_VERSION_LOOP 0 |
#define | SPA_TYPE_INTERFACE_LoopControl SPA_TYPE_INFO_INTERFACE_BASE "LoopControl" |
#define | SPA_VERSION_LOOP_CONTROL 1 |
#define | SPA_TYPE_INTERFACE_LoopUtils SPA_TYPE_INFO_INTERFACE_BASE "LoopUtils" |
#define | SPA_VERSION_LOOP_UTILS 0 |
#define | SPA_VERSION_LOOP_METHODS 0 |
#define | spa_loop_method(o, method, version, ...) |
#define | spa_loop_add_source(l, ...) spa_loop_method(l,add_source,0,##__VA_ARGS__) |
Add a source to the loop. | |
#define | spa_loop_update_source(l, ...) spa_loop_method(l,update_source,0,##__VA_ARGS__) |
Update the source io mask. | |
#define | spa_loop_remove_source(l, ...) spa_loop_method(l,remove_source,0,##__VA_ARGS__) |
Remove a source from the loop. | |
#define | spa_loop_invoke(l, ...) spa_loop_method(l,invoke,0,##__VA_ARGS__) |
Invoke a function in the context of this loop. | |
#define | SPA_VERSION_LOOP_CONTROL_HOOKS 0 |
#define | spa_loop_control_hook_before(l) |
#define | spa_loop_control_hook_after(l) |
#define | SPA_VERSION_LOOP_CONTROL_METHODS 1 |
#define | spa_loop_control_method_v(o, method, version, ...) |
#define | spa_loop_control_method_r(o, method, version, ...) |
#define | spa_loop_control_method_fast_r(o, method, version, ...) |
#define | spa_loop_control_get_fd(l) spa_loop_control_method_r(l,get_fd,0) |
#define | spa_loop_control_add_hook(l, ...) spa_loop_control_method_v(l,add_hook,0,__VA_ARGS__) |
Add a hook. | |
#define | spa_loop_control_enter(l) spa_loop_control_method_v(l,enter,0) |
Enter a loop. | |
#define | spa_loop_control_leave(l) spa_loop_control_method_v(l,leave,0) |
Leave a loop. | |
#define | spa_loop_control_iterate(l, ...) spa_loop_control_method_r(l,iterate,0,__VA_ARGS__) |
Perform one iteration of the loop. | |
#define | spa_loop_control_check(l) spa_loop_control_method_r(l,check,1) |
Check context of the loop. | |
#define | spa_loop_control_iterate_fast(l, ...) spa_loop_control_method_fast_r(l,iterate,0,__VA_ARGS__) |
#define | SPA_VERSION_LOOP_UTILS_METHODS 0 |
#define | spa_loop_utils_method_v(o, method, version, ...) |
#define | spa_loop_utils_method_r(o, method, version, ...) |
#define | spa_loop_utils_method_s(o, method, version, ...) |
#define | spa_loop_utils_add_io(l, ...) spa_loop_utils_method_s(l,add_io,0,__VA_ARGS__) |
#define | spa_loop_utils_update_io(l, ...) spa_loop_utils_method_r(l,update_io,0,__VA_ARGS__) |
#define | spa_loop_utils_add_idle(l, ...) spa_loop_utils_method_s(l,add_idle,0,__VA_ARGS__) |
#define | spa_loop_utils_enable_idle(l, ...) spa_loop_utils_method_r(l,enable_idle,0,__VA_ARGS__) |
#define | spa_loop_utils_add_event(l, ...) spa_loop_utils_method_s(l,add_event,0,__VA_ARGS__) |
#define | spa_loop_utils_signal_event(l, ...) spa_loop_utils_method_r(l,signal_event,0,__VA_ARGS__) |
#define | spa_loop_utils_add_timer(l, ...) spa_loop_utils_method_s(l,add_timer,0,__VA_ARGS__) |
#define | spa_loop_utils_update_timer(l, ...) spa_loop_utils_method_r(l,update_timer,0,__VA_ARGS__) |
#define | spa_loop_utils_add_signal(l, ...) spa_loop_utils_method_s(l,add_signal,0,__VA_ARGS__) |
#define | spa_loop_utils_destroy_source(l, ...) spa_loop_utils_method_v(l,destroy_source,0,__VA_ARGS__) |
destroy a source allocated with this interface. | |
Event loop interface
typedef void(* spa_source_func_t) (struct spa_source *source) |
typedef int(* spa_invoke_func_t) (struct spa_loop *loop, bool async, uint32_t seq, const void *data, size_t size, void *user_data) |
typedef void(* spa_source_io_func_t) (void *data, int fd, uint32_t mask) |
typedef void(* spa_source_idle_func_t) (void *data) |
typedef void(* spa_source_event_func_t) (void *data, uint64_t count) |
typedef void(* spa_source_timer_func_t) (void *data, uint64_t expirations) |
typedef void(* spa_source_signal_func_t) (void *data, int signal_number) |
#define SPA_TYPE_INTERFACE_Loop SPA_TYPE_INFO_INTERFACE_BASE "Loop" |
#define SPA_TYPE_INTERFACE_DataLoop SPA_TYPE_INFO_INTERFACE_BASE "DataLoop" |
#define SPA_VERSION_LOOP 0 |
#define SPA_TYPE_INTERFACE_LoopControl SPA_TYPE_INFO_INTERFACE_BASE "LoopControl" |
#define SPA_VERSION_LOOP_CONTROL 1 |
#define SPA_TYPE_INTERFACE_LoopUtils SPA_TYPE_INFO_INTERFACE_BASE "LoopUtils" |
#define SPA_VERSION_LOOP_UTILS 0 |
#define SPA_VERSION_LOOP_METHODS 0 |
#define spa_loop_method | ( | o, | |
method, | |||
version, | |||
... ) |
#define spa_loop_add_source | ( | l, | |
... ) spa_loop_method(l,add_source,0,##__VA_ARGS__) |
Add a source to the loop.
Must be called from the loop's own thread.
[in] | object | The callbacks data. |
[in] | source | The source. |
#define spa_loop_update_source | ( | l, | |
... ) spa_loop_method(l,update_source,0,##__VA_ARGS__) |
Update the source io mask.
Must be called from the loop's own thread.
[in] | object | The callbacks data. |
[in] | source | The source. |
#define spa_loop_remove_source | ( | l, | |
... ) spa_loop_method(l,remove_source,0,##__VA_ARGS__) |
Remove a source from the loop.
Must be called from the loop's own thread.
[in] | object | The callbacks data. |
[in] | source | The source. |
#define spa_loop_invoke | ( | l, | |
... ) spa_loop_method(l,invoke,0,##__VA_ARGS__) |
Invoke a function in the context of this loop.
May be called from any thread and multiple threads at the same time. If called from the loop's thread, all callbacks previously queued with invoke() will be run synchronously, which might cause unexpected reentrancy problems.
[in] | object | The callbacks data. |
func | The function to be invoked. | |
seq | An opaque sequence number. This will be made available to func. | |
[in] | data | Data that will be copied into the internal ring buffer and made available to func. Because this data is copied, it is okay to pass a pointer to a local variable, but do not pass a pointer to an object that has identity. |
size | The size of data to copy. | |
block | If \true, do not return until func has been called. Otherwise, returns immediately. Passing \true does not risk a deadlock because the data thread is never allowed to wait on any other thread. | |
user_data | An opaque pointer passed to func. |
-EPIPE
if the internal ring buffer filled up, if block is \false, 0 if seq was SPA_ID_INVALID or seq with the ASYNC flag set or the return value of func otherwise. #define SPA_VERSION_LOOP_CONTROL_HOOKS 0 |
#define spa_loop_control_hook_before | ( | l | ) |
#define spa_loop_control_hook_after | ( | l | ) |
#define SPA_VERSION_LOOP_CONTROL_METHODS 1 |
#define spa_loop_control_method_v | ( | o, | |
method, | |||
version, | |||
... ) |
#define spa_loop_control_method_r | ( | o, | |
method, | |||
version, | |||
... ) |
#define spa_loop_control_method_fast_r | ( | o, | |
method, | |||
version, | |||
... ) |
#define spa_loop_control_get_fd | ( | l | ) | spa_loop_control_method_r(l,get_fd,0) |
#define spa_loop_control_add_hook | ( | l, | |
... ) spa_loop_control_method_v(l,add_hook,0,__VA_ARGS__) |
Add a hook.
ctrl | the control to change |
hooks | the hooks to add |
Adds hooks to the loop controlled by ctrl.
#define spa_loop_control_enter | ( | l | ) | spa_loop_control_method_v(l,enter,0) |
Enter a loop.
ctrl | the control |
Start an iteration of the loop. This function should be called before calling iterate and is typically used to capture the thread that this loop will run in.
#define spa_loop_control_leave | ( | l | ) | spa_loop_control_method_v(l,leave,0) |
Leave a loop.
ctrl | the control |
Ends the iteration of a loop. This should be called after calling iterate.
#define spa_loop_control_iterate | ( | l, | |
... ) spa_loop_control_method_r(l,iterate,0,__VA_ARGS__) |
Perform one iteration of the loop.
ctrl | the control |
timeout | an optional timeout in milliseconds. 0 for no timeout, -1 for infinite timeout. |
This function will block up to timeout milliseconds and then dispatch the fds with activity. The number of dispatched fds is returned.
#define spa_loop_control_check | ( | l | ) | spa_loop_control_method_r(l,check,1) |
Check context of the loop.
ctrl | the control |
This function will check if the current thread is currently the one that did the enter call. Since version 1:1.
returns 1 on success, 0 or negative errno value on error.
#define spa_loop_control_iterate_fast | ( | l, | |
... ) spa_loop_control_method_fast_r(l,iterate,0,__VA_ARGS__) |
#define SPA_VERSION_LOOP_UTILS_METHODS 0 |
#define spa_loop_utils_method_v | ( | o, | |
method, | |||
version, | |||
... ) |
#define spa_loop_utils_method_r | ( | o, | |
method, | |||
version, | |||
... ) |
#define spa_loop_utils_method_s | ( | o, | |
method, | |||
version, | |||
... ) |
#define spa_loop_utils_add_io | ( | l, | |
... ) spa_loop_utils_method_s(l,add_io,0,__VA_ARGS__) |
#define spa_loop_utils_update_io | ( | l, | |
... ) spa_loop_utils_method_r(l,update_io,0,__VA_ARGS__) |
#define spa_loop_utils_add_idle | ( | l, | |
... ) spa_loop_utils_method_s(l,add_idle,0,__VA_ARGS__) |
#define spa_loop_utils_enable_idle | ( | l, | |
... ) spa_loop_utils_method_r(l,enable_idle,0,__VA_ARGS__) |
#define spa_loop_utils_add_event | ( | l, | |
... ) spa_loop_utils_method_s(l,add_event,0,__VA_ARGS__) |
#define spa_loop_utils_signal_event | ( | l, | |
... ) spa_loop_utils_method_r(l,signal_event,0,__VA_ARGS__) |
#define spa_loop_utils_add_timer | ( | l, | |
... ) spa_loop_utils_method_s(l,add_timer,0,__VA_ARGS__) |
#define spa_loop_utils_update_timer | ( | l, | |
... ) spa_loop_utils_method_r(l,update_timer,0,__VA_ARGS__) |
#define spa_loop_utils_add_signal | ( | l, | |
... ) spa_loop_utils_method_s(l,add_signal,0,__VA_ARGS__) |
#define spa_loop_utils_destroy_source | ( | l, | |
... ) spa_loop_utils_method_v(l,destroy_source,0,__VA_ARGS__) |
destroy a source allocated with this interface.
This function should only be called when the loop is not running or from the context of the running loop