queue: helpers for killable queues

This adds two functions to simplify the common case of a thread waiting on
a queue until it is terminated.
This commit is contained in:
Rémi Denis-Courmont 2020-04-11 22:06:20 +03:00
parent 165f3b55d5
commit 04cf487945
1 changed files with 41 additions and 0 deletions

View File

@ -213,5 +213,46 @@ VLC_API void *vlc_queue_Dequeue(vlc_queue_t *) VLC_USED;
*/
VLC_API void *vlc_queue_DequeueAll(vlc_queue_t *) VLC_USED;
/**
* @defgroup queue_killable Killable queues
*
* Thread-safe queues with an end flag.
*
* @{
*/
/**
* Marks a queue ended.
*/
static inline void vlc_queue_Kill(vlc_queue_t *q,
bool *restrict tombstone)
{
vlc_queue_Lock(q);
*tombstone = true;
vlc_queue_Signal(q);
vlc_queue_Unlock(q);
}
/**
* Dequeues one entry from a killable queue.
*
* @return an entry, or NULL if the queue is empty and has been ended.
*/
static inline void *vlc_queue_DequeueKillable(vlc_queue_t *q,
bool *restrict tombstone)
{
void *entry;
vlc_queue_Lock(q);
while (vlc_queue_IsEmpty(q) && !*tombstone)
vlc_queue_Wait(q);
entry = vlc_queue_DequeueUnlocked(q);
vlc_queue_Unlock(q);
return entry;
}
/** @} */
/** @} */
#endif