DarkPlaces
Game engine based on the Quake 1 engine by id Software, developed by LadyHavoc
 
taskqueue.h File Reference
#include <stddef.h>
#include "qtypes.h"
+ Include dependency graph for taskqueue.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  taskqueue_task_t
 

Functions

void TaskQueue_Enqueue (int numtasks, taskqueue_task_t *tasks)
 
void TaskQueue_Frame (qbool shutdown)
 
void TaskQueue_Init (void)
 
qbool TaskQueue_IsDone (taskqueue_task_t *t)
 
void TaskQueue_Setup (taskqueue_task_t *t, taskqueue_task_t *preceding, void(*func)(taskqueue_task_t *), size_t i0, size_t i1, void *p0, void *p1)
 
void TaskQueue_Shutdown (void)
 
void TaskQueue_Task_CheckTasksDone (taskqueue_task_t *t)
 
void TaskQueue_WaitForTaskDone (taskqueue_task_t *t)
 
void TaskQueue_Yield (taskqueue_task_t *t)
 

Function Documentation

◆ TaskQueue_Enqueue()

void TaskQueue_Enqueue ( int numtasks,
taskqueue_task_t * tasks )

Definition at line 105 of file taskqueue.c.

106{
107 int i;
112 {
113 // we have to grow the queue...
114 unsigned int newsize = (taskqueue_state.queue_size + numtasks) * 2;
115 if (newsize < 1024)
116 newsize = 1024;
118 taskqueue_state.queue_size = newsize;
119 }
120 for (i = 0; i < numtasks; i++)
121 {
122 if (tasks[i].yieldcount == 0)
128 }
130}
int i
unsigned int tasks_thisframe
Definition taskqueue.c:46
unsigned int queue_enqueueposition
Definition taskqueue.c:38
taskqueue_task_t ** queue_data
Definition taskqueue.c:41
Thread_SpinLock command_lock
Definition taskqueue.c:35
unsigned int queue_size
Definition taskqueue.c:40
unsigned int queue_dequeueposition
Definition taskqueue.c:39
static taskqueue_state_t taskqueue_state
Definition taskqueue.c:51
#define Thread_AtomicUnlock(lock)
Definition thread.h:36
#define Thread_AtomicLock(lock)
Definition thread.h:35
mempool_t * zonemempool
Definition zone.c:796
#define Mem_Realloc(pool, data, size)
Definition zone.h:94

References taskqueue_state_t::command_lock, i, Mem_Realloc, taskqueue_state_t::queue_data, taskqueue_state_t::queue_dequeueposition, taskqueue_state_t::queue_enqueueposition, taskqueue_state_t::queue_size, taskqueue_state, taskqueue_state_t::tasks_thisframe, Thread_AtomicLock, Thread_AtomicUnlock, and zonemempool.

Referenced by R_Shadow_BounceGrid_EnqueuePhotons_Task(), R_Shadow_BounceGrid_EnqueueSlices_Task(), R_Shadow_UpdateBounceGridTexture(), and TaskQueue_Yield().

◆ TaskQueue_Frame()

void TaskQueue_Frame ( qbool shutdown)

Definition at line 213 of file taskqueue.c.

