VLC  4.0.0-dev
Modules | Files | Data Structures | Macros | Typedefs | Enumerations | Functions
Threads and synchronization primitives
Collaboration diagram for Threads and synchronization primitives:


 Interruptible sleep
 Mutual exclusion locks
 Condition variables
 The condition variable is the most common and generic mean for threads to wait for events triggered by other threads.
 The semaphore is the simplest thread synchronization primitive, consisting of a simple counter.
 Read/write locks
 Read/write locks are a type of thread synchronization primitive meant to protect access to data that is mostly read, and rarely written. As long as no threads tries to acquire the lock for "writing", any number of threads can acquire the lock for "reading".
 Thread-specific variables
 Asynchronous/threaded timers


file  vlc_threads.h

Data Structures

struct  vlc_thread_t
 Thread handle. More...
struct  vlc_once_t
 One-time initialization. More...


 Whether LibVLC threads are based on POSIX threads. More...
 Whether LibVLC thread cancellation is based on POSIX threads. More...
 Return value of a canceled thread. More...
 Static initializer for one-time initialization. More...
#define vlc_once(once, cb)   vlc_once_inline(once, cb)
#define VLC_HARD_MIN_SLEEP   VLC_TICK_FROM_MS(10) /* 10 milliseconds = 1 tick at 100Hz */
#define VLC_SOFT_MIN_SLEEP   VLC_TICK_FROM_SEC(9) /* 9 seconds */
#define check_delay(d)   (d)
#define check_deadline(d)   (d)
#define vlc_tick_sleep(d)   vlc_tick_sleep(check_delay(d))
#define vlc_tick_wait(d)   vlc_tick_wait(check_deadline(d))
#define vlc_cleanup_push(routine, arg)   pthread_cleanup_push (routine, arg)
 Registers a thread cancellation handler. More...
#define vlc_cleanup_pop()   pthread_cleanup_pop (0)
 Unregisters the last cancellation handler. More...
#define mutex_cleanup_push(lock)   vlc_cleanup_push (vlc_cleanup_lock, lock)
#define vlc_global_lock(n)   vlc_global_mutex(n, true)
 Acquires a global mutex. More...
#define vlc_global_unlock(n)   vlc_global_mutex(n, false)
 Releases a global mutex. More...


typedef struct vlc_cleanup_t vlc_cleanup_t


enum  {


VLC_EXPORT void vlc_testcancel (void)
 Issues an explicit deferred cancellation point. More...
VLC_EXPORT void vlc_once_inline (vlc_once_t *restrict once, void(*cb)(void))
 Executes a function one time. More...
void vlc_atomic_wait (void *addr, unsigned val)
 Waits on an address. More...
int vlc_atomic_timedwait (void *addr, unsigned val, vlc_tick_t deadline)
 Waits on an address with a time-out. More...
int vlc_atomic_timedwait_daytime (void *addr, unsigned val, time_t deadline)
void vlc_atomic_notify_one (void *addr)
 Wakes up one thread on an address. More...
void vlc_atomic_notify_all (void *addr)
 Wakes up all thread on an address. More...
VLC_EXPORT int vlc_clone (vlc_thread_t *th, void *(*entry)(void *), void *data, int priority)
 Creates and starts a new thread. More...
VLC_EXPORT void vlc_cancel (vlc_thread_t)
 Marks a thread as cancelled. More...
VLC_EXPORT void vlc_join (vlc_thread_t th, void **result)
 Waits for a thread to complete (if needed), then destroys it. More...
VLC_EXPORT int vlc_savecancel (void)
 Disables thread cancellation. More...
VLC_EXPORT void vlc_restorecancel (int state)
 Restores the cancellation state. More...
VLC_EXPORT void vlc_control_cancel (vlc_cleanup_t *)
 Internal handler for thread cancellation. More...
VLC_EXPORT unsigned long vlc_thread_id (void)
 Thread identifier. More...
VLC_EXPORT vlc_tick_t vlc_tick_now (void)
 Precision monotonic clock. More...
VLC_EXPORT void vlc_tick_wait (vlc_tick_t deadline)
 Waits until a deadline. More...
VLC_EXPORT void vlc_tick_sleep (vlc_tick_t delay)
 Waits for an interval of time. More...
VLC_EXPORT unsigned vlc_GetCPUCount (void)
 Count CPUs. More...
static void vlc_cleanup_lock (void *lock)
void vlc_cancel_addr_set (atomic_uint *addr)
void vlc_cancel_addr_clear (atomic_uint *addr)
VLC_EXPORT void vlc_global_mutex (unsigned, bool)
 Internal handler for global mutexes. More...

Detailed Description

Macro Definition Documentation

◆ check_deadline

#define check_deadline (   d)    (d)

◆ check_delay

#define check_delay (   d)    (d)



Whether LibVLC threads are based on POSIX threads.



Whether LibVLC thread cancellation is based on POSIX threads.

◆ mutex_cleanup_push

#define mutex_cleanup_push (   lock)    vlc_cleanup_push (vlc_cleanup_lock, lock)

◆ vlc_cleanup_pop

#define vlc_cleanup_pop ( )    pthread_cleanup_pop (0)

Unregisters the last cancellation handler.

This pops the cancellation handler that was last pushed with vlc_cleanup_push() in the calling thread.

◆ vlc_cleanup_push

#define vlc_cleanup_push (   routine,
)    pthread_cleanup_push (routine, arg)

