Blame docs/src/threading.rst

Packit Service 7c31a4
Packit Service 7c31a4
.. _threading:
Packit Service 7c31a4
Packit Service 7c31a4
Threading and synchronization utilities
Packit Service 7c31a4
=======================================
Packit Service 7c31a4
Packit Service 7c31a4
libuv provides cross-platform implementations for multiple threading and
Packit Service 7c31a4
synchronization primitives. The API largely follows the pthreads API.
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
Data types
Packit Service 7c31a4
----------
Packit Service 7c31a4
Packit Service 7c31a4
.. c:type:: uv_thread_t
Packit Service 7c31a4
Packit Service 7c31a4
    Thread data type.
Packit Service 7c31a4
Packit Service 7c31a4
.. c:type:: void (*uv_thread_cb)(void* arg)
Packit Service 7c31a4
Packit Service 7c31a4
    Callback that is invoked to initialize thread execution. `arg` is the same
Packit Service 7c31a4
    value that was passed to :c:func:`uv_thread_create`.
Packit Service 7c31a4
Packit Service 7c31a4
.. c:type:: uv_key_t
Packit Service 7c31a4
Packit Service 7c31a4
    Thread-local key data type.
Packit Service 7c31a4
Packit Service 7c31a4
.. c:type:: uv_once_t
Packit Service 7c31a4
Packit Service 7c31a4
    Once-only initializer data type.
Packit Service 7c31a4
Packit Service 7c31a4
.. c:type:: uv_mutex_t
Packit Service 7c31a4
Packit Service 7c31a4
    Mutex data type.
Packit Service 7c31a4
Packit Service 7c31a4
.. c:type:: uv_rwlock_t
Packit Service 7c31a4
Packit Service 7c31a4
    Read-write lock data type.
Packit Service 7c31a4
Packit Service 7c31a4
.. c:type:: uv_sem_t
Packit Service 7c31a4
Packit Service 7c31a4
    Semaphore data type.
Packit Service 7c31a4
Packit Service 7c31a4
.. c:type:: uv_cond_t
Packit Service 7c31a4
Packit Service 7c31a4
    Condition data type.
Packit Service 7c31a4
Packit Service 7c31a4
.. c:type:: uv_barrier_t
Packit Service 7c31a4
Packit Service 7c31a4
    Barrier data type.
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
API
Packit Service 7c31a4
---
Packit Service 7c31a4
Packit Service 7c31a4
Threads
Packit Service 7c31a4
^^^^^^^
Packit Service 7c31a4
Packit Service 7c31a4
.. c:type:: uv_thread_options_t
Packit Service 7c31a4
Packit Service 7c31a4
    Options for spawning a new thread (passed to :c:func:`uv_thread_create_ex`).
Packit Service 7c31a4
Packit Service 7c31a4
    ::
Packit Service 7c31a4
Packit Service 7c31a4
        typedef struct uv_thread_options_s {
Packit Service 7c31a4
          enum {
Packit Service 7c31a4
            UV_THREAD_NO_FLAGS = 0x00,
Packit Service 7c31a4
            UV_THREAD_HAS_STACK_SIZE = 0x01
Packit Service 7c31a4
          } flags;
Packit Service 7c31a4
          size_t stack_size;
Packit Service 7c31a4
        } uv_thread_options_t;
Packit Service 7c31a4
Packit Service 7c31a4
    More fields may be added to this struct at any time, so its exact
Packit Service 7c31a4
    layout and size should not be relied upon.
Packit Service 7c31a4
Packit Service 7c31a4
    .. versionadded:: 1.26.0
Packit Service 7c31a4
Packit Service 7c31a4
.. c:function:: int uv_thread_create(uv_thread_t* tid, uv_thread_cb entry, void* arg)
Packit Service 7c31a4
Packit Service 7c31a4
    .. versionchanged:: 1.4.1 returns a UV_E* error code on failure
Packit Service 7c31a4
Packit Service 7c31a4
.. c:function:: int uv_thread_create_ex(uv_thread_t* tid, const uv_thread_options_t* params, uv_thread_cb entry, void* arg)
Packit Service 7c31a4
Packit Service 7c31a4
    Like :c:func:`uv_thread_create`, but additionally specifies options for creating a new thread.
