boost::optional<T> next();
private:
- enum Flag { PARMAP_WORK, PARMAP_DESTROY };
-
/**
* @brief Thread data transmission structure
*/
Synchro* new_synchro(e_xbt_parmap_mode_t mode);
void work();
- Flag status; /**< is the parmap active or being destroyed? */
+ bool destroying; /**< is the parmap being destroyed? */
std::atomic_uint work_round; /**< index of the current round */
std::vector<std::thread*> workers; /**< worker thread handlers */
unsigned num_workers; /**< total number of worker threads including the controller */
XBT_CDEBUG(xbt_parmap, "Create new parmap (%u workers)", num_workers);
/* Initialize the thread pool data structure */
- this->status = PARMAP_WORK;
+ this->destroying = false;
this->work_round = 0;
this->workers.resize(num_workers);
this->num_workers = num_workers;
XBT_ATTRIB_UNUSED unsigned int core_bind = 0;
for (unsigned i = 1; i < num_workers; i++) {
- this->workers[i] = new std::thread(worker_main, new ThreadData(*this, i));
+ ThreadData* data = new ThreadData(*this, i);
+ this->workers[i] = new std::thread(worker_main, data);
/* Bind the worker to a core if possible */
#if HAVE_PTHREAD_SETAFFINITY
*/
template <typename T> Parmap<T>::~Parmap()
{
- status = PARMAP_DESTROY;
+ destroying = true;
synchro->master_signal();
for (unsigned i = 1; i < num_workers; i++) {
{
Parmap<T>& parmap = data->parmap;
unsigned round = 0;
- smx_context_t context = simix_global->context_factory->create_context(std::function<void()>(), nullptr);
+ kernel::context::Context* context = simix_global->context_factory->create_context(std::function<void()>(), nullptr);
kernel::context::Context::set_current(context);
XBT_CDEBUG(xbt_parmap, "New worker thread created");
while (1) {
round++; // New scheduling round
parmap.synchro->worker_wait(round);
- if (parmap.status == PARMAP_DESTROY)
+ if (parmap.destroying)
break;
XBT_CDEBUG(xbt_parmap, "Worker %d got a job", data->worker_id);