number_of_tasks, mailbox->getName());
/* - Send the computation amount to the @ref worker */
- mailbox->put(static_cast<void*>(&comp_size), comm_size);
+ mailbox->put(new double(comp_size), comm_size);
}
XBT_INFO("All tasks have been dispatched. Let's tell everybody the computation is over.");
for (int i = 0; i < workers_count; i++) {
/* - Eventually tell all the workers to stop by sending a "finalize" task */
mailbox = simgrid::s4u::Mailbox::byName(std::string("worker-") + std::to_string(i % workers_count));
- double finalize = -1;
- mailbox->put(static_cast<void*>(&finalize), 0);
+ mailbox->put(new double(-1.0), 0);
}
- simgrid::s4u::this_actor::sleep_for(.1); // Grace time to ensure everyone finishes.
}
};
void operator()()
{
while (1) { /* The worker waits in an infinite loop for tasks sent by the \ref master */
- double* comp_size = static_cast<double*>(mailbox->get());
- xbt_assert(comp_size != nullptr, "MSG_task_get failed");
- if (*comp_size < 0) { /* - Exit if 'finalize' is received */
+ double* task = static_cast<double*>(mailbox->get());
+ xbt_assert(task != nullptr, "mailbox->get() failed");
+ double comp_size = *task;
+ delete task;
+ if (comp_size < 0) { /* - Exit when -1.0 is received */
XBT_INFO("I'm done. See you!");
break;
}
/* - Otherwise, process the task */
- simgrid::s4u::this_actor::execute(*comp_size);
+ simgrid::s4u::this_actor::execute(comp_size);
}
}
};
> [ 4.057541] (worker@Jupiter) I'm done. See you!
> [ 4.083249] (worker@Fafard) I'm done. See you!
> [ 4.931805] (worker@Ginette) I'm done. See you!
+> [ 5.094868] (maestro@) Simulation time 5.09487
> [ 5.094868] (worker@Bourassa) I'm done. See you!
-> [ 5.194868] (maestro@) Simulation time 5.19487