@@ -13,7 +13,7 @@ pub struct PoolProcessor {
13
13
mut :
14
14
njobs int
15
15
items []voidptr
16
- results []voidptr
16
+ results shared []voidptr
17
17
ntask u32 // reading/writing to this should be atomic
18
18
waitgroup sync.WaitGroup
19
19
shared_context voidptr
@@ -88,7 +88,9 @@ pub fn (mut pool PoolProcessor) work_on_pointers(items []voidptr) {
88
88
}
89
89
unsafe {
90
90
pool.thread_contexts = []voidptr {len: items.len}
91
- pool.results = []voidptr {len: items.len}
91
+ lock pool.results {
92
+ pool.results = []voidptr {len: items.len}
93
+ }
92
94
pool.items = []voidptr {cap: items.len}
93
95
pool.items << items
94
96
pool.waitgroup.add (njobs)
@@ -115,7 +117,9 @@ fn process_in_thread(mut pool PoolProcessor, task_id int) {
115
117
if idx > = ilen {
116
118
break
117
119
}
118
- pool.results[idx] = cb (mut pool, idx, task_id)
120
+ lock pool.results {
121
+ pool.results[idx] = cb (mut pool, idx, task_id)
122
+ }
119
123
}
120
124
pool.waitgroup.done ()
121
125
}
@@ -129,14 +133,18 @@ pub fn (pool &PoolProcessor) get_item[T](idx int) T {
129
133
// get_result - called by the main thread to get a specific result.
130
134
// Retrieves a type safe instance of the produced result.
131
135
pub fn (pool &PoolProcessor) get_result [T](idx int ) T {
132
- return unsafe { * (& T (pool.results[idx])) }
136
+ rlock pool.results {
137
+ return unsafe { * (& T (pool.results[idx])) }
138
+ }
133
139
}
134
140
135
141
// get_results - get a list of type safe results in the main thread.
136
142
pub fn (pool &PoolProcessor) get_results [T]() []T {
137
143
mut res := []T{cap: pool.results.len}
138
144
for i in 0 .. pool.results.len {
139
- res << unsafe { * (& T (pool.results[i])) }
145
+ rlock pool.results {
146
+ res << unsafe { * (& T (pool.results[i])) }
147
+ }
140
148
}
141
149
return res
142
150
}
@@ -145,7 +153,9 @@ pub fn (pool &PoolProcessor) get_results[T]() []T {
145
153
pub fn (pool &PoolProcessor) get_results_ref [T]() []& T {
146
154
mut res := []& T{cap: pool.results.len}
147
155
for i in 0 .. pool.results.len {
148
- res << unsafe { & T (pool.results[i]) }
156
+ rlock pool.results {
157
+ res << unsafe { & T (pool.results[i]) }
158
+ }
149
159
}
150
160
return res
151
161
}
0 commit comments