VLC  3.0.21
Macros | Typedefs | Functions
Block FIFO

Thread-safe block queue functions. More...

Collaboration diagram for Block FIFO:

Macros

#define vlc_fifo_CleanupPush(fifo)   vlc_cleanup_push(vlc_fifo_Cleanup, fifo)
 

Typedefs

typedef struct block_fifo_t vlc_fifo_t
 

Functions

block_fifo_tblock_FifoNew (void)
 Creates a thread-safe FIFO queue of blocks. More...
 
void block_FifoRelease (block_fifo_t *)
 Destroys a FIFO created by block_FifoNew(). More...
 
void block_FifoEmpty (block_fifo_t *)
 Clears all blocks in a FIFO. More...
 
void block_FifoPut (block_fifo_t *fifo, block_t *block)
 Immediately queue one block at the end of a FIFO. More...
 
block_tblock_FifoGet (block_fifo_t *)
 Dequeue the first block from the FIFO. More...
 
block_tblock_FifoShow (block_fifo_t *)
 Peeks the first block in the FIFO. More...
 
size_t block_FifoSize (block_fifo_t *)
 
size_t block_FifoCount (block_fifo_t *)
 
void vlc_fifo_Lock (vlc_fifo_t *)
 Locks a block FIFO. More...
 
void vlc_fifo_Unlock (vlc_fifo_t *)
 Unlocks a block FIFO. More...
 
void vlc_fifo_Signal (vlc_fifo_t *)
 Wakes up one thread waiting on the FIFO, if any. More...
 
void vlc_fifo_Wait (vlc_fifo_t *)
 Waits on the FIFO. More...
 
void vlc_fifo_WaitCond (vlc_fifo_t *, vlc_cond_t *)
 
int vlc_fifo_TimedWaitCond (vlc_fifo_t *, vlc_cond_t *, vlc_tick_t)
 Timed variant of vlc_fifo_WaitCond(). More...
 
void vlc_fifo_QueueUnlocked (vlc_fifo_t *, block_t *)
 Queues a linked-list of blocks into a locked FIFO. More...
 
block_tvlc_fifo_DequeueUnlocked (vlc_fifo_t *)
 Dequeues the first block from a locked FIFO, if any. More...
 
block_tvlc_fifo_DequeueAllUnlocked (vlc_fifo_t *)
 Dequeues the all blocks from a locked FIFO. More...
 
size_t vlc_fifo_GetCount (const vlc_fifo_t *)
 Counts blocks in a FIFO. More...
 
size_t vlc_fifo_GetBytes (const vlc_fifo_t *)
 Counts bytes in a FIFO. More...
 
static bool vlc_fifo_IsEmpty (const vlc_fifo_t *fifo)
 
static void vlc_fifo_Cleanup (void *fifo)
 

Detailed Description

Thread-safe block queue functions.

Macro Definition Documentation

◆ vlc_fifo_CleanupPush

#define vlc_fifo_CleanupPush (   fifo)    vlc_cleanup_push(vlc_fifo_Cleanup, fifo)

Typedef Documentation

◆ vlc_fifo_t

typedef struct block_fifo_t vlc_fifo_t

Function Documentation

◆ block_FifoCount()

size_t block_FifoCount ( block_fifo_t )

◆ block_FifoEmpty()

void block_FifoEmpty ( block_fifo_t )

◆ block_FifoGet()

block_t* block_FifoGet ( block_fifo_t )

Dequeue the first block from the FIFO.

If necessary, wait until there is one block in the queue. This function is (always) cancellation point.

Returns
a valid block

References vlc_cleanup_pop, vlc_fifo_CleanupPush, vlc_fifo_DequeueUnlocked(), vlc_fifo_IsEmpty(), vlc_fifo_Lock(), vlc_fifo_Unlock(), vlc_fifo_Wait(), and vlc_testcancel().

◆ block_FifoNew()

block_fifo_t* block_FifoNew ( void  )

Creates a thread-safe FIFO queue of blocks.

See also block_FifoPut() and block_FifoGet(). The created queue must be released with block_FifoRelease().

Returns
the FIFO or NULL on memory error

References block_fifo_t::i_depth, block_fifo_t::i_size, block_fifo_t::lock, block_fifo_t::p_first, block_fifo_t::pp_last, vlc_cond_init(), vlc_mutex_init(), and block_fifo_t::wait.

Referenced by CreateDecoder(), and vlc_stream_fifo_New().

