Cleanup: remove redundant doxygen \file argument
[blender.git] / source / blender / blenlib / BLI_threads.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2006 Blender Foundation.
17  * All rights reserved.
18  */
19
20 #ifndef __BLI_THREADS_H__
21 #define __BLI_THREADS_H__
22
23 /** \file \ingroup bli
24  */
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28
29 #include <pthread.h>
30
31 #ifdef __APPLE__
32 #include <libkern/OSAtomic.h>
33 #endif
34
35 /* for tables, button in UI, etc */
36 #define BLENDER_MAX_THREADS     1024
37
38 struct ListBase;
39 struct TaskScheduler;
40
41 /* Threading API */
42
43 /*this is run once at startup*/
44 void BLI_threadapi_init(void);
45 void BLI_threadapi_exit(void);
46
47 struct TaskScheduler *BLI_task_scheduler_get(void);
48
49 void    BLI_threadpool_init(struct ListBase *threadbase, void *(*do_thread)(void *), int tot);
50 int     BLI_available_threads(struct ListBase *threadbase);
51 int     BLI_threadpool_available_thread_index(struct ListBase *threadbase);
52 void    BLI_threadpool_insert(struct ListBase *threadbase, void *callerdata);
53 void    BLI_threadpool_remove(struct ListBase *threadbase, void *callerdata);
54 void    BLI_threadpool_remove_index(struct ListBase *threadbase, int index);
55 void    BLI_threadpool_clear(struct ListBase *threadbase);
56 void    BLI_threadpool_end(struct ListBase *threadbase);
57 int     BLI_thread_is_main(void);
58
59
60 void BLI_threaded_malloc_begin(void);
61 void BLI_threaded_malloc_end(void);
62
63 /* System Information */
64
65 int     BLI_system_thread_count(void); /* gets the number of threads the system can make use of */
66 void    BLI_system_num_threads_override_set(int num);
67 int     BLI_system_num_threads_override_get(void);
68
69 /* Global Mutex Locks
70  *
71  * One custom lock available now. can be extended. */
72
73 #define LOCK_IMAGE      0
74 #define LOCK_DRAW_IMAGE 1
75 #define LOCK_VIEWER     2
76 #define LOCK_CUSTOM1    3
77 #define LOCK_RCACHE     4
78 #define LOCK_OPENGL     5
79 #define LOCK_NODES      6
80 #define LOCK_MOVIECLIP  7
81 #define LOCK_COLORMANAGE 8
82 #define LOCK_FFTW       9
83 #define LOCK_VIEW3D     10
84
85 void    BLI_thread_lock(int type);
86 void    BLI_thread_unlock(int type);
87
88 /* Mutex Lock */
89
90 typedef pthread_mutex_t ThreadMutex;
91 #define BLI_MUTEX_INITIALIZER   PTHREAD_MUTEX_INITIALIZER
92
93 void BLI_mutex_init(ThreadMutex *mutex);
94 void BLI_mutex_end(ThreadMutex *mutex);
95
96 ThreadMutex *BLI_mutex_alloc(void);
97 void BLI_mutex_free(ThreadMutex *mutex);
98
99 void BLI_mutex_lock(ThreadMutex *mutex);
100 bool BLI_mutex_trylock(ThreadMutex *mutex);
101 void BLI_mutex_unlock(ThreadMutex *mutex);
102
103 /* Spin Lock */
104
105 #if defined(__APPLE__)
106 typedef OSSpinLock SpinLock;
107 #elif defined(_MSC_VER)
108 typedef volatile int SpinLock;
109 #else
110 typedef pthread_spinlock_t SpinLock;
111 #endif
112
113 void BLI_spin_init(SpinLock *spin);
114 void BLI_spin_lock(SpinLock *spin);
115 void BLI_spin_unlock(SpinLock *spin);
116 void BLI_spin_end(SpinLock *spin);
117
118 /* Read/Write Mutex Lock */
119
120 #define THREAD_LOCK_READ    1
121 #define THREAD_LOCK_WRITE   2
122
123 #define BLI_RWLOCK_INITIALIZER PTHREAD_RWLOCK_INITIALIZER
124
125 typedef pthread_rwlock_t ThreadRWMutex;
126
127 void BLI_rw_mutex_init(ThreadRWMutex *mutex);
128 void BLI_rw_mutex_end(ThreadRWMutex *mutex);
129
130 ThreadRWMutex *BLI_rw_mutex_alloc(void);
131 void BLI_rw_mutex_free(ThreadRWMutex *mutex);
132
133 void BLI_rw_mutex_lock(ThreadRWMutex *mutex, int mode);
134 void BLI_rw_mutex_unlock(ThreadRWMutex *mutex);
135
136 /* Ticket Mutex Lock
137  *
138  * This is a 'fair' mutex in that it will grant the lock to the first thread
139  * that requests it. */
140
141 typedef struct TicketMutex TicketMutex;
142
143 TicketMutex *BLI_ticket_mutex_alloc(void);
144 void BLI_ticket_mutex_free(TicketMutex *ticket);
145 void BLI_ticket_mutex_lock(TicketMutex *ticket);
146 void BLI_ticket_mutex_unlock(TicketMutex *ticket);
147
148 /* Condition */
149
150 typedef pthread_cond_t ThreadCondition;
151
152 void BLI_condition_init(ThreadCondition *cond);
153 void BLI_condition_wait(ThreadCondition *cond, ThreadMutex *mutex);
154 void BLI_condition_wait_global_mutex(ThreadCondition *cond, const int type);
155 void BLI_condition_notify_one(ThreadCondition *cond);
156 void BLI_condition_notify_all(ThreadCondition *cond);
157 void BLI_condition_end(ThreadCondition *cond);
158
159 /* ThreadWorkQueue
160  *
161  * Thread-safe work queue to push work/pointers between threads. */
162
163 typedef struct ThreadQueue ThreadQueue;
164
165 ThreadQueue *BLI_thread_queue_init(void);
166 void BLI_thread_queue_free(ThreadQueue *queue);
167
168 void BLI_thread_queue_push(ThreadQueue *queue, void *work);
169 void *BLI_thread_queue_pop(ThreadQueue *queue);
170 void *BLI_thread_queue_pop_timeout(ThreadQueue *queue, int ms);
171 int BLI_thread_queue_len(ThreadQueue *queue);
172 bool BLI_thread_queue_is_empty(ThreadQueue *queue);
173
174 void BLI_thread_queue_wait_finish(ThreadQueue *queue);
175 void BLI_thread_queue_nowait(ThreadQueue *queue);
176
177
178 /* Thread local storage */
179
180 #if defined(__APPLE__)
181 #  define ThreadLocal(type) pthread_key_t
182 #  define BLI_thread_local_create(name) pthread_key_create(&name, NULL)
183 #  define BLI_thread_local_delete(name) pthread_key_delete(name)
184 #  define BLI_thread_local_get(name) pthread_getspecific(name)
185 #  define BLI_thread_local_set(name, value) pthread_setspecific(name, value)
186 #else  /* defined(__APPLE__) */
187 #  ifdef _MSC_VER
188 #    define ThreadLocal(type) __declspec(thread) type
189 #  else
190 #    define ThreadLocal(type) __thread type
191 #  endif
192 #  define BLI_thread_local_create(name)
193 #  define BLI_thread_local_delete(name)
194 #  define BLI_thread_local_get(name) name
195 #  define BLI_thread_local_set(name, value) name = value
196 #endif  /* defined(__APPLE__) */
197
198 /* **** Special functions to help performance on crazy NUMA setups. **** */
199
200 /* Make sure process/thread is using NUMA node with fast memory access. */
201 void BLI_thread_put_process_on_fast_node(void);
202 void BLI_thread_put_thread_on_fast_node(void);
203
204 #ifdef __cplusplus
205 }
206 #endif
207
208 #endif