VLC 4.0.0-dev
thread.c File Reference
Include dependency graph for thread.c:

Data Structures

struct  vlc_thread
 
struct  vlc_threadvar
 
struct  wait_bucket
 
struct  vlc_timer
 

Macros

#define Q2LL(q)   ( *( long long * )&( q ))
 

Functions

static void vlc_cancel_self (PVOID dummy)
 
static ULONG vlc_DosWaitEventSemEx (HEV hev, ULONG ulTimeout)
 
static ULONG vlc_WaitForSingleObject (HEV hev, ULONG ulTimeout)
 
static ULONG vlc_Sleep (ULONG ulTimeout)
 
int vlc_threadvar_create (vlc_threadvar_t *p_tls, void(*destr)(void *))
 Allocates a thread-specific variable. More...
 
void vlc_threadvar_delete (vlc_threadvar_t *p_tls)
 Deallocates a thread-specific variable. More...
 
int vlc_threadvar_set (vlc_threadvar_t key, void *value)
 Sets a thread-specific variable. More...
 
void * vlc_threadvar_get (vlc_threadvar_t key)
 Gets the value of a thread-local variable for the calling thread. More...
 
static void wait_bucket_init (void)
 
static void wait_bucket_destroy (void)
 
static struct wait_bucketwait_bucket_get (atomic_uint *addr)
 
static struct wait_bucketwait_bucket_enter (atomic_uint *addr)
 
static void wait_bucket_leave (void *data)
 
void vlc_atomic_wait (void *addr, unsigned value)
 Waits on an address. More...
 
int vlc_atomic_timedwait (void *addr, unsigned value, vlc_tick_t deadline)
 Waits on an address with a time-out. More...
 
