Data Structures | |
struct | cuflow_exeq_entry |
struct | cuflow_exeq |
Defines | |
#define | CUFLOW_EXEQ_SIZE 8 |
#define | CUFLOW_EXEQ_MASK (CUFLOW_EXEQ_SIZE - 1) |
#define | CUFLOW_PROFILE_SCHED 0 |
#define | CUFLOW_CALLS_BETWEEN_SCHED 1 |
#define | cuflow_exeqpri_succ(pri) ((cuflow_exeqpri_t)((pri) + 1)) |
Typedefs | |
typedef struct cuflow_exeq * | cuflow_exeq_t |
typedef struct cuflow_exeq_entry * | cuflow_exeq_entry_t |
Enumerations | |
enum | cuflow_exeqpri_t { cuflow_exeqpri_begin = 0, cuflow_exeqpri_normal = 0, cuflow_exeqpri_background = 1, cuflow_exeqpri_end } |
Functions | |
cuflow_exeqpri_t | cuflow_sched_priority (void) |
cuflow_exeqpri_t | cuflow_sched_change_priority (cuflow_exeqpri_t priority) |
cuflow_exeq_t | cuflow_sched_exeq (void) |
void | cuflow_sched_call_on (cu_clop0(f, void), AO_t *cdisj, cuflow_exeq_t exeq) |
void | cuflow_sched_call_at (cu_clop0(f, void), AO_t *cdisj, cuflow_exeqpri_t pri) |
void | cuflow_sched_call (cu_clop0(f, void), AO_t *cdisj) |
void | cuflow_sched_call_sub1_on (cu_clop0(f, void), AO_t *cdisj, cuflow_exeq_t exeq) |
void | cuflow_sched_call_sub1_at (cu_clop0(f, void), AO_t *cdisj, cuflow_exeqpri_t pri) |
void | cuflow_sched_call_sub1 (cu_clop0(f, void), AO_t *cdisj) |
cu_bool_t | cuflow_exeqpri_prioreq (cuflow_exeqpri_t pri0, cuflow_exeqpri_t pri1) |
cu_bool_t | cuflow_exeqpri_prior (cuflow_exeqpri_t pri0, cuflow_exeqpri_t pri1) |
This provides an efficient mechanism for sharing work across multiple CPUs or cores on an SMP system. Before use, start some worker threads with cuflow_workers_spawn_at_least or cuflow_workers_spawn. To parallelize a task, initialise a local cuflow_cdisj_t guard to zero and request the subtasks with cuflow_sched_call passing a reference to guard. Then use cuflow_cdisj_wait_while to wait for the subtasks to finish.
enum cuflow_exeqpri_t |
A type to hold the priority of scheduled work.
cu_bool_t cuflow_exeqpri_prior | ( | cuflow_exeqpri_t | pri0, | |
cuflow_exeqpri_t | pri1 | |||
) |
True iff pri0 is a higher priority than pri1.
cu_bool_t cuflow_exeqpri_prioreq | ( | cuflow_exeqpri_t | pri0, | |
cuflow_exeqpri_t | pri1 | |||
) |
True iff pri0 is at least as high a priority as pri1.
void cuflow_sched_call | ( | cu_clop0(f, void) | , | |
AO_t * | cdisj | |||
) |
Same as cuflow_sched_call_on with the current thread-local execution queue passed as the last argument.
void cuflow_sched_call_at | ( | cu_clop0(f, void) | , | |
AO_t * | cdisj, | |||
cuflow_exeqpri_t | pri | |||
) |
Same as cuflow_sched_call with the current priority temporarily set to pri.
void cuflow_sched_call_on | ( | cu_clop0(f, void) | , | |
AO_t * | cdisj, | |||
cuflow_exeq_t | exeq | |||
) |
If exeq queue is full, calls f and exits, else increments cdisj
and schedules f for later execution, possibly by another thread. In the latter case, *cdisj
is decremented after f has been called.
This function does not alter the priority of the current thread. It's main purpose is as an optimisation of successive calls to cuflow_sched_call by letting the client fetch the thread-local exeq with cuflow_sched_exeq once and pass it.
void cuflow_sched_call_sub1 | ( | cu_clop0(f, void) | , | |
AO_t * | cdisj | |||
) |
Same as cuflow_sched_call_sub1_on with the current thread-local execution queue passed as the last argument.
void cuflow_sched_call_sub1_at | ( | cu_clop0(f, void) | , | |
AO_t * | cdisj, | |||
cuflow_exeqpri_t | pri | |||
) |
Same as cuflow_sched_call_sub1 with the current priority temporarily set to pri.
void cuflow_sched_call_sub1_on | ( | cu_clop0(f, void) | , | |
AO_t * | cdisj, | |||
cuflow_exeq_t | exeq | |||
) |
Same as cuflow_sched_call, except that after f has been called, cdisj will be decremented by one. Use this variant if you initialise cdisj in advance to the number of pending calls.
cuflow_exeqpri_t cuflow_sched_change_priority | ( | cuflow_exeqpri_t | priority | ) |
Set the priority at which to run work scheduled by the current thread, and return the old priority.
cuflow_exeq_t cuflow_sched_exeq | ( | void | ) |
The current current execution queue on which work will be scheduled.
cuflow_exeqpri_t cuflow_sched_priority | ( | void | ) |
The priority at which to run work scheduled by the current thread.