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 #include <stdio.h>
30 #include <stdlib.h>
31
32 #include <ucx/map.h>
33
34 #include "threadpools.h"
35
36
37 static UcxMap *thread_pool_map;
38 static int num_thrpools;
39 static UcxMap *io_pool_map;
40 static int num_iopools;
41
42 static threadpool_t *default_thread_pool;
43 static threadpool_t *last_thrpool_c;
44
45 static threadpool_t *default_io_pool;
46 static threadpool_t *last_io_pool;
47
48 int create_threadpool(
sstr_t name, ThreadPoolConfig *cfg) {
49 if(thread_pool_map ==
NULL) {
50 thread_pool_map = ucx_map_new(
16);
51 }
52
53 threadpool_t *pool = ucx_map_sstr_get(thread_pool_map, name);
54 if(pool) {
55 if(pool->min_threads > cfg->max_threads) {
56 pool->min_threads = cfg->min_threads;
57 pool->max_threads = cfg->max_threads;
58 }
else {
59 pool->max_threads = cfg->max_threads;
60 pool->min_threads = cfg->min_threads;
61 }
62 return 0;
63 }
else {
64 threadpool_t *tp = threadpool_new(cfg->min_threads, cfg->max_threads);
65
66 int ret = ucx_map_sstr_put(thread_pool_map, name, tp);
67
68 if(ret ==
0) {
69 num_thrpools++;
70 last_thrpool_c = tp;
71 if(!default_thread_pool) {
72 default_thread_pool = tp;
73 }
74 }
75
76 return ret;
77 }
78 }
79
80 int create_io_pool(
sstr_t name,
int numthreads) {
81 if(io_pool_map ==
NULL) {
82 io_pool_map = ucx_map_new(
4);
83 }
84 threadpool_t *pool = ucx_map_sstr_get(io_pool_map, name);
85 if(pool) {
86 pool->min_threads = numthreads;
87 pool->max_threads = numthreads;
88 return 0;
89 }
else {
90 threadpool_t *tp = threadpool_new(numthreads, numthreads);
91
92 int ret = ucx_map_sstr_put(io_pool_map, name, tp);
93
94 if(ret ==
0) {
95 num_iopools++;
96 last_io_pool = tp;
97 if(!default_io_pool) {
98 default_io_pool = tp;
99 }
100 }
101
102 return ret;
103 }
104 }
105
106 int check_thread_pool_cfg() {
107 if(num_thrpools ==
0) {
108 ThreadPoolConfig cfg;
109 cfg.min_threads =
4;
110 cfg.max_threads =
8;
111 cfg.queue_size =
64;
112 cfg.stack_size =
262144;
113 if(create_threadpool(sstr(
"default"), &cfg)) {
114 return 1;
115 }
116 }
117
118 if(num_iopools ==
0) {
119 if(create_io_pool(sstr(
"default"),
8)) {
120 return 1;
121 }
122 }
123
124 return 0;
125 }
126
127 threadpool_t* get_default_threadpool() {
128 return default_thread_pool;
129 }
130
131 threadpool_t* get_threadpool(
sstr_t name) {
132 return ucx_map_sstr_get(thread_pool_map, name);
133 }
134
135 threadpool_t* get_default_iopool() {
136 return default_io_pool;
137 }
138
139 threadpool_t* get_iopool(
sstr_t name) {
140 return ucx_map_sstr_get(io_pool_map, name);
141 }
142