Packit Service 7c31a4
Packit Service 7c31a4
    If `UV_THREAD_HAS_STACK_SIZE` is set, `stack_size` specifies a stack size for the new thread.
Packit Service 7c31a4
    `0` indicates that the default value should be used, i.e. behaves as if the flag was not set.
Packit Service 7c31a4
    Other values will be rounded up to the nearest page boundary.
Packit Service 7c31a4
Packit Service 7c31a4
    .. versionadded:: 1.26.0
Packit Service 7c31a4
Packit Service 7c31a4
.. c:function:: uv_thread_t uv_thread_self(void)
Packit Service 7c31a4
.. c:function:: int uv_thread_join(uv_thread_t *tid)
Packit Service 7c31a4
.. c:function:: int uv_thread_equal(const uv_thread_t* t1, const uv_thread_t* t2)
Packit Service 7c31a4
Packit Service 7c31a4
Thread-local storage
Packit Service 7c31a4
^^^^^^^^^^^^^^^^^^^^
Packit Service 7c31a4
Packit Service 7c31a4
.. note::
Packit Service 7c31a4
    The total thread-local storage size may be limited. That is, it may not be possible to
Packit Service 7c31a4
    create many TLS keys.
Packit Service 7c31a4
Packit Service 7c31a4
.. c:function:: int uv_key_create(uv_key_t* key)
Packit Service 7c31a4
.. c:function:: void uv_key_delete(uv_key_t* key)
Packit Service 7c31a4
.. c:function:: void* uv_key_get(uv_key_t* key)
Packit Service 7c31a4
.. c:function:: void uv_key_set(uv_key_t* key, void* value)
Packit Service 7c31a4
Packit Service 7c31a4
Once-only initialization
Packit Service 7c31a4
^^^^^^^^^^^^^^^^^^^^^^^^
Packit Service 7c31a4
Packit Service 7c31a4
Runs a function once and only once. Concurrent calls to :c:func:`uv_once` with the
Packit Service 7c31a4
same guard will block all callers except one (it's unspecified which one).
Packit Service 7c31a4
The guard should be initialized statically with the UV_ONCE_INIT macro.
Packit Service 7c31a4
Packit Service 7c31a4
.. c:function:: void uv_once(uv_once_t* guard, void (*callback)(void))
Packit Service 7c31a4
Packit Service 7c31a4
Mutex locks
Packit Service 7c31a4
^^^^^^^^^^^
Packit Service 7c31a4
Packit Service 7c31a4
Functions return 0 on success or an error code < 0 (unless the
Packit Service 7c31a4
return type is void, of course).
Packit Service 7c31a4
Packit Service 7c31a4
.. c:function:: int uv_mutex_init(uv_mutex_t* handle)
Packit Service 7c31a4
.. c:function:: int uv_mutex_init_recursive(uv_mutex_t* handle)
Packit Service 7c31a4
.. c:function:: void uv_mutex_destroy(uv_mutex_t* handle)
Packit Service 7c31a4
.. c:function:: void uv_mutex_lock(uv_mutex_t* handle)
Packit Service 7c31a4
.. c:function:: int uv_mutex_trylock(uv_mutex_t* handle)
Packit Service 7c31a4
.. c:function:: void uv_mutex_unlock(uv_mutex_t* handle)
Packit Service 7c31a4
Packit Service 7c31a4
Read-write locks
Packit Service 7c31a4
^^^^^^^^^^^^^^^^
Packit Service 7c31a4
Packit Service 7c31a4
Functions return 0 on success or an error code < 0 (unless the
Packit Service 7c31a4
return type is void, of course).
Packit Service 7c31a4
Packit Service 7c31a4
.. c:function:: int uv_rwlock_init(uv_rwlock_t* rwlock)
Packit Service 7c31a4
.. c:function:: void uv_rwlock_destroy(uv_rwlock_t* rwlock)
Packit Service 7c31a4
.. c:function:: void uv_rwlock_rdlock(uv_rwlock_t* rwlock)
Packit Service 7c31a4
.. c:function:: int uv_rwlock_tryrdlock(uv_rwlock_t* rwlock)
Packit Service 7c31a4
.. c:function:: void uv_rwlock_rdunlock(uv_rwlock_t* rwlock)
Packit Service 7c31a4
.. c:function:: void uv_rwlock_wrlock(uv_rwlock_t* rwlock)
Packit Service 7c31a4
.. c:function:: int uv_rwlock_trywrlock(uv_rwlock_t* rwlock)
Packit Service 7c31a4
.. c:function:: void uv_rwlock_wrunlock(uv_rwlock_t* rwlock)
Packit Service 7c31a4
Packit Service 7c31a4
Semaphores
Packit Service 7c31a4
^^^^^^^^^^
Packit Service 7c31a4
Packit Service 7c31a4
Functions return 0 on success or an error code < 0 (unless the
Packit Service 7c31a4
return type is void, of course).
Packit Service 7c31a4
Packit Service 7c31a4
.. c:function:: int uv_sem_init(uv_sem_t* sem, unsigned int value)
Packit Service 7c31a4
.. c:function:: void uv_sem_destroy(uv_sem_t* sem)
Packit Service 7c31a4
.. c:function:: void uv_sem_post(uv_sem_t* sem)
Packit Service 7c31a4
.. c:function:: void uv_sem_wait(uv_sem_t* sem)
Packit Service 7c31a4
.. c:function:: int uv_sem_trywait(uv_sem_t* sem)
Packit Service 7c31a4
Packit Service 7c31a4
Conditions
Packit Service 7c31a4
^^^^^^^^^^
Packit Service 7c31a4
Packit Service 7c31a4
Functions return 0 on success or an error code < 0 (unless the
Packit Service 7c31a4
return type is void, of course).
Packit Service 7c31a4
Packit Service 7c31a4
.. note::
Packit Service 7c31a4
    1. Callers should be prepared to deal with spurious wakeups on :c:func:`uv_cond_wait`
Packit Service 7c31a4
       and :c:func:`uv_cond_timedwait`.
Packit Service 7c31a4
    2. The timeout parameter for :c:func:`uv_cond_timedwait` is relative to the time
Packit Service 7c31a4
       at which function is called.
Packit Service 7c31a4
    3. On z/OS, the timeout parameter for :c:func:`uv_cond_timedwait` is converted to an
Packit Service 7c31a4
       absolute system time at which the wait expires. If the current system clock time
Packit Service 7c31a4
       passes the absolute time calculated before the condition is signaled, an ETIMEDOUT
Packit Service 7c31a4
       error results. After the wait begins, the wait time is not affected by changes
Packit Service 7c31a4
       to the system clock.
Packit Service 7c31a4
Packit Service 7c31a4
.. c:function:: int uv_cond_init(uv_cond_t* cond)
Packit Service 7c31a4
.. c:function:: void uv_cond_destroy(uv_cond_t* cond)
Packit Service 7c31a4
.. c:function:: void uv_cond_signal(uv_cond_t* cond)
Packit Service 7c31a4
.. c:function:: void uv_cond_broadcast(uv_cond_t* cond)
Packit Service 7c31a4
.. c:function:: void uv_cond_wait(uv_cond_t* cond, uv_mutex_t* mutex)
Packit Service 7c31a4
.. c:function:: int uv_cond_timedwait(uv_cond_t* cond, uv_mutex_t* mutex, uint64_t timeout)
Packit Service 7c31a4
Packit Service 7c31a4
Barriers
Packit Service 7c31a4
^^^^^^^^
Packit Service 7c31a4
Packit Service 7c31a4
Functions return 0 on success or an error code < 0 (unless the
Packit Service 7c31a4
return type is void, of course).
Packit Service 7c31a4
Packit Service 7c31a4
.. note::
Packit Service 7c31a4
    :c:func:`uv_barrier_wait` returns a value > 0 to an arbitrarily chosen "serializer" thread
Packit Service 7c31a4
    to facilitate cleanup, i.e.
Packit Service 7c31a4
Packit Service 7c31a4
    ::
Packit Service 7c31a4
Packit Service 7c31a4
        if (uv_barrier_wait(&barrier) > 0)
Packit Service 7c31a4
            uv_barrier_destroy(&barrier);
Packit Service 7c31a4
Packit Service 7c31a4
.. c:function:: int uv_barrier_init(uv_barrier_t* barrier, unsigned int count)
Packit Service 7c31a4
.. c:function:: void uv_barrier_destroy(uv_barrier_t* barrier)
Packit Service 7c31a4
.. c:function:: int uv_barrier_wait(uv_barrier_t* barrier)