214{
215 int i;
216 unsigned long long int avg;
217 int maxthreads = bound(0, taskqueue_maxthreads.integer, MAXTHREADS);
218 int numthreads = maxthreads;
219 int tasksperthread = bound(10, taskqueue_tasksperthread.integer, 100000);
220#ifdef THREADDISABLE
221 numthreads = 0;
222#endif
223
228 avg = 0;
229 for (i = 0; i < RECENTFRAMES; i++)
233
234 numthreads = taskqueue_state.tasks_averageperframe / tasksperthread;
236
237 if (shutdown)
238 numthreads = 0;
239
240 // check if we need to close some threads
241 if (taskqueue_state.numthreads > numthreads)
242 {
243 // tell extra threads to quit
245 for (i = numthreads; i < taskqueue_state.numthreads; i++)
248 for (i = numthreads; i < taskqueue_state.numthreads; i++)
249 {
253 }
254 // okay we're at the new state now
255 taskqueue_state.numthreads = numthreads;
256 }
257
258 // check if we need to start more threads
259 if (taskqueue_state.numthreads < numthreads)
260 {
261 // make sure we're not telling new threads to just quit on startup
263 for (i = taskqueue_state.numthreads; i < numthreads; i++)
266
267 // start new threads
268 for (i = taskqueue_state.numthreads; i < numthreads; i++)
269 {
272 }
273
274 // okay we're at the new state now
275 taskqueue_state.numthreads = numthreads;
276 }
277
278 // just for good measure, distribute any pending tasks that span across frames
280}
#define bound(min, num, max)
Definition mathlib.h:34
#define NULL
Definition qtypes.h:12
int integer
Definition cvar.h:73
unsigned int tasks_averageperframe
Definition taskqueue.c:47
taskqueue_state_thread_t threads[MAXTHREADS]
Definition taskqueue.c:32
unsigned int tasks_recentframes[RECENTFRAMES]
Definition taskqueue.c:45
unsigned int tasks_recentframesindex
Definition taskqueue.c:44
unsigned int thread_index
Definition taskqueue.c:18
cvar_t taskqueue_minthreads
Definition taskqueue.c:4
static int TaskQueue_ThreadFunc(void *d)
Definition taskqueue.c:77
cvar_t taskqueue_maxthreads
Definition taskqueue.c:5
#define RECENTFRAMES
Definition taskqueue.c:9
#define MAXTHREADS
Definition taskqueue.c:8
static void TaskQueue_DistributeTasks(void)
Definition taskqueue.c:144
cvar_t taskqueue_tasksperthread
Definition taskqueue.c:6
#define Thread_WaitThread(thread, retval)
Definition thread.h:25
#define Thread_CreateThread(fn, data)
Definition thread.h:24

References bound, taskqueue_state_t::command_lock, taskqueue_state_thread_t::handle, i, cvar_t::integer, MAXTHREADS, NULL, taskqueue_state_t::numthreads, taskqueue_state_thread_t::quit, RECENTFRAMES, TaskQueue_DistributeTasks(), taskqueue_maxthreads, taskqueue_minthreads, taskqueue_state, taskqueue_tasksperthread, TaskQueue_ThreadFunc(), taskqueue_state_t::tasks_averageperframe, taskqueue_state_t::tasks_recentframes, taskqueue_state_t::tasks_recentframesindex, taskqueue_state_t::tasks_thisframe, Thread_AtomicLock, Thread_AtomicUnlock, Thread_CreateThread, taskqueue_state_thread_t::thread_index, Thread_WaitThread, and taskqueue_state_t::threads.

Referenced by Host_Frame(), and TaskQueue_Shutdown().

◆ TaskQueue_Init()

void TaskQueue_Init ( void )

Definition at line 53 of file taskqueue.c.

54{
58}
void Cvar_RegisterVariable(cvar_t *variable)
registers a cvar that already has the name, string, and optionally the archive elements set.
Definition cvar.c:599

References Cvar_RegisterVariable(), taskqueue_maxthreads, taskqueue_minthreads, and taskqueue_tasksperthread.

Referenced by Host_Init().

◆ TaskQueue_IsDone()

qbool TaskQueue_IsDone ( taskqueue_task_t * t)

Definition at line 139 of file taskqueue.c.

140{
141 return !!t->done;
142}
volatile int done
Definition taskqueue.h:14

References taskqueue_task_t::done.

◆ TaskQueue_Setup()

void TaskQueue_Setup ( taskqueue_task_t * t,
taskqueue_task_t * preceding,
void(* func )(taskqueue_task_t *),
size_t i0,
size_t i1,
void * p0,
void * p1 )

