A thread based event loop implementation based on pa_mainloop. More...
Go to the source code of this file.
Typedefs | |
typedef struct pa_threaded_mainloop | pa_threaded_mainloop |
An opaque threaded main loop object. | |
Functions | |
pa_threaded_mainloop * | pa_threaded_mainloop_new (void) |
Allocate a new threaded main loop object. | |
void | pa_threaded_mainloop_free (pa_threaded_mainloop *m) |
Free a threaded main loop object. | |
int | pa_threaded_mainloop_start (pa_threaded_mainloop *m) |
Start the event loop thread. | |
void | pa_threaded_mainloop_stop (pa_threaded_mainloop *m) |
Terminate the event loop thread cleanly. | |
void | pa_threaded_mainloop_lock (pa_threaded_mainloop *m) |
Lock the event loop object, effectively blocking the event loop thread from processing events. | |
void | pa_threaded_mainloop_unlock (pa_threaded_mainloop *m) |
Unlock the event loop object, inverse of pa_threaded_mainloop_lock() | |
void | pa_threaded_mainloop_wait (pa_threaded_mainloop *m) |
Wait for an event to be signalled by the event loop thread. | |
void | pa_threaded_mainloop_signal (pa_threaded_mainloop *m, int wait_for_accept) |
Signal all threads waiting for a signalling event in pa_threaded_mainloop_wait(). | |
void | pa_threaded_mainloop_accept (pa_threaded_mainloop *m) |
Accept a signal from the event thread issued with pa_threaded_mainloop_signal(). | |
int | pa_threaded_mainloop_get_retval (pa_threaded_mainloop *m) |
Return the return value as specified with the main loop's quit() routine. | |
pa_mainloop_api * | pa_threaded_mainloop_get_api (pa_threaded_mainloop *m) |
Return the abstract main loop abstraction layer vtable for this main loop. | |
int | pa_threaded_mainloop_in_thread (pa_threaded_mainloop *m) |
Returns non-zero when called from withing the event loop thread. |
A thread based event loop implementation based on pa_mainloop.
The event loop is run in a helper thread in the background. A few synchronization primitives are available to access the objects attached to the event loop safely.
See also Threaded Main Loop
typedef struct pa_threaded_mainloop pa_threaded_mainloop |
An opaque threaded main loop object.
void pa_threaded_mainloop_accept | ( | pa_threaded_mainloop * | m ) |
Accept a signal from the event thread issued with pa_threaded_mainloop_signal().
This call should only be used in conjunction with pa_threaded_mainloop_signal() with a non-zero wait_for_accept value.
void pa_threaded_mainloop_free | ( | pa_threaded_mainloop * | m ) |
Free a threaded main loop object.
If the event loop thread is still running, terminate it with pa_threaded_mainloop_stop() first.
pa_mainloop_api* pa_threaded_mainloop_get_api | ( | pa_threaded_mainloop * | m ) |
Return the abstract main loop abstraction layer vtable for this main loop.
No need to free the API as it is owned by the loop and is destroyed when the loop is freed.
int pa_threaded_mainloop_get_retval | ( | pa_threaded_mainloop * | m ) |
Return the return value as specified with the main loop's quit() routine.
int pa_threaded_mainloop_in_thread | ( | pa_threaded_mainloop * | m ) |
Returns non-zero when called from withing the event loop thread.
void pa_threaded_mainloop_lock | ( | pa_threaded_mainloop * | m ) |
Lock the event loop object, effectively blocking the event loop thread from processing events.
You can use this to enforce exclusive access to all objects attached to the event loop. This lock is recursive. This function may not be called inside the event loop thread. Events that are dispatched from the event loop thread are executed with this lock held.
pa_threaded_mainloop* pa_threaded_mainloop_new | ( | void | ) |
Allocate a new threaded main loop object.
You have to call pa_threaded_mainloop_start() before the event loop thread starts running.
void pa_threaded_mainloop_signal | ( | pa_threaded_mainloop * | m, |
int | wait_for_accept | ||
) |
Signal all threads waiting for a signalling event in pa_threaded_mainloop_wait().
If wait_for_release is non-zero, do not return before the signal was accepted by a pa_threaded_mainloop_accept() call. While waiting for that condition the event loop object is unlocked.
int pa_threaded_mainloop_start | ( | pa_threaded_mainloop * | m ) |
Start the event loop thread.
void pa_threaded_mainloop_stop | ( | pa_threaded_mainloop * | m ) |
Terminate the event loop thread cleanly.
Make sure to unlock the mainloop object before calling this function.
void pa_threaded_mainloop_unlock | ( | pa_threaded_mainloop * | m ) |
Unlock the event loop object, inverse of pa_threaded_mainloop_lock()
void pa_threaded_mainloop_wait | ( | pa_threaded_mainloop * | m ) |
Wait for an event to be signalled by the event loop thread.
You can use this to pass data from the event loop thread to the main thread in synchronized fashion. This function may not be called inside the event loop thread. Prior to this call the event loop object needs to be locked using pa_threaded_mainloop_lock(). While waiting the lock will be released, immediately before returning it will be acquired again. This function may spuriously wake up even without _signal() being called. You need to make sure to handle that!