htils
1
A small set of utilities for C programming.
Toggle main menu visibility
Loading...
Searching...
No Matches
worker.h
Go to the documentation of this file.
1
#ifndef HTILS_WORKER_H
2
#define HTILS_WORKER_H
3
4
#ifndef HTILS_THREAD_SAFE
5
#error "htils workers are only available on thread-safe builds of htils"
6
#else
7
8
/***********************************/
9
10
#include <stdatomic.h>
11
#include <threads.h>
12
13
#include <
htils/arena.h
>
14
#include <
htils/atomic_types.h
>
15
#include <
htils/basictypes.h
>
16
17
/***********************************/
18
22
typedef
enum
{
23
HTILS_WORKER_CONTINUE
,
24
HTILS_WORKER_DONE
,
25
}
htils_worker_step_t
;
26
42
typedef
void (*
htils_worker_fn_t
)(
void
*userdata,
arena_t
*scratch);
43
62
typedef
htils_worker_step_t
(*
htils_worker_task_t
)(
void
*userdata,
63
arena_t
*scratch);
64
69
typedef
struct
htils_worker_config
{
70
b32
detach
;
71
}
htils_worker_config_t
;
72
92
typedef
struct
htils_worker
{
93
thrd_t
thread
;
94
arena_t
*
scratch
;
95
atomic_b32
running
;
96
atomic_b32
pause
;
97
b32
detached
;
98
htils_worker_fn_t
fn
;
99
htils_worker_task_t
task
;
100
void
*
userdata
;
101
mtx_t
pause_mtx
;
// guards pause awaits
102
cnd_t
pause_cnd
;
// signals on resume/stop
103
b32
primitives_init
;
104
}
htils_worker_t
;
105
106
//
107
//
108
//
109
113
htils_worker_config_t
htils_worker_config_default
(
void
);
114
115
//
116
//
117
//
118
135
b32
htils_worker_spawn
(
htils_worker_t
*worker,
136
const
htils_worker_config_t
*config,
137
htils_worker_fn_t
fn,
void
*userdata);
138
139
//
140
//
141
//
142
160
b32
htils_worker_spawn_task
(
htils_worker_t
*worker,
161
const
htils_worker_config_t
*config,
162
htils_worker_task_t
task,
void
*userdata);
163
164
//
165
//
166
//
167
176
void
htils_worker_request_stop
(
htils_worker_t
*worker);
177
178
//
179
//
180
//
181
192
void
htils_worker_set_paused
(
htils_worker_t
*worker,
b32
paused);
193
194
//
195
//
196
//
197
205
b32
htils_worker_running
(
const
htils_worker_t
*worker);
206
207
//
208
//
209
//
210
218
b32
htils_worker_paused
(
const
htils_worker_t
*worker);
219
220
//
221
//
222
//
223
233
b32
htils_worker_should_stop
(
const
htils_worker_t
*worker);
234
235
//
236
//
237
//
238
246
void
htils_worker_join
(
htils_worker_t
*worker);
247
248
#endif
// !HTILS_THREAD_SAFE
249
#endif
// !HTILS_WORKER_H
arena.h
arena_t
struct arena arena_t
An atomic arena.
atomic_types.h
atomic_b32
atomic_u32 atomic_b32
Definition
atomic_types.h:43
basictypes.h
b32
u32 b32
Definition
basictypes.h:43
htils_worker_config
Worker options.
Definition
worker.h:69
htils_worker_config::detach
b32 detach
Definition
worker.h:70
htils_worker
A reusable worker slot.
Definition
worker.h:92
htils_worker::scratch
arena_t * scratch
Definition
worker.h:94
htils_worker::pause_cnd
cnd_t pause_cnd
Definition
worker.h:102
htils_worker::pause
atomic_b32 pause
Definition
worker.h:96
htils_worker::fn
htils_worker_fn_t fn
Definition
worker.h:98
htils_worker::detached
b32 detached
Definition
worker.h:97
htils_worker::running
atomic_b32 running
Definition
worker.h:95
htils_worker::primitives_init
b32 primitives_init
Definition
worker.h:103
htils_worker::thread
thrd_t thread
Definition
worker.h:93
htils_worker::task
htils_worker_task_t task
Definition
worker.h:99
htils_worker::pause_mtx
mtx_t pause_mtx
Definition
worker.h:101
htils_worker::userdata
void * userdata
Definition
worker.h:100
htils_worker_config_t
struct htils_worker_config htils_worker_config_t
Worker options.
htils_worker_running
b32 htils_worker_running(const htils_worker_t *worker)
Check if a worker is running a task.
Definition
worker.c:176
htils_worker_t
struct htils_worker htils_worker_t
A reusable worker slot.
htils_worker_task_t
htils_worker_step_t(* htils_worker_task_t)(void *userdata, arena_t *scratch)
Sliced task body.
Definition
worker.h:62
htils_worker_join
void htils_worker_join(htils_worker_t *worker)
Waits for the task to finish.
Definition
worker.c:197
htils_worker_spawn_task
b32 htils_worker_spawn_task(htils_worker_t *worker, const htils_worker_config_t *config, htils_worker_task_t task, void *userdata)
Spawns a sliced worker task.
Definition
worker.c:142
htils_worker_set_paused
void htils_worker_set_paused(htils_worker_t *worker, b32 paused)
Pause or resume a sliced worker.
Definition
worker.c:165
htils_worker_request_stop
void htils_worker_request_stop(htils_worker_t *worker)
Ask a worker to stop.
Definition
worker.c:156
htils_worker_paused
b32 htils_worker_paused(const htils_worker_t *worker)
Check if a sliced worker is paused.
Definition
worker.c:183
htils_worker_should_stop
b32 htils_worker_should_stop(const htils_worker_t *worker)
Checks whether a stop was requested (Polled by single-shot workers).
Definition
worker.c:190
htils_worker_config_default
htils_worker_config_t htils_worker_config_default(void)
Default worker options (Detachable).
Definition
worker.c:124
htils_worker_spawn
b32 htils_worker_spawn(htils_worker_t *worker, const htils_worker_config_t *config, htils_worker_fn_t fn, void *userdata)
Spawns a single-shot worker.
Definition
worker.c:128
htils_worker_step_t
htils_worker_step_t
Result of one task slice.
Definition
worker.h:22
HTILS_WORKER_CONTINUE
@ HTILS_WORKER_CONTINUE
Definition
worker.h:23
HTILS_WORKER_DONE
@ HTILS_WORKER_DONE
Definition
worker.h:24
htils_worker_fn_t
void(* htils_worker_fn_t)(void *userdata, arena_t *scratch)
Single-shot worker body.
Definition
worker.h:42
include
htils
worker.h
Generated by
1.17.0