Commit 4098909c authored by Peter W. Draper's avatar Peter W. Draper
Browse files

Only clear the pthread barriers when they are initialised

and they are not for one thread
parent c5321323
......@@ -314,21 +314,23 @@ void threadpool_reset_log(struct threadpool *tp) {
* @brief Frees up the memory allocated for this #threadpool.
*/
void threadpool_clean(struct threadpool *tp) {
/* Destroy the runner threads by calling them with a NULL mapper function
and waiting for all the threads to terminate. This ensures that no thread
is still waiting at a barrier. */
tp->map_function = NULL;
pthread_barrier_wait(&tp->run_barrier);
for (int k = 0; k < tp->num_threads - 1; k++) {
void *retval;
pthread_join(tp->threads[k], &retval);
}
/* Release the barriers. */
if (pthread_barrier_destroy(&tp->wait_barrier) != 0 ||
pthread_barrier_destroy(&tp->run_barrier) != 0)
error("Failed to destroy threadpool barriers.");
if (tp->num_threads > 1) {
/* Destroy the runner threads by calling them with a NULL mapper function
* and waiting for all the threads to terminate. This ensures that no
* thread is still waiting at a barrier. */
tp->map_function = NULL;
pthread_barrier_wait(&tp->run_barrier);
for (int k = 0; k < tp->num_threads - 1; k++) {
void *retval;
pthread_join(tp->threads[k], &retval);
}
/* Release the barriers. */
if (pthread_barrier_destroy(&tp->wait_barrier) != 0 ||
pthread_barrier_destroy(&tp->run_barrier) != 0)
error("Failed to destroy threadpool barriers.");
}
/* Clean up memory. */
free(tp->threads);
  • Actually, this is also only allocated if tp->num_threads > 1...

Please register or sign in to reply
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment