Fix spurious wake-ups and worker threads initialization in workerpool #339
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
I encountered random segfaults while using this library and tried to figure out what was happening. I isolated the segfault to the function
worker_thread()
ofworkerpool.c
. Long story short, there is no predicate that preventsworker_thread()
from running if it is woken up spuriously and a task has already been added. Since there is no mutex used inworkerpool_add_task()
, it is possible for the zarraywp->tasks
to be reallocated, rendering the volatile pointertask
inworker_thread()
invalid and causing a segfault.This PR addresses this issue by adding a predicate and shielding calls that access
wp
behind a mutex. I also saw issue #70 and agree that the initialization of the worker threads might lead to race conditions, so I addressed that too.