Registers a thread cancellation handler.

This pushes a function to run if the thread is cancelled (or otherwise exits prematurely).

If multiple procedures are registered, they are handled in last-in first-out order.

Any call to vlc_cleanup_push() must paired with a call to vlc_cleanup_pop().
Branching into or out of the block between these two function calls is not allowed (read: it will likely crash the whole process).
routineprocedure to call if the thread ends
argargument for the procedure

◆ vlc_global_lock

#define vlc_global_lock (   n)    vlc_global_mutex(n, true)

Acquires a global mutex.

◆ vlc_global_unlock

#define vlc_global_unlock (   n)    vlc_global_mutex(n, false)

Releases a global mutex.


#define VLC_HARD_MIN_SLEEP   VLC_TICK_FROM_MS(10) /* 10 milliseconds = 1 tick at 100Hz */

◆ vlc_once

#define vlc_once (   once,
)    vlc_once_inline(once, cb)


#define VLC_SOFT_MIN_SLEEP   VLC_TICK_FROM_SEC(9) /* 9 seconds */



Static initializer for one-time initialization.



Return value of a canceled thread.













◆ vlc_tick_sleep

#define vlc_tick_sleep (   d)    vlc_tick_sleep(check_delay(d))

◆ vlc_tick_wait

#define vlc_tick_wait (   d)    vlc_tick_wait(check_deadline(d))

Typedef Documentation

◆ vlc_cleanup_t

typedef struct vlc_cleanup_t vlc_cleanup_t

Enumeration Type Documentation

◆ anonymous enum

anonymous enum

Function Documentation

◆ vlc_atomic_notify_all()

void vlc_atomic_notify_all ( void *  addr)

Wakes up all thread on an address.

Wakes up all threads sleeping on the specified address (if any). Any thread sleeping within a call to vlc_atomic_wait() or vlc_atomic_timedwait() with the specified address as first call parameter will be woken up.

addraddress identifying which threads to wake up

References wait_bucket::lock, vlc_futex_wake(), vlc_umtx_wake(), wait_bucket::wait, wait_bucket_get(), and wait_bucket::waiters.

Referenced by vlc_atomic_notify_one(), vlc_cancel(), and vlc_once().

◆ vlc_atomic_notify_one()

void vlc_atomic_notify_one ( void *  addr)

Wakes up one thread on an address.

Wakes up (at least) one of the thread sleeping on the specified address. The address must be equal to the first parameter given by at least one thread sleeping within the vlc_atomic_wait() or vlc_atomic_timedwait() functions. If no threads are found, this function does nothing.

addraddress identifying which threads may be woken up

References vlc_atomic_notify_all(), vlc_futex_wake(), and vlc_umtx_wake().

Referenced by vlc_cond_signal_waiter(), vlc_mutex_unlock(), and vlc_sem_post().

◆ vlc_atomic_timedwait()

