blob: b009008f4ee788816fcfa6b0338ebeb2987026fc (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
#pragma once
#include "common.h"
#include "deque.h"
#include "smrt_arena.h"
#include <bits/pthreadtypes.h>
typedef void (*tp_job_proc)(void *args);
typedef struct {
u64 num_threads;
pthread_t * threads;
// Threads check this before waiting for a job
b32 is_running;
// Write mutex for num_active/alive
pthread_mutex_t * count_mtx;
// Signal to tp_wait that all jobs are complete
pthread_cond_t *done_signal;
// Threads currently doing a job
u64 num_active;
// Threads who are alive
u64 num_alive;
// Job queue
ts_deque_t jobs;
} thread_pool_t;
// Thread pool will be allocated on the arena.
thread_pool_t *tp_create(smrt_arena_t * arena ,
u64 max_jobs ,
u64 num_threads);
i32 tp_destroy(thread_pool_t *tp);
i32 tp_push_job(thread_pool_t * tp ,
tp_job_proc job ,
void *args);
// Wait for all threads to finish
void tp_wait(thread_pool_t *tp);
|