Blender V4.3
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
11#include <pthread.h>
12
13#include "BLI_sys_types.h"
14
15#ifdef __cplusplus
16extern "C" {
17#endif
18
20#define BLENDER_MAX_THREADS 1024
21
22struct ListBase;
23
24/* Threading API */
25
29void BLI_threadapi_init(void);
30void BLI_threadapi_exit(void);
31
36void BLI_threadpool_init(struct ListBase *threadbase, void *(*do_thread)(void *), int tot);
40int BLI_available_threads(struct ListBase *threadbase);
45void BLI_threadpool_insert(struct ListBase *threadbase, void *callerdata);
46void BLI_threadpool_remove(struct ListBase *threadbase, void *callerdata);
47void BLI_threadpool_remove_index(struct ListBase *threadbase, int index);
48void BLI_threadpool_clear(struct ListBase *threadbase);
49void BLI_threadpool_end(struct ListBase *threadbase);
50int BLI_thread_is_main(void);
51
52/* System Information */
53
60
66enum {
76};
77
78void BLI_thread_lock(int type);
79void BLI_thread_unlock(int type);
80
81/* Mutex Lock */
82
83typedef pthread_mutex_t ThreadMutex;
84#define BLI_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
85
88
91
95
96/* Spin Lock */
97
98/* By default we use TBB for spin lock on all platforms. When building without
99 * TBB fall-back to spin lock implementation which is native to the platform.
100 *
101 * On macOS we use mutex lock instead of spin since the spin lock has been
102 * deprecated in SDK 10.12 and is discouraged from use. */
103
104#ifdef WITH_TBB
105typedef uint32_t SpinLock;
106#elif defined(__APPLE__)
107typedef ThreadMutex SpinLock;
108#elif defined(_MSC_VER)
109typedef volatile unsigned int SpinLock;
110#else
111typedef pthread_spinlock_t SpinLock;
112#endif
113
118
119/* Read/Write Mutex Lock */
120
121#define THREAD_LOCK_READ 1
122#define THREAD_LOCK_WRITE 2
123
124#define BLI_RWLOCK_INITIALIZER PTHREAD_RWLOCK_INITIALIZER
125
126typedef pthread_rwlock_t ThreadRWMutex;
127
130
133
134void BLI_rw_mutex_lock(ThreadRWMutex *mutex, int mode);
136
137/* Ticket Mutex Lock
138 *
139 * This is a 'fair' mutex in that it will grant the lock to the first thread
140 * that requests it. */
141
143
149
150/* Condition */
151
152typedef pthread_cond_t ThreadCondition;
153
160
161/* ThreadWorkQueue
162 *
163 * Thread-safe work queue to push work/pointers between threads. */
164
166
169
170void BLI_thread_queue_push(ThreadQueue *queue, void *work);
172void *BLI_thread_queue_pop_timeout(ThreadQueue *queue, int ms);
175
178
179/* Thread local storage */
180
181#if defined(__APPLE__)
182# define ThreadLocal(type) pthread_key_t
183# define BLI_thread_local_create(name) pthread_key_create(&name, NULL)
184# define BLI_thread_local_delete(name) pthread_key_delete(name)
185# define BLI_thread_local_get(name) pthread_getspecific(name)
186# define BLI_thread_local_set(name, value) pthread_setspecific(name, value)
187#else /* defined(__APPLE__) */
188# ifdef _MSC_VER
189# define ThreadLocal(type) __declspec(thread) type
190# else
191# define ThreadLocal(type) __thread type
192# endif
193# define BLI_thread_local_create(name)
194# define BLI_thread_local_delete(name)
195# define BLI_thread_local_get(name) name
196# define BLI_thread_local_set(name, value) name = value
197#endif /* defined(__APPLE__) */
198
199#ifdef __cplusplus
200}
201#endif
void BLI_condition_notify_all(ThreadCondition *cond)
Definition threads.cc:597
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:511
void BLI_thread_queue_push(ThreadQueue *queue, void *work)
Definition threads.cc:644
ThreadRWMutex * BLI_rw_mutex_alloc(void)
Definition threads.cc:487
pthread_spinlock_t SpinLock
void * BLI_thread_queue_pop(ThreadQueue *queue)
Definition threads.cc:655
void BLI_thread_unlock(int type)
Definition threads.cc:333
void BLI_ticket_mutex_unlock(TicketMutex *ticket)
Definition threads.cc:564
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:618
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:559
void BLI_condition_wait(ThreadCondition *cond, ThreadMutex *mutex)
Definition threads.cc:582
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:587
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:602
int BLI_system_thread_count(void)
Definition threads.cc:253
void BLI_thread_queue_free(ThreadQueue *queue)
Definition threads.cc:632
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:554
void BLI_condition_notify_one(ThreadCondition *cond)
Definition threads.cc:592
bool BLI_thread_queue_is_empty(ThreadQueue *queue)
Definition threads.cc:759
void BLI_ticket_mutex_free(TicketMutex *ticket)
Definition threads.cc:522
int BLI_thread_is_main(void)
Definition threads.cc:179
void BLI_condition_init(ThreadCondition *cond)
Definition threads.cc:577
void BLI_mutex_lock(ThreadMutex *mutex)
Definition threads.cc:345
void BLI_thread_queue_nowait(ThreadQueue *queue)
Definition threads.cc:770
void BLI_thread_queue_wait_finish(ThreadQueue *queue)
Definition threads.cc:781
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:495
void BLI_threadpool_insert(struct ListBase *threadbase, void *callerdata)
Definition threads.cc:184
@ LOCK_NODES
Definition BLI_threads.h:71
@ LOCK_VIEW3D
Definition BLI_threads.h:75
@ LOCK_DRAW_IMAGE
Definition BLI_threads.h:68
@ LOCK_COLORMANAGE
Definition BLI_threads.h:73
@ LOCK_MOVIECLIP
Definition BLI_threads.h:72
@ LOCK_CUSTOM1
Definition BLI_threads.h:70
@ LOCK_IMAGE
Definition BLI_threads.h:67
@ LOCK_VIEWER
Definition BLI_threads.h:69
@ LOCK_FFTW
Definition BLI_threads.h:74
void BLI_rw_mutex_unlock(ThreadRWMutex *mutex)
Definition threads.cc:477
pthread_mutex_t ThreadMutex
Definition BLI_threads.h:83
void BLI_spin_end(SpinLock *spin)
Definition threads.cc:445
void * BLI_thread_queue_pop_timeout(ThreadQueue *queue, int ms)
Definition threads.cc:714
int BLI_thread_queue_len(ThreadQueue *queue)
Definition threads.cc:748
ThreadMutex mutex
static SpinLock spin
Definition cachefile.cc:154
unsigned int uint32_t
Definition stdint.h:80
pthread_cond_t cond
Definition threads.cc:504