Blender V5.0
BLI_threads.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2006 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
10
11#include <pthread.h>
12
13#include "BLI_sys_types.h"
14
16#define BLENDER_MAX_THREADS 1024
17
18struct ListBase;
19
20/* Threading API */
21
25void BLI_threadapi_init(void);
26void BLI_threadapi_exit(void);
27
32void BLI_threadpool_init(struct ListBase *threadbase, void *(*do_thread)(void *), int tot);
36int BLI_available_threads(struct ListBase *threadbase);
41void BLI_threadpool_insert(struct ListBase *threadbase, void *callerdata);
42void BLI_threadpool_remove(struct ListBase *threadbase, void *callerdata);
43void BLI_threadpool_remove_index(struct ListBase *threadbase, int index);
44void BLI_threadpool_clear(struct ListBase *threadbase);
45void BLI_threadpool_end(struct ListBase *threadbase);
46int BLI_thread_is_main(void);
47
48/* System Information */
49
56
62enum {
72};
73
74void BLI_thread_lock(int type);
75void BLI_thread_unlock(int type);
76
77/* Mutex Lock */
78
79typedef pthread_mutex_t ThreadMutex;
80#define BLI_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
81
84
87
91
92/* Spin Lock */
93
94/* By default we use TBB for spin lock on all platforms. When building without
95 * TBB fall-back to spin lock implementation which is native to the platform.
96 *
97 * On macOS we use mutex lock instead of spin since the spin lock has been
98 * deprecated in SDK 10.12 and is discouraged from use. */
99
100#ifdef WITH_TBB
101typedef uint32_t SpinLock;
102#elif defined(__APPLE__)
103typedef ThreadMutex SpinLock;
104#elif defined(_MSC_VER)
105typedef volatile unsigned int SpinLock;
106#else
107typedef pthread_spinlock_t SpinLock;
108#endif
109
110void BLI_spin_init(SpinLock *spin);
111void BLI_spin_lock(SpinLock *spin);
112void BLI_spin_unlock(SpinLock *spin);
113void BLI_spin_end(SpinLock *spin);
114
115/* Read/Write Mutex Lock */
116
117#define THREAD_LOCK_READ 1
118#define THREAD_LOCK_WRITE 2
119
120#define BLI_RWLOCK_INITIALIZER PTHREAD_RWLOCK_INITIALIZER
121
122typedef pthread_rwlock_t ThreadRWMutex;
123
126
129
130void BLI_rw_mutex_lock(ThreadRWMutex *mutex, int mode);
132
133/* Ticket Mutex Lock
134 *
135 * This is a 'fair' mutex in that it will grant the lock to the first thread
136 * that requests it. */
137
139
145
146/* Condition */
147
148typedef pthread_cond_t ThreadCondition;
149
156
157/* ThreadWorkQueue
158 *
159 * Thread-safe work queue to push work/pointers between threads. */
160
162
168
173
179
189
194
203
211void *BLI_thread_queue_pop_timeout(ThreadQueue *queue, int ms);
212
217
222
227
233
234/* Thread local storage */
235
236#if defined(__APPLE__)
237# define ThreadLocal(type) pthread_key_t
238# define BLI_thread_local_create(name) pthread_key_create(&name, NULL)
239# define BLI_thread_local_delete(name) pthread_key_delete(name)
240# define BLI_thread_local_get(name) pthread_getspecific(name)
241# define BLI_thread_local_set(name, value) pthread_setspecific(name, value)
242#else /* defined(__APPLE__) */
243# ifdef _MSC_VER
244# define ThreadLocal(type) __declspec(thread) type
245# else
246# define ThreadLocal(type) __thread type
247# endif
248# define BLI_thread_local_create(name)
249# define BLI_thread_local_delete(name)
250# define BLI_thread_local_get(name) name
251# define BLI_thread_local_set(name, value) name = value
252#endif /* defined(__APPLE__) */
ATTR_WARN_UNUSED_RESULT const size_t num
void BLI_condition_notify_all(ThreadCondition *cond)
Definition threads.cc:595
ThreadQueueWorkPriority
@ BLI_THREAD_QUEUE_WORK_PRIORITY_LOW
@ BLI_THREAD_QUEUE_WORK_PRIORITY_HIGH
@ BLI_THREAD_QUEUE_WORK_PRIORITY_NORMAL
void BLI_thread_queue_cancel_work(ThreadQueue *queue, uint64_t work_id)
Definition threads.cc:684
bool BLI_mutex_trylock(ThreadMutex *mutex)
Definition threads.cc:355
void BLI_rw_mutex_end(ThreadRWMutex *mutex)
Definition threads.cc:482
TicketMutex * BLI_ticket_mutex_alloc(void)
Definition threads.cc:510
ThreadRWMutex * BLI_rw_mutex_alloc(void)
Definition threads.cc:487
pthread_spinlock_t SpinLock
void * BLI_thread_queue_pop(ThreadQueue *queue)
Definition threads.cc:712
void BLI_thread_unlock(int type)
Definition threads.cc:333
void BLI_ticket_mutex_unlock(TicketMutex *ticket)
Definition threads.cc:562
void BLI_mutex_end(ThreadMutex *mutex)
Definition threads.cc:360
void BLI_mutex_free(ThreadMutex *mutex)
Definition threads.cc:372
ThreadQueue * BLI_thread_queue_init(void)
Definition threads.cc:624
pthread_rwlock_t ThreadRWMutex
void BLI_thread_lock(int type)
Definition threads.cc:328
void BLI_threadpool_remove(struct ListBase *threadbase, void *callerdata)
Definition threads.cc:197
void BLI_threadapi_init(void)
Definition threads.cc:114
ThreadMutex * BLI_mutex_alloc(void)
Definition threads.cc:365
bool BLI_ticket_mutex_lock_check_recursive(TicketMutex *ticket)
Definition threads.cc:557
void BLI_condition_wait(ThreadCondition *cond, ThreadMutex *mutex)
Definition threads.cc:580
void BLI_threadpool_init(struct ListBase *threadbase, void *(*do_thread)(void *), int tot)
Definition threads.cc:121
void BLI_condition_wait_global_mutex(ThreadCondition *cond, int type)
Definition threads.cc:585
void BLI_mutex_init(ThreadMutex *mutex)
Definition threads.cc:340
void BLI_system_num_threads_override_set(int num)
Definition threads.cc:289
pthread_cond_t ThreadCondition
void BLI_condition_end(ThreadCondition *cond)
Definition threads.cc:600
int BLI_system_thread_count(void)
Definition threads.cc:253
void BLI_thread_queue_free(ThreadQueue *queue)
Definition threads.cc:635
int BLI_system_num_threads_override_get(void)
Definition threads.cc:294
void BLI_threadapi_exit(void)
Definition threads.cc:119
void BLI_threadpool_end(struct ListBase *threadbase)
Definition threads.cc:234
void BLI_rw_mutex_lock(ThreadRWMutex *mutex, int mode)
Definition threads.cc:467
void BLI_ticket_mutex_lock(TicketMutex *ticket)
Definition threads.cc:552
void BLI_condition_notify_one(ThreadCondition *cond)
Definition threads.cc:590
bool BLI_thread_queue_is_empty(ThreadQueue *queue)
Definition threads.cc:839
void BLI_ticket_mutex_free(TicketMutex *ticket)
Definition threads.cc:520
uint64_t BLI_thread_queue_push(ThreadQueue *queue, void *work, ThreadQueueWorkPriority priority)
Definition threads.cc:645
int BLI_thread_is_main(void)
Definition threads.cc:179
void BLI_condition_init(ThreadCondition *cond)
Definition threads.cc:575
void BLI_mutex_lock(ThreadMutex *mutex)
Definition threads.cc:345
void BLI_thread_queue_nowait(ThreadQueue *queue)
Definition threads.cc:851
void BLI_thread_queue_wait_finish(ThreadQueue *queue)
Definition threads.cc:862
void BLI_mutex_unlock(ThreadMutex *mutex)
Definition threads.cc:350
void BLI_rw_mutex_init(ThreadRWMutex *mutex)
Definition threads.cc:462
void BLI_threadpool_remove_index(struct ListBase *threadbase, int index)
Definition threads.cc:208
void BLI_threadpool_clear(struct ListBase *threadbase)
Definition threads.cc:223
int BLI_available_threads(struct ListBase *threadbase)
Definition threads.cc:146
int BLI_threadpool_available_thread_index(struct ListBase *threadbase)
Definition threads.cc:159
void BLI_spin_init(SpinLock *spin)
Definition threads.cc:391
void BLI_spin_unlock(SpinLock *spin)
Definition threads.cc:430
void BLI_spin_lock(SpinLock *spin)
Definition threads.cc:405
void BLI_rw_mutex_free(ThreadRWMutex *mutex)
Definition threads.cc:494
void BLI_threadpool_insert(struct ListBase *threadbase, void *callerdata)
Definition threads.cc:184
void BLI_rw_mutex_unlock(ThreadRWMutex *mutex)
Definition threads.cc:477
@ LOCK_NODES
Definition BLI_threads.h:67
@ LOCK_VIEW3D
Definition BLI_threads.h:71
@ LOCK_DRAW_IMAGE
Definition BLI_threads.h:64
@ LOCK_COLORMANAGE
Definition BLI_threads.h:69
@ LOCK_MOVIECLIP
Definition BLI_threads.h:68
@ LOCK_CUSTOM1
Definition BLI_threads.h:66
@ LOCK_IMAGE
Definition BLI_threads.h:63
@ LOCK_VIEWER
Definition BLI_threads.h:65
@ LOCK_FFTW
Definition BLI_threads.h:70
pthread_mutex_t ThreadMutex
Definition BLI_threads.h:79
void BLI_spin_end(SpinLock *spin)
Definition threads.cc:445
void * BLI_thread_queue_pop_timeout(ThreadQueue *queue, int ms)
Definition threads.cc:782
int BLI_thread_queue_len(ThreadQueue *queue)
Definition threads.cc:827
unsigned long long int uint64_t
ThreadMutex mutex
pthread_cond_t cond
Definition threads.cc:503