int vlc_atomic_timedwait ( void *  addr,
unsigned  val,
vlc_tick_t  deadline 

Waits on an address with a time-out.

This function operates as vlc_atomic_wait() but provides an additional time-out. If the deadline is reached, the thread resumes and the function returns.

addraddress to check for
valvalue to match at the address
deadlinedeadline to wait until
Return values
0the function was woken up before the time-out
ETIMEDOUTthe deadline was reached

References count, wait_bucket::lock, MS_FROM_VLC_TICK, timespec_from_vlc_tick(), vlc_assert_unreachable, vlc_atomic_timedwait_timespec(), vlc_cleanup_pop, vlc_cleanup_push, vlc_futex_wait(), vlc_testcancel(), VLC_TICK_FROM_MS, vlc_tick_now(), vlc_timespec_adjust(), vlc_umtx_wait(), vlc_WaitForSingleObject(), wait_bucket::wait, wait_bucket_enter(), and wait_bucket_leave().

Referenced by vlc_cond_timedwait(), and vlc_sem_timedwait().

◆ vlc_atomic_timedwait_daytime()

int vlc_atomic_timedwait_daytime ( void *  addr,
unsigned  val,
time_t  deadline 

◆ vlc_atomic_wait()

void vlc_atomic_wait ( void *  addr,
unsigned  val 

Waits on an address.

Puts the calling thread to sleep if a specific unsigned 32-bits value is stored at a specified address. The thread will sleep until it is woken up by a call to vlc_atomic_notify_one() or vlc_atomic_notify_all() in another thread, or spuriously.

If the value does not match, do nothing and return immediately.

addraddress to check for
valvalue to match at the address

References count, wait_bucket::lock, vlc_cleanup_pop, vlc_cleanup_push, vlc_futex_wait(), vlc_testcancel(), vlc_umtx_wait(), vlc_WaitForSingleObject(), wait_bucket::wait, wait_bucket_enter(), and wait_bucket_leave().

Referenced by vlc_cond_wait(), vlc_mutex_lock(), vlc_once(), and vlc_sem_wait().

◆ vlc_cancel()

VLC_EXPORT void vlc_cancel ( vlc_thread_t  )

Marks a thread as cancelled.

Next time the target thread reaches a cancellation point (while not having disabled cancellation), it will run its cancellation cleanup handler, the thread variable destructors, and terminate.

vlc_join() must be used regardless of a thread being cancelled or not, to avoid leaking resources.

References vlc_thread::addr, vlc_thread_t::handle, vlc_atomic_notify_all(), vlc_cancel_self(), vlc_mutex_lock(), and vlc_mutex_unlock().

Referenced by Close(), httpd_HostDelete(), vlc_h2_conn_destroy(), and vlc_h2_output_destroy().

◆ vlc_cancel_addr_clear()

void vlc_cancel_addr_clear ( atomic_uint *  addr)

◆ vlc_cancel_addr_set()

void vlc_cancel_addr_set ( atomic_uint *  addr)

◆ vlc_cleanup_lock()

static void vlc_cleanup_lock ( void *  lock)

References lock, and vlc_mutex_unlock().

◆ vlc_clone()

VLC_EXPORT int vlc_clone ( vlc_thread_t th,
void *(*)(void *)  entry,
void *  data,
int  priority 

Creates and starts a new thread.

The thread must be joined with vlc_join() to reclaim resources when it is not needed anymore.

thstorage space for the handle of the new thread (cannot be NULL) [OUT]
entryentry point for the thread
datadata parameter given to the entry point
prioritythread priority value
0 on success, a standard error code on error.
In case of error, the value of *th is undefined.

References vlc_thread::addr, vlc_thread::cancel_event, vlc_thread::cancel_sock, vlc_thread::cleaners, vlc_thread::data, vlc_thread::done_event, vlc_thread::entry, vlc_thread::id, vlc_thread::killable, vlc_thread::killed, vlc_thread::lock, vlc_thread::tid, unlikely, vlc_clone_attr(), vlc_entry(), VLC_THREAD_PRIORITY_HIGHEST, and vlc_thread::wait.

Referenced by addons_manager_Gather(), decoder_New(), httpd_HostCreate(), input_Start(), InstallEntry(), OpenSDP(), OpenURL(), sout_AnnounceRegisterSDP(), SpawnThread(), spu_Create(), TsStart(), update_Check(), update_Download(), vlc_demux_chained_New(), vlc_h2_conn_create(), vlc_h2_output_create(), vlc_mta_acquire(), vlc_player_New(), vlc_timer_create(), vlm_New(), and vout_Request().

◆ vlc_control_cancel()

VLC_EXPORT void vlc_control_cancel ( vlc_cleanup_t )

Internal handler for thread cancellation.

Do not call this function directly. Use wrapper macros instead: vlc_cleanup_push(), vlc_cleanup_pop().

References vlc_thread::cleaners, thread_key, vlc_assert_unreachable, and vlc_threadvar_get().

◆ vlc_GetCPUCount()

VLC_EXPORT unsigned vlc_GetCPUCount ( void  )

Count CPUs.

number of available (logical) CPUs.

References count, unlikely, and vlc_alloc().

◆ vlc_global_mutex()

VLC_EXPORT void vlc_global_mutex ( unsigned  ,

Internal handler for global mutexes.

Do not use this function directly. Use helper macros instead: vlc_global_lock(), vlc_global_unlock().

References ARRAY_SIZE, lock, static_assert, VLC_MAX_MUTEX, vlc_mutex_lock(), vlc_mutex_unlock(), and VLC_STATIC_MUTEX.

◆ vlc_join()

VLC_EXPORT void vlc_join ( vlc_thread_t  th,
void **  result 

Waits for a thread to complete (if needed), then destroys it.

This is a cancellation point. In case of cancellation, the thread is not joined.
A thread cannot join itself (normally VLC will abort if this is attempted). Also a detached thread cannot be joined.
ththread handle
result[OUT] pointer to write the thread return value or NULL

References vlc_thread_t::handle, vlc_testcancel(), VLC_THREAD_ASSERT, and vlc_WaitForSingleObject().

Referenced by addons_manager_Delete(), Close(), httpd_HostDelete(), input_Close(), sout_AnnounceUnRegister(), spu_Destroy(), TsStop(), update_Check(), update_Delete(), update_Download(), vlc_demux_chained_Delete(), vlc_executor_Delete(), vlc_h2_conn_destroy(), vlc_h2_output_destroy(), vlc_input_decoder_Delete(), vlc_mta_release(), vlc_player_Delete(), vlc_timer_destroy(), vlm_Delete(), and vout_StopDisplay().

◆ vlc_once_inline()

static void vlc_once_inline ( vlc_once_t *restrict  once,
void(*)(void)  cb 

Executes a function one time.

The first time this function is called with a given one-time initialization object, it executes the provided callback. Any further call with the same object will be a no-op.

In the corner case that the first time execution is ongoing in another thread, then the function will wait for completion on the other thread (and then synchronize memory) before it returns. This ensures that, no matter what, the callback has been executed exactly once and its side effects are visible after the function returns.

oncea one-time initialization object
cbcallback to execute (the first time)

References unlikely, and vlc_once.

◆ vlc_restorecancel()

VLC_EXPORT void vlc_restorecancel ( int  state)

◆ vlc_savecancel()

VLC_EXPORT int vlc_savecancel ( void  )

Disables thread cancellation.

This functions saves the current cancellation state (enabled or disabled), then disables cancellation for the calling thread. It must be called before entering a piece of code that is not cancellation-safe, unless it can be proven that the calling thread will not be cancelled.

This function is not a cancellation point.
Previous cancellation state (opaque value for vlc_restorecancel()).

References vlc_thread::killable, state, thread, thread_key, VLC_THREAD_ASSERT, and vlc_threadvar_get().

Referenced by FinderThread(), httpdLoop(), InstallerThread(), rtp_dgram_thread(), update_CheckReal(), update_DownloadReal(), vlc_h2_output_dequeue(), vlc_h2_recv_thread(), vlc_https_connect_proxy(), vlc_https_recv(), vlc_https_send(), vlc_mutex_lock(), vlc_object_deinit(), vlc_poll_i11e_inner(), vlc_poll_i11e_wake(), vlc_thread_fatal(), vlc_tls_ClientSessionCreate(), vlc_tls_ServerSessionCreate(), vlc_tls_SessionDelete(), and vlc_vaLogCallback().

◆ vlc_testcancel()

VLC_EXPORT void vlc_testcancel ( void  )

Issues an explicit deferred cancellation point.

This has no effects if thread cancellation is disabled. This can be called when there is a rather slow non-sleeping operation. This is also used to force a cancellation point in a function that would otherwise not always be one (block_FifoGet() is an example).

References vlc_thread::cancel_event, vlc_thread::cleaners, vlc_thread::data, vlc_thread::done_event, vlc_thread::killable, vlc_thread::killed, p, thread, thread_key, vlc_cancel_self(), vlc_thread_cleanup(), and vlc_threadvar_get().

Referenced by block_FifoGet(), net_Read(), net_Write(), vlc_atomic_timedwait(), vlc_atomic_timedwait_daytime(), vlc_atomic_wait(), vlc_join(), vlc_poll_i11e_inner(), vlc_queue_Dequeue(), vlc_select(), and vlc_tick_wait().

◆ vlc_thread_id()

VLC_EXPORT unsigned long vlc_thread_id ( void  )

Thread identifier.

This function returns the identifier of the calling thread. The identifier cannot change for the entire duration of the thread, and no other thread can have the same identifier at the same time in the same process. Typically, the identifier is also unique across all running threads of all existing processes, but that depends on the operating system.

There are no particular semantics to the thread ID with LibVLC. It is provided mainly for tracing and debugging.

This function is not currently implemented on all supported platforms. Where not implemented, it returns (unsigned long)-1.
the thread identifier (or -1 if unimplemented)

References unlikely.

Referenced by vlc_thread_fatal(), vlc_thread_fatal_print(), and vlc_vaLog().

◆ vlc_tick_now()

VLC_EXPORT vlc_tick_t vlc_tick_now ( void  )

Precision monotonic clock.

In principles, the clock has a precision of 1 MHz. But the actual resolution may be much lower, especially when it comes to sleeping with vlc_tick_wait() or vlc_tick_sleep(). Most general-purpose operating systems provide a resolution of only 100 to 1000 Hz.

The origin date (time value "zero") is not specified. It is typically the time the kernel started, but this is platform-dependent. If you need wall clock time, use gettimeofday() instead.
a timestamp in microseconds.

References freq, lldiv(), mdate_selected, Q2LL, lldiv_t::quot, lldiv_t::rem, unlikely, vlc_tick_from_samples(), vlc_tick_from_sec, and vlc_tick_from_timespec.

Referenced by aout_DecDrain(), aout_DecPlay(), aout_DecSilence(), CmdInitAdd(), CmdInitControl(), CmdInitDel(), CmdInitPrivControl(), CmdInitSend(), Control(), DisplayPicture(), EsOutDecodersStopBuffering(), EsOutGetBuffering(), EsOutVaControlLocked(), httpdLoop(), ImageRead(), Init(), input_rate_Add(), input_thread_Events(), MainLoop(), net_Connect(), OSDWidget(), PreparePicture(), PrerenderPicture(), RenderPicture(), rtp_dequeue(), rtp_queue(), rtp_timeout(), RunnableRun(), RunThread(), sout_AnnounceRegisterSDP(), spu_PrerenderText(), spu_PutSubpicture(), Thread(), TsStart(), vlc_atomic_timedwait(), vlc_input_decoder_AddVoutOverlay(), vlc_msleep_i11e(), vlc_player_input_GetPos(), vlc_player_input_GetTime(), vlc_player_WaitRetryDelay(), vlc_tick_sleep(), vlc_tick_wait(), vlc_timer_schedule(), vlc_tls_ClientSessionCreate(), vout_chrono_Stop(), vout_display_window_MouseEvent(), vout_OSDEpg(), vout_OSDText(), vout_SetInterlacingState(), vout_snapshot_Get(), and VoutSnapshotPip().

◆ vlc_tick_sleep()

VLC_EXPORT void vlc_tick_sleep ( vlc_tick_t  delay)

Waits for an interval of time.

delayhow long to wait (in microseconds)
The delay may be exceeded due to OS scheduling.
This function is a cancellation point.

References timespec_from_vlc_tick(), vlc_tick_now(), and vlc_tick_wait().

◆ vlc_tick_wait()

VLC_EXPORT void vlc_tick_wait ( vlc_tick_t  deadline)

Waits until a deadline.

deadlinetimestamp to wait for (vlc_tick_now())
The deadline may be exceeded due to OS scheduling.
This function is a cancellation point.

References timespec_from_vlc_tick(), unlikely, vlc_clock_prec, vlc_clock_setup_once(), vlc_Sleep(), vlc_testcancel(), and vlc_tick_now().

Referenced by vlc_tick_sleep().