/* FIXME: waitany is going to be a vararg function, and should take a timeout */
XBT_PUBLIC unsigned int simcall_comm_waitany(smx_activity_t comms[], size_t count, double timeout);
+XBT_PUBLIC unsigned int simcall_comm_waitany(simgrid::kernel::activity::CommImpl* comms[], size_t count,
+ double timeout);
XBT_PUBLIC void simcall_comm_wait(const smx_activity_t& comm, double timeout);
XBT_PUBLIC int simcall_comm_test(const smx_activity_t& comm);
XBT_PUBLIC int simcall_comm_testany(smx_activity_t comms[], size_t count);
+XBT_PUBLIC int simcall_comm_testany(simgrid::kernel::activity::CommImpl* comms[], size_t count);
#endif
/************************** Synchro simcalls **********************************/
int finished_index = -1;
/* Create the equivalent array with SIMIX objects: */
- std::vector<simgrid::kernel::activity::ActivityImplPtr> s_comms;
+ std::vector<simgrid::kernel::activity::CommImpl*> s_comms;
s_comms.reserve(xbt_dynar_length(comms));
msg_comm_t comm;
unsigned int cursor;
xbt_dynar_foreach(comms, cursor, comm) {
- s_comms.push_back(comm->s_comm);
+ s_comms.push_back(static_cast<simgrid::kernel::activity::CommImpl*>(comm->s_comm.get()));
}
msg_error_t status = MSG_OK;
int finished_index = -1;
/* Create the equivalent array with SIMIX objects: */
- std::vector<simgrid::kernel::activity::ActivityImplPtr> s_comms;
+ std::vector<simgrid::kernel::activity::CommImpl*> s_comms;
s_comms.reserve(xbt_dynar_length(comms));
msg_comm_t comm;
unsigned int cursor;
xbt_dynar_foreach(comms, cursor, comm) {
- s_comms.push_back(comm->s_comm);
+ s_comms.push_back(static_cast<simgrid::kernel::activity::CommImpl*>(comm->s_comm.get()));
}
msg_error_t status = MSG_OK;
int Comm::wait_any_for(std::vector<CommPtr>* comms, double timeout)
{
- smx_activity_t* array = new smx_activity_t[comms->size()];
- for (unsigned int i = 0; i < comms->size(); i++) {
- array[i] = comms->at(i)->pimpl_;
- }
- int idx = simcall_comm_waitany(array, comms->size(), timeout);
- delete[] array;
- return idx;
+ std::unique_ptr<simgrid::kernel::activity::CommImpl* []> rcomms(
+ new simgrid::kernel::activity::CommImpl*[comms->size()]);
+ std::transform(begin(*comms), end(*comms), rcomms.get(), [](const CommPtr& comm) {
+ return static_cast<simgrid::kernel::activity::CommImpl*>(comm->pimpl_.get());
+ });
+ return simcall_comm_waitany(rcomms.get(), comms->size(), timeout);
}
void Comm::wait_all(std::vector<CommPtr>* comms)
}
int Comm::test_any(std::vector<CommPtr>* comms)
{
- smx_activity_t* array = new smx_activity_t[comms->size()];
- for (unsigned int i = 0; i < comms->size(); i++) {
- array[i] = comms->at(i)->pimpl_;
- }
- int res = simcall_comm_testany(array, comms->size());
- delete[] array;
- return res;
+ std::unique_ptr<simgrid::kernel::activity::CommImpl* []> rcomms(
+ new simgrid::kernel::activity::CommImpl*[comms->size()]);
+ std::transform(begin(*comms), end(*comms), rcomms.get(), [](const CommPtr& comm) {
+ return static_cast<simgrid::kernel::activity::CommImpl*>(comm->pimpl_.get());
+ });
+ return simcall_comm_testany(rcomms.get(), comms->size());
}
Comm* Comm::detach()
return simcall_BODY_comm_waitany(rcomms.get(), count, timeout);
}
+unsigned int simcall_comm_waitany(simgrid::kernel::activity::CommImpl* comms[], size_t count, double timeout)
+{
+ return simcall_BODY_comm_waitany(comms, count, timeout);
+}
+
/**
* @ingroup simix_comm_management
*/
return simcall_BODY_comm_testany(rcomms.get(), count);
}
+int simcall_comm_testany(simgrid::kernel::activity::CommImpl* comms[], size_t count)
+{
+ if (count == 0)
+ return -1;
+ return simcall_BODY_comm_testany(comms, count);
+}
+
/**
* @ingroup simix_comm_management
*/
int Request::testany(int count, MPI_Request requests[], int *index, MPI_Status * status)
{
- std::vector<simgrid::kernel::activity::ActivityImplPtr> comms;
+ std::vector<simgrid::kernel::activity::CommImpl*> comms;
comms.reserve(count);
int i;
std::vector<int> map; /** Maps all matching comms back to their location in requests **/
for(i = 0; i < count; i++) {
if ((requests[i] != MPI_REQUEST_NULL) && requests[i]->action_ && not(requests[i]->flags_ & MPI_REQ_PREPARED)) {
- comms.push_back(requests[i]->action_);
+ comms.push_back(static_cast<simgrid::kernel::activity::CommImpl*>(requests[i]->action_.get()));
map.push_back(i);
}
}
int Request::waitany(int count, MPI_Request requests[], MPI_Status * status)
{
- std::vector<simgrid::kernel::activity::ActivityImplPtr> comms;
+ std::vector<simgrid::kernel::activity::CommImpl*> comms;
comms.reserve(count);
int index = MPI_UNDEFINED;
not(requests[i]->flags_ & MPI_REQ_FINISHED)) {
if (requests[i]->action_ != nullptr) {
XBT_DEBUG("Waiting any %p ", requests[i]);
- comms.push_back(requests[i]->action_);
+ comms.push_back(static_cast<simgrid::kernel::activity::CommImpl*>(requests[i]->action_.get()));
map.push_back(i);
} else {
// This is a finished detached request, let's return this one