int vlc_atomic_timedwait_daytime (void *addr, unsigned value, 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...
 
void vlc_threads_setup (libvlc_int_t *p_libvlc)
 
static void vlc_thread_cleanup (struct vlc_thread *th)
 
static void vlc_entry (void *p)
 
int vlc_clone (vlc_thread_t *p_handle, void *(*entry)(void *), void *data)
 Creates and starts a new thread. More...
 
void vlc_join (vlc_thread_t th, void **result)
 Waits for a thread to complete (if needed), then destroys it. More...
 
unsigned long vlc_thread_id (void)
 Thread identifier. More...
 
void() vlc_thread_set_name (const char *name)
 Set the thread name of the current thread. More...
 
void vlc_cancel (vlc_thread_t th)
 Marks a thread as cancelled. More...
 
int vlc_savecancel (void)
 Disables thread cancellation. More...
 
void vlc_restorecancel (int state)
 Restores the cancellation state. More...
 
void vlc_testcancel (void)
 Issues an explicit deferred cancellation point. More...
 
void vlc_control_cancel (vlc_cleanup_t *cleaner)
 Internal handler for thread cancellation. More...
 
static int vlc_select (int nfds, fd_set *rdset, fd_set *wrset, fd_set *exset, struct timeval *timeout)
 
 __declspec (dllexport)
 
vlc_tick_t vlc_tick_now (void)
 Precision monotonic clock. More...
 
void vlc_tick_wait (vlc_tick_t deadline)
 Waits until a deadline. More...
 
void vlc_tick_sleep (vlc_tick_t delay)
 Waits for an interval of time. More...
 
static void vlc_timer_do (void *arg)
 
int vlc_timer_create (vlc_timer_t *id, void(*func)(void *), void *data)
 Initializes an asynchronous timer. More...
 
void vlc_timer_destroy (vlc_timer_t timer)
 Destroys an initialized timer. More...
 
void vlc_timer_schedule (vlc_timer_t timer, bool absolute, vlc_tick_t value, vlc_tick_t interval)
 Arms or disarms an initialized timer. More...
 
unsigned vlc_timer_getoverrun (vlc_timer_t timer)
 Fetches and resets the overrun counter for a timer. More...
 
unsigned vlc_GetCPUCount (void)
 Count CPUs. More...
 
int _CRT_init (void)
 
void _CRT_term (void)
 
unsigned long _System _DLL_InitTerm (unsigned long, unsigned long)
 

Variables

static vlc_mutex_t super_mutex = { .value = ATOMIC_VAR_INIT(0), .recursion = ATOMIC_VAR_INIT(0), .owner = ATOMIC_VAR_INIT(0), }
 
static thread_local struct vlc_threadcurrent_thread_ctx = NULL
 
struct vlc_threadvarvlc_threadvar_last = NULL
 
static struct wait_bucket wait_buckets [32]
 

Macro Definition Documentation

◆ Q2LL

#define Q2LL (   q)    ( *( long long * )&( q ))

Function Documentation

◆ __declspec()

__declspec ( dllexport  )

◆ _CRT_init()

int _CRT_init ( void  )

Referenced by _DLL_InitTerm().

◆ _CRT_term()

void _CRT_term ( void  )

Referenced by _DLL_InitTerm().

◆ _DLL_InitTerm()

unsigned long _System _DLL_InitTerm ( unsigned long  hmod,
unsigned long  flag 
)

◆ 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.

Parameters
addraddress identifying which threads to wake up

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

◆ 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.

Parameters
addraddress identifying which threads may be woken up

References vlc_atomic_notify_all().

◆ 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.

Parameters
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, vlc_cleanup_pop, vlc_cleanup_push, vlc_testcancel(), VLC_TICK_FROM_MS, vlc_tick_now(), vlc_WaitForSingleObject(), wait_bucket::wait, wait_bucket_enter(), and wait_bucket_leave().

◆ vlc_atomic_timedwait_daytime()

int vlc_atomic_timedwait_daytime ( void *  addr,
unsigned  value,
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.

Parameters
addraddress to check for
valvalue to match at the address

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

◆ vlc_cancel_self()

static void vlc_cancel_self ( PVOID  dummy)
static

References vlc_thread::killed, and likely.

Referenced by vlc_DosWaitEventSemEx(), and vlc_testcancel().

◆ vlc_DosWaitEventSemEx()

static ULONG vlc_DosWaitEventSemEx ( HEV  hev,
ULONG  ulTimeout 
)
static

◆ vlc_entry()

◆ vlc_select()

static int vlc_select ( int  nfds,
fd_set *  rdset,
fd_set *  wrset,
fd_set *  exset,
struct timeval *  timeout 
)
static

◆ vlc_Sleep()

static ULONG vlc_Sleep ( ULONG  ulTimeout)
static

References vlc_DosWaitEventSemEx().

Referenced by vlc_tick_wait().

◆ vlc_thread_cleanup()

static void vlc_thread_cleanup ( struct vlc_thread th)
static

◆ vlc_threads_setup()

void vlc_threads_setup ( libvlc_int_t p_libvlc)

◆ vlc_timer_do()

static void vlc_timer_do ( void *  arg)
static

◆ vlc_WaitForSingleObject()

static ULONG vlc_WaitForSingleObject ( HEV  hev,
ULONG  ulTimeout 
)
static

◆ wait_bucket_destroy()

static void wait_bucket_destroy ( void  )
static

◆ wait_bucket_enter()

static struct wait_bucket * wait_bucket_enter ( atomic_uint *  addr)
static

◆ wait_bucket_get()

static struct wait_bucket * wait_bucket_get ( atomic_uint *  addr)
static

◆ wait_bucket_init()

static void wait_bucket_init ( void  )
static

◆ wait_bucket_leave()

static void wait_bucket_leave ( void *  data)
static

Variable Documentation

◆ current_thread_ctx

thread_local struct vlc_thread* current_thread_ctx = NULL
static

◆ super_mutex

vlc_mutex_t super_mutex = { .value = ATOMIC_VAR_INIT(0), .recursion = ATOMIC_VAR_INIT(0), .owner = ATOMIC_VAR_INIT(0), }
static

◆ vlc_threadvar_last

◆ wait_buckets

struct wait_bucket wait_buckets[ 32 ]
static