Definition at line 282 of file taskqueue.c.

283{
284 memset(t, 0, sizeof(*t));
285 t->preceding = preceding;
286 t->func = func;
287 t->i[0] = i0;
288 t->i[1] = i1;
289 t->p[0] = p0;
290 t->p[1] = p1;
291}
void * p[2]
Definition taskqueue.h:19
size_t i[2]
Definition taskqueue.h:20
struct taskqueue_task_s * preceding
Definition taskqueue.h:11
void(* func)(struct taskqueue_task_s *task)
Definition taskqueue.h:17

References taskqueue_task_t::func, taskqueue_task_t::i, taskqueue_task_t::p, and taskqueue_task_t::preceding.

Referenced by R_Shadow_BounceGrid_EnqueuePhotons_Task(), R_Shadow_BounceGrid_EnqueueSlices_Task(), and R_Shadow_UpdateBounceGridTexture().

◆ TaskQueue_Shutdown()

void TaskQueue_Shutdown ( void )

Definition at line 60 of file taskqueue.c.

61{
63 TaskQueue_Frame(true);
64}
void TaskQueue_Frame(qbool shutdown)
Definition taskqueue.c:213

References taskqueue_state_t::numthreads, TaskQueue_Frame(), and taskqueue_state.

Referenced by Host_Shutdown().

◆ TaskQueue_Task_CheckTasksDone()

void TaskQueue_Task_CheckTasksDone ( taskqueue_task_t * t)

Definition at line 293 of file taskqueue.c.

294{
295 size_t numtasks = t->i[0];
296 taskqueue_task_t *tasks = (taskqueue_task_t *)t->p[0];
297 while (numtasks > 0)
298 {
299 // check the last task first as it's usually going to be the last to finish, so we do the least work by checking it first
300 if (!tasks[numtasks - 1].done)
301 {
302 // update our partial progress, then yield to another pending task.
303 t->i[0] = numtasks;
304 // set our preceding task to one of the ones we are watching for
305 t->preceding = &tasks[numtasks - 1];
307 return;
308 }
309 numtasks--;
310 }
311 t->done = 1;
312}
void TaskQueue_Yield(taskqueue_task_t *t)
Definition taskqueue.c:133

References taskqueue_task_t::done, taskqueue_task_t::i, taskqueue_task_t::p, taskqueue_task_t::preceding, and TaskQueue_Yield().

Referenced by R_Shadow_BounceGrid_EnqueuePhotons_Task(), and R_Shadow_BounceGrid_EnqueueSlices_Task().

◆ TaskQueue_WaitForTaskDone()

void TaskQueue_WaitForTaskDone ( taskqueue_task_t * t)

Definition at line 199 of file taskqueue.c.

200{
201 qbool done = false;
202 for (;;)
203 {
205 done = t->done != 0;
207 if (done)
208 break;
210 }
211}
bool qbool
Definition qtypes.h:9

References taskqueue_state_t::command_lock, taskqueue_task_t::done, TaskQueue_DistributeTasks(), taskqueue_state, Thread_AtomicLock, and Thread_AtomicUnlock.

Referenced by R_Shadow_UpdateBounceGridTexture().

◆ TaskQueue_Yield()

void TaskQueue_Yield ( taskqueue_task_t * t)

Definition at line 133 of file taskqueue.c.

134{
135 t->yieldcount++;
136 TaskQueue_Enqueue(1, t);
137}
unsigned int yieldcount
Definition taskqueue.h:22
void TaskQueue_Enqueue(int numtasks, taskqueue_task_t *tasks)
Definition taskqueue.c:105

References TaskQueue_Enqueue(), and taskqueue_task_t::yieldcount.

Referenced by R_Shadow_BounceGrid_EnqueueSlices_Task(), TaskQueue_ExecuteTask(), and TaskQueue_Task_CheckTasksDone().