◆ block_FifoPut()

void block_FifoPut ( block_fifo_t fifo,
block_t block 
)

Immediately queue one block at the end of a FIFO.

Parameters
fifoqueue
blockhead of a block list to queue (may be NULL)

References vlc_fifo_Lock(), vlc_fifo_QueueUnlocked(), and vlc_fifo_Unlock().

Referenced by DecoderPlayCc().

◆ block_FifoRelease()

void block_FifoRelease ( block_fifo_t )

Destroys a FIFO created by block_FifoNew().

Note
Any queued blocks are also destroyed.
Warning
No other threads may be using the FIFO when this function is called. Otherwise, undefined behaviour will occur.

References block_ChainRelease(), block_fifo_t::lock, block_fifo_t::p_first, vlc_cond_destroy(), vlc_mutex_destroy(), and block_fifo_t::wait.

Referenced by DeleteDecoder(), vlc_stream_fifo_Close(), and vlc_stream_fifo_New().

◆ block_FifoShow()

block_t* block_FifoShow ( block_fifo_t )

Peeks the first block in the FIFO.

Warning
This function leaves the block in the FIFO. You need to protect against concurrent threads who could dequeue the block. Preferably, there should be only one thread reading from the FIFO.
This function is undefined if the FIFO is empty.
Returns
a valid block.

References block_fifo_t::lock, block_fifo_t::p_first, vlc_mutex_lock(), and vlc_mutex_unlock().

◆ block_FifoSize()

size_t block_FifoSize ( block_fifo_t )

◆ vlc_fifo_Cleanup()

static void vlc_fifo_Cleanup ( void *  fifo)
inlinestatic

◆ vlc_fifo_DequeueAllUnlocked()

block_t* vlc_fifo_DequeueAllUnlocked ( vlc_fifo_t )

Dequeues the all blocks from a locked FIFO.

This is equivalent to calling vlc_fifo_DequeueUnlocked() repeatedly until the FIFO is emptied, but this function is much faster.

Note
This function is not a cancellation point.
Warning
The FIFO must be locked by the calling thread using vlc_fifo_Lock(). Otherwise behaviour is undefined.
Returns
a linked-list of all blocks in the FIFO (possibly NULL)

References block_fifo_t::i_depth, block_fifo_t::i_size, block_fifo_t::lock, block_fifo_t::p_first, block_fifo_t::pp_last, and vlc_assert_locked().

Referenced by block_FifoEmpty(), input_DecoderDecode(), input_DecoderFlush(), and vlc_stream_fifo_Destroy().

◆ vlc_fifo_DequeueUnlocked()

block_t* vlc_fifo_DequeueUnlocked ( vlc_fifo_t )

Dequeues the first block from a locked FIFO, if any.

Note
This function is not a cancellation point.
Warning
The FIFO must be locked by the calling thread using vlc_fifo_Lock(). Otherwise behaviour is undefined.
Returns
the first block in the FIFO or NULL if the FIFO is empty

References block_t::i_buffer, block_fifo_t::i_depth, block_fifo_t::i_size, block_fifo_t::lock, block_fifo_t::p_first, block_t::p_next, block_fifo_t::pp_last, and vlc_assert_locked().

Referenced by block_FifoGet(), DecoderThread(), and vlc_stream_fifo_Block().

◆ vlc_fifo_GetBytes()

size_t vlc_fifo_GetBytes ( const vlc_fifo_t )

Counts bytes in a FIFO.

Checks how many bytes are queued in a locked FIFO.

Note
This function is not cancellation point.
Warning
The FIFO must be locked by the calling thread using vlc_fifo_Lock(). Otherwise behaviour is undefined.
Returns
the total number of bytes
Note
Zero bytes does not necessarily mean that the FIFO is empty since a block could contain zero bytes. Use vlc_fifo_GetCount() to determine if a FIFO is empty.

References block_fifo_t::i_size.

Referenced by input_DecoderDecode().

◆ vlc_fifo_GetCount()

size_t vlc_fifo_GetCount ( const vlc_fifo_t )

Counts blocks in a FIFO.

Checks how many blocks are queued in a locked FIFO.

Note
This function is not cancellation point.
Warning
The FIFO must be locked by the calling thread using vlc_fifo_Lock(). Otherwise behaviour is undefined.
Returns
the number of blocks in the FIFO (zero if it is empty)

References block_fifo_t::i_depth.

Referenced by input_DecoderDecode().

