TestAction(RequestStorage& storage) : ReplayAction("Test", storage) {}
void kernel(simgrid::xbt::ReplayAction& action) override
{
- MPI_Request request = get_reqq_self()->back();
- get_reqq_self()->pop_back();
+ MPI_Request request = req_storage->find(args.src, args.dst, args.tag);
+ req_storage->remove(request);
// if request is null here, this may mean that a previous test has succeeded
// Different times in traced application and replayed version may lead to this
// In this case, ignore the extra calls.
XBT_DEBUG("MPI_Test result: %d", flag);
/* push back request in vector to be caught by a subsequent wait. if the test did succeed, the request is now
* nullptr.*/
- get_reqq_self()->push_back(request);
+ if (request == MPI_REQUEST_NULL)
+ req_storage->addNullRequest(args.src, args.dst, args.tag);
+ else
+ req_storage->add(request);
TRACE_smpi_testing_out(my_proc_id);
}
WaitAllAction(RequestStorage& storage) : ReplayAction("waitAll", storage) {}
void kernel(simgrid::xbt::ReplayAction& action) override
{
- const unsigned int count_requests = get_reqq_self()->size();
+ const unsigned int count_requests = req_storage->size();
if (count_requests > 0) {
TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::Pt2PtTIData("waitAll", -1, count_requests, ""));
std::vector<std::pair</*sender*/int,/*recv*/int>> sender_receiver;
- for (const auto& req : (*get_reqq_self())) {
+ std::vector<MPI_Request> reqs;
+ req_storage->get_requests(reqs);
+ for (const auto& req : reqs) {
if (req && (req->flags() & RECV)) {
sender_receiver.push_back({req->src(), req->dst()});
}
}
MPI_Status status[count_requests];
- Request::waitall(count_requests, &(*get_reqq_self())[0], status);
+ Request::waitall(count_requests, &(reqs.data())[0], status);
for (auto& pair : sender_receiver) {
TRACE_smpi_recv(pair.first, pair.second, 0);