Fixed an issue where if threadpool was aborted when some threads were in a running
state the threadpool would never exit. This was due to the fact that the thread
terminate task (func == NULL && args == NULL) could have been pushed to queues which
were inactive. This change adds a uint64_t mask of threads that have already exited
so whenever the terminate task is sent to another queue, it is ensured that the queue
used will wake up at least one tpool worker.
Also added pushTpool_mask which allows to specify a subset of threads to push the task
to but its only used internally.
Also added in this commit: A way to allocate thread-safe storage for thread pool
workers via get_tpool_worker_index. This index is unique to the thread pool worker
within one threadpool and can be used to access arrays in a thread-safe manner.
An example of such use was added in a testcase that was added which compares delay
between actors and threadpool workers.
- removed some whitespace noise.
- cleaned up CMakeLists.txt
- reintegrated task_manager.c into thread-pool.c
- cleaned up some unnecessary code
Co-authored-by: Cedric Roux <cedric.roux@eurecom.fr>
Co-authored-by: Mikel Irazabal <mikel.irazabal@openairinterface.com>
The thread pool provides user data to be stored by (pre-)allocating the
necessary memory. A previous attempt was made to have this user data
aligned on a 32 byte boundary (e.g., to prevent segfault with SIMD
instructions, or avoid inefficient data access); the current
implementation, however, leads to unaligned memory access.
This patch attempts again to implement user data to be 32 byte aligned.
First, use memalign() to allocate the actual job on a 32 byte boundary.
Second, use alignas(32) to align the pointer to the user data to be
aligned to 32 bytes. Since it is the last member of the struct, this
ensures that user data, which is allocated right behind it, will be
aligned to 32 bytes as well.