◆ vlc_fifo_IsEmpty()

static bool vlc_fifo_IsEmpty ( const vlc_fifo_t fifo)
inlinestatic

◆ vlc_fifo_Lock()

void vlc_fifo_Lock ( vlc_fifo_t )

Locks a block FIFO.

No more than one thread can lock the FIFO at any given time, and no other thread can modify the FIFO while it is locked. vlc_fifo_Unlock() releases the lock.

Note
If the FIFO is already locked by another thread, this function waits. This function is not a cancellation point.
Warning
Recursively locking a single FIFO is undefined. Locking more than one FIFO at a time may lead to lock inversion; mind the locking order.

References block_fifo_t::lock, and vlc_mutex_lock().

Referenced by block_FifoEmpty(), block_FifoGet(), block_FifoPut(), DecoderThread(), DecoderTimedWait(), input_DecoderDecode(), input_DecoderDelete(), input_DecoderDrain(), input_DecoderFlush(), vlc_stream_fifo_Block(), vlc_stream_fifo_Close(), vlc_stream_fifo_Destroy(), and vlc_stream_fifo_Queue().

◆ vlc_fifo_QueueUnlocked()

void vlc_fifo_QueueUnlocked ( vlc_fifo_t ,
block_t  
)

Queues a linked-list of blocks into a locked FIFO.

Parameters
blockthe head of the list of blocks (if NULL, this function has no effects)
Note
This function is not a cancellation point.
Warning
The FIFO must be locked by the calling thread using vlc_fifo_Lock(). Otherwise behaviour is undefined.

References block_t::i_buffer, block_fifo_t::i_depth, block_fifo_t::i_size, block_fifo_t::lock, block_t::p_next, block_fifo_t::pp_last, vlc_assert_locked(), and vlc_fifo_Signal().

Referenced by block_FifoPut(), input_DecoderDecode(), and vlc_stream_fifo_Queue().

◆ vlc_fifo_Signal()

void vlc_fifo_Signal ( vlc_fifo_t )

Wakes up one thread waiting on the FIFO, if any.

Note
This function is not a cancellation point.
Warning
For race-free operations, the FIFO should be locked by the calling thread. The function can be called on a unlocked FIFO however.

Referenced by input_DecoderDrain(), input_DecoderFlush(), vlc_fifo_QueueUnlocked(), and vlc_stream_fifo_Close().

◆ vlc_fifo_TimedWaitCond()

int vlc_fifo_TimedWaitCond ( vlc_fifo_t ,
vlc_cond_t ,
vlc_tick_t   
)

Timed variant of vlc_fifo_WaitCond().

Atomically unlocks the FIFO and waits until one thread signals the FIFO up to a certain date, then locks the FIFO again. See vlc_fifo_Wait().

References block_fifo_t::lock, and vlc_cond_timedwait().

Referenced by DecoderTimedWait().

◆ vlc_fifo_Unlock()

void vlc_fifo_Unlock ( vlc_fifo_t )

Unlocks a block FIFO.

The calling thread must have locked the FIFO previously with vlc_fifo_Lock(). Otherwise, the behaviour is undefined.

Note
This function is not a cancellation point.

References block_fifo_t::lock, and vlc_mutex_unlock().

Referenced by block_FifoEmpty(), block_FifoGet(), block_FifoPut(), DecoderThread(), DecoderTimedWait(), input_DecoderDecode(), input_DecoderDelete(), input_DecoderDrain(), input_DecoderFlush(), vlc_stream_fifo_Block(), vlc_stream_fifo_Close(), vlc_stream_fifo_Destroy(), and vlc_stream_fifo_Queue().

◆ vlc_fifo_Wait()

void vlc_fifo_Wait ( vlc_fifo_t )

Waits on the FIFO.

Atomically unlocks the FIFO and waits until one thread signals the FIFO, then locks the FIFO again. A signal can be sent by queueing a block to the previously empty FIFO or by calling vlc_fifo_Signal() directly. This function may also return spuriously at any moment.

Note
This function is a cancellation point. In case of cancellation, the the FIFO will be locked before cancellation cleanup handlers are processed.

Referenced by block_FifoGet(), DecoderThread(), and vlc_stream_fifo_Block().

◆ vlc_fifo_WaitCond()

void vlc_fifo_WaitCond ( vlc_fifo_t ,
vlc_cond_t  
)

References block_fifo_t::lock, and vlc_cond_wait().

Referenced by input_DecoderDecode().