| <!-- ##### SECTION Title ##### --> |
| Asynchronous Queues |
| |
| <!-- ##### SECTION Short_Description ##### --> |
| asynchronous communication between threads. |
| |
| <!-- ##### SECTION Long_Description ##### --> |
| <para> |
| Often you need to communicate between different threads. In general |
| it's safer not to do this by shared memory, but by explicit message |
| passing. These messages only make sense asynchronously for |
| multi-threaded applications though, as a synchronous operation could as |
| well be done in the same thread. |
| </para> |
| |
| <para> |
| Asynchronous queues are an exception from most other GLib data |
| structures, as they can be used simultaneously from multiple threads |
| without explicit locking and they bring their own builtin reference |
| counting. This is because the nature of an asynchronous queue is that |
| it will always be used by at least 2 concurrent threads. |
| </para> |
| |
| <para> |
| For using an asynchronous queue you first have to create one with |
| g_async_queue_new(). A newly-created queue will get the reference |
| count 1. Whenever another thread is creating a new reference of (that |
| is, pointer to) the queue, it has to increase the reference count |
| (using g_async_queue_ref()). Also, before removing this reference, the |
| reference count has to be decreased (using |
| g_async_queue_unref()). After that the queue might no longer exist so |
| you must not access it after that point. |
| </para> |
| |
| <para> |
| A thread, which wants to send a message to that queue simply calls |
| g_async_queue_push() to push the message to the queue. |
| </para> |
| |
| <para> |
| A thread, which is expecting messages from an asynchronous queue |
| simply calls g_async_queue_pop() for that queue. If no message is |
| available in the queue at that point, the thread is now put to sleep |
| until a message arrives. The message will be removed from the queue |
| and returned. The functions g_async_queue_try_pop() and |
| g_async_queue_timed_pop() can be used to only check for the presence |
| of messages or to only wait a certain time for messages respectively. |
| </para> |
| |
| <para> |
| For almost every function there exist two variants, one that locks the |
| queue and one that doesn't. That way you can hold the queue lock |
| (acquire it with g_async_queue_lock() and release it with |
| g_async_queue_unlock()) over multiple queue accessing |
| instructions. This can be necessary to ensure the integrity of the |
| queue, but should only be used when really necessary, as it can make |
| your life harder if used unwisely. Normally you should only use the |
| locking function variants (those without the suffix _unlocked) |
| </para> |
| |
| <!-- ##### SECTION See_Also ##### --> |
| <para> |
| |
| </para> |
| |
| <!-- ##### SECTION Stability_Level ##### --> |
| |
| |
| <!-- ##### STRUCT GAsyncQueue ##### --> |
| <para> |
| The #GAsyncQueue struct is an opaque data structure, which represents |
| an asynchronous queue. It should only be accessed through the |
| <function>g_async_queue_*</function> functions. |
| </para> |
| |
| |
| <!-- ##### FUNCTION g_async_queue_new ##### --> |
| |
| |
| @Returns: |
| |
| |
| <!-- ##### FUNCTION g_async_queue_ref ##### --> |
| |
| |
| @queue: |
| @Returns: |
| |
| |
| <!-- ##### FUNCTION g_async_queue_unref ##### --> |
| |
| |
| @queue: |
| |
| |
| <!-- ##### FUNCTION g_async_queue_push ##### --> |
| |
| |
| @queue: |
| @data: |
| |
| |
| <!-- ##### FUNCTION g_async_queue_push_sorted ##### --> |
| <para> |
| |
| </para> |
| |
| @queue: |
| @data: |
| @func: |
| @user_data: |
| |
| |
| <!-- ##### FUNCTION g_async_queue_pop ##### --> |
| |
| |
| @queue: |
| @Returns: |
| |
| |
| <!-- ##### FUNCTION g_async_queue_try_pop ##### --> |
| |
| |
| @queue: |
| @Returns: |
| |
| |
| <!-- ##### FUNCTION g_async_queue_timed_pop ##### --> |
| |
| |
| @queue: |
| @end_time: |
| @Returns: |
| |
| |
| <!-- ##### FUNCTION g_async_queue_length ##### --> |
| |
| |
| @queue: |
| @Returns: |
| |
| |
| <!-- ##### FUNCTION g_async_queue_sort ##### --> |
| <para> |
| |
| </para> |
| |
| @queue: |
| @func: |
| @user_data: |
| |
| |
| <!-- ##### FUNCTION g_async_queue_lock ##### --> |
| |
| |
| @queue: |
| |
| |
| <!-- ##### FUNCTION g_async_queue_unlock ##### --> |
| |
| |
| @queue: |
| |
| |
| <!-- ##### FUNCTION g_async_queue_ref_unlocked ##### --> |
| |
| |
| @queue: |
| |
| |
| <!-- ##### FUNCTION g_async_queue_unref_and_unlock ##### --> |
| |
| |
| @queue: |
| |
| |
| <!-- ##### FUNCTION g_async_queue_push_unlocked ##### --> |
| |
| |
| @queue: |
| @data: |
| |
| |
| <!-- ##### FUNCTION g_async_queue_push_sorted_unlocked ##### --> |
| <para> |
| |
| </para> |
| |
| @queue: |
| @data: |
| @func: |
| @user_data: |
| |
| |
| <!-- ##### FUNCTION g_async_queue_pop_unlocked ##### --> |
| |
| |
| @queue: |
| @Returns: |
| |
| |
| <!-- ##### FUNCTION g_async_queue_try_pop_unlocked ##### --> |
| |
| |
| @queue: |
| @Returns: |
| |
| |
| <!-- ##### FUNCTION g_async_queue_timed_pop_unlocked ##### --> |
| |
| |
| @queue: |
| @end_time: |
| @Returns: |
| |
| |
| <!-- ##### FUNCTION g_async_queue_length_unlocked ##### --> |
| |
| |
| @queue: |
| @Returns: |
| |
| |
| <!-- ##### FUNCTION g_async_queue_sort_unlocked ##### --> |
| <para> |
| |
| </para> |
| |
| @queue: |
| @func: |
| @user_data: |
| |
| |