p->pending_recvs[nb_pending_recvs] = sg_mailbox_get_async(p->me, &received);
nb_pending_recvs++;
- int idx = sg_comm_wait_any(p->pending_recvs, nb_pending_recvs);
+ ssize_t idx = sg_comm_wait_any(p->pending_recvs, nb_pending_recvs);
if (idx != -1) {
XBT_DEBUG("Peer %s got a 'SEND_DATA' message", sg_mailbox_get_name(p->me));
/* move the last pending comm where the finished one was, and decrement */
* Even in this simple example, the pending comms do not terminate in the exact same order of creation.
*/
while (pending_comms_count != 0) {
- int changed_pos = sg_comm_wait_any(pending_comms, pending_comms_count);
+ ssize_t changed_pos = sg_comm_wait_any(pending_comms, pending_comms_count);
memmove(pending_comms + changed_pos, pending_comms + changed_pos + 1,
sizeof(sg_comm_t) * (pending_comms_count - changed_pos - 1));
pending_comms_count--;
if (changed_pos != 0)
- XBT_INFO("Remove the %dth pending comm: it terminated earlier than another comm that was initiated first.",
+ XBT_INFO("Remove the %zdth pending comm: it terminated earlier than another comm that was initiated first.",
changed_pos);
}
simgrid::s4u::CommPtr comm = me->get_async<FilePiece>(&received);
pending_recvs.push_back(comm);
- int idx = simgrid::s4u::Comm::wait_any(pending_recvs);
+ ssize_t idx = simgrid::s4u::Comm::wait_any(pending_recvs);
if (idx != -1) {
comm = pending_recvs.at(idx);
XBT_DEBUG("Peer %s got a 'SEND_DATA' message", me->get_cname());
pending_comms.emplace_back(mbox->get_async<std::string>(pending_msgs[i].get()));
}
while (not pending_comms.empty()) {
- int index = sg4::Comm::wait_any(pending_comms);
+ ssize_t index = sg4::Comm::wait_any(pending_comms);
std::string* msg = *pending_msgs[index];
XBT_INFO("I got '%s'.", msg->c_str());
/* cleanup memory and remove from vectors */
* Even in this simple example, the pending comms do not terminate in the exact same order of creation.
*/
while (not pending_comms.empty()) {
- int changed_pos = sg4::Comm::wait_any(pending_comms);
+ ssize_t changed_pos = sg4::Comm::wait_any(pending_comms);
pending_comms.erase(pending_comms.begin() + changed_pos);
if (changed_pos != 0)
- XBT_INFO("Remove the %dth pending comm: it terminated earlier than another comm that was initiated first.",
+ XBT_INFO("Remove the %zdth pending comm: it terminated earlier than another comm that was initiated first.",
changed_pos);
}
xbt::ThrowPoint const& throw_point() const { return throwpoint_; }
/** Allow to carry a value (used by testany/waitany) */
- int get_value() const { return value_; }
- void set_value(int value) { value_ = value; }
+ ssize_t get_value() const { return value_; }
+ void set_value(ssize_t value) { value_ = value; }
std::string resolve_backtrace() const { return throwpoint_.backtrace_.resolve(); }
private:
xbt::ThrowPoint throwpoint_;
- int value_ = 0;
+ ssize_t value_ = 0;
};
#define DECLARE_SIMGRID_EXCEPTION(AnyException, ...) \
#define INCLUDE_SIMGRID_COMM_H_
#include <simgrid/forward.h>
+#include <sys/types.h> /* ssize_t */
#include <xbt/dynar.h>
/* C interface */
XBT_PUBLIC sg_error_t sg_comm_wait_for(sg_comm_t comm, double timeout);
XBT_PUBLIC void sg_comm_wait_all(sg_comm_t* comms, size_t count);
XBT_PUBLIC size_t sg_comm_wait_all_for(sg_comm_t* comms, size_t count, double timeout);
-XBT_PUBLIC int sg_comm_wait_any_for(sg_comm_t* comms, size_t count, double timeout);
-XBT_PUBLIC int sg_comm_wait_any(sg_comm_t* comms, size_t count);
+XBT_PUBLIC ssize_t sg_comm_wait_any_for(sg_comm_t* comms, size_t count, double timeout);
+XBT_PUBLIC ssize_t sg_comm_wait_any(sg_comm_t* comms, size_t count);
XBT_PUBLIC void sg_comm_unref(sg_comm_t comm);
SG_END_DECL
/*! take a vector s4u::CommPtr and return when one of them is finished.
* The return value is the rank of the first finished CommPtr. */
- static int wait_any(const std::vector<CommPtr>& comms) { return wait_any_for(comms, -1); }
+ static ssize_t wait_any(const std::vector<CommPtr>& comms) { return wait_any_for(comms, -1); }
/*! Same as wait_any, but with a timeout. Return -1 if the timeout occurs.*/
- static int wait_any_for(const std::vector<CommPtr>& comms, double timeout);
+ static ssize_t wait_any_for(const std::vector<CommPtr>& comms, double timeout);
/*! take a vector s4u::CommPtr and return when all of them is finished. */
static void wait_all(const std::vector<CommPtr>& comms);
static ssize_t test_any(const std::vector<CommPtr>& comms);
XBT_ATTRIB_DEPRECATED_v332("Please use a plain vector for parameter")
- static int wait_any(const std::vector<CommPtr>* comms) { return wait_any_for(*comms, -1); }
+ static int wait_any(const std::vector<CommPtr>* comms) { return static_cast<int>(wait_any_for(*comms, -1)); }
XBT_ATTRIB_DEPRECATED_v332("Please use a plain vector for first parameter")
- static int wait_any_for(const std::vector<CommPtr>* comms, double timeout) { return wait_any_for(*comms, timeout); }
+ static int wait_any_for(const std::vector<CommPtr>* comms, double timeout) { return static_cast<int>(wait_any_for(*comms, timeout)); }
XBT_ATTRIB_DEPRECATED_v332("Please use a plain vector for parameter")
static void wait_all(const std::vector<CommPtr>* comms) { wait_all(*comms); }
XBT_ATTRIB_DEPRECATED_v332("Please use a plain vector for parameter")
XBT_ATTRIB_DEPRECATED_v330("Please use a CommImpl*[] for first parameter") XBT_PUBLIC
unsigned int simcall_comm_waitany(simgrid::kernel::activity::ActivityImplPtr 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 ssize_t simcall_comm_waitany(simgrid::kernel::activity::CommImpl* comms[], size_t count, double timeout);
XBT_PUBLIC void simcall_comm_wait(simgrid::kernel::activity::ActivityImpl* comm, double timeout);
XBT_PUBLIC bool simcall_comm_test(simgrid::kernel::activity::ActivityImpl* comm);
XBT_ATTRIB_DEPRECATED_v330("Please use a CommImpl*[] for first parameter") XBT_PUBLIC
}
if (not MC_is_active() && not MC_record_replay_is_active()) {
CommImpl** element = std::find(comms, comms + count, this);
- int rank = (element != comms + count) ? element - comms : -1;
+ ssize_t rank = (element != comms + count) ? element - comms : -1;
simcall_comm_waitany__set__result(simcall, rank);
}
}
count = simcall_comm_testany__get__count(simcall);
}
CommImpl** element = std::find(comms, comms + count, this);
- int rank = (element != comms + count) ? element - comms : -1;
+ ssize_t rank = (element != comms + count) ? element - comms : -1;
// In order to modify the exception we have to rethrow it:
try {
std::rethrow_exception(simcall->issuer_->exception_);
*/
int MSG_comm_waitany(const_xbt_dynar_t comms)
{
- int finished_index = -1;
+ ssize_t finished_index = -1;
/* Create the equivalent array with SIMIX objects: */
std::vector<simgrid::kernel::activity::CommImpl*> s_comms;
(*comm->task_received)->set_not_used();
}
- return finished_index;
+ return static_cast<int>(finished_index);
}
/**
}
}
-int Comm::wait_any_for(const std::vector<CommPtr>& comms, double timeout)
+ssize_t Comm::wait_any_for(const std::vector<CommPtr>& comms, double timeout)
{
std::vector<kernel::activity::CommImpl*> rcomms(comms.size());
std::transform(begin(comms), end(comms), begin(rcomms),
[](const CommPtr& comm) { return static_cast<kernel::activity::CommImpl*>(comm->pimpl_.get()); });
- int changed_pos = simcall_comm_waitany(rcomms.data(), rcomms.size(), timeout);
+ ssize_t changed_pos = simcall_comm_waitany(rcomms.data(), rcomms.size(), timeout);
if (changed_pos != -1)
comms.at(changed_pos)->complete(State::FINISHED);
return changed_pos;
return pos;
}
-int sg_comm_wait_any(sg_comm_t* comms, size_t count)
+ssize_t sg_comm_wait_any(sg_comm_t* comms, size_t count)
{
return sg_comm_wait_any_for(comms, count, -1);
}
-int sg_comm_wait_any_for(sg_comm_t* comms, size_t count, double timeout)
+ssize_t sg_comm_wait_any_for(sg_comm_t* comms, size_t count, double timeout)
{
std::vector<simgrid::s4u::CommPtr> s4u_comms;
- for (unsigned int i = 0; i < count; i++)
+ for (size_t i = 0; i < count; i++)
s4u_comms.emplace_back(comms[i], false);
- int pos = simgrid::s4u::Comm::wait_any_for(s4u_comms, timeout);
- for (unsigned i = 0; i < count; i++) {
- if (pos != -1 && static_cast<unsigned>(pos) != i)
+ ssize_t pos = simgrid::s4u::Comm::wait_any_for(s4u_comms, timeout);
+ for (size_t i = 0; i < count; i++) {
+ if (pos != -1 && static_cast<size_t>(pos) != i)
s4u_comms[i]->add_ref();
}
return pos;
std::transform(comms, comms + count, begin(rcomms), [](const simgrid::kernel::activity::ActivityImplPtr& comm) {
return static_cast<simgrid::kernel::activity::CommImpl*>(comm.get());
});
- return simcall_BODY_comm_waitany(rcomms.data(), rcomms.size(), timeout);
+ return static_cast<unsigned int>(simcall_BODY_comm_waitany(rcomms.data(), rcomms.size(), timeout));
}
-unsigned int simcall_comm_waitany(simgrid::kernel::activity::CommImpl* comms[], size_t count, double timeout)
+ssize_t simcall_comm_waitany(simgrid::kernel::activity::CommImpl* comms[], size_t count, double timeout)
{
return simcall_BODY_comm_waitany(comms, count, timeout);
}
{
simgrid::simix::marshal<double>(simcall->args_[2], arg);
}
-static inline int simcall_comm_waitany__get__result(smx_simcall_t simcall)
+static inline ssize_t simcall_comm_waitany__get__result(smx_simcall_t simcall)
{
- return simgrid::simix::unmarshal<int>(simcall->result_);
+ return simgrid::simix::unmarshal<ssize_t>(simcall->result_);
}
-static inline int simcall_comm_waitany__getraw__result(smx_simcall_t simcall)
+static inline ssize_t simcall_comm_waitany__getraw__result(smx_simcall_t simcall)
{
- return simgrid::simix::unmarshal_raw<int>(simcall->result_);
+ return simgrid::simix::unmarshal_raw<ssize_t>(simcall->result_);
}
-static inline void simcall_comm_waitany__set__result(smx_simcall_t simcall, int result)
+static inline void simcall_comm_waitany__set__result(smx_simcall_t simcall, ssize_t result)
{
- simgrid::simix::marshal<int>(simcall->result_, result);
+ simgrid::simix::marshal<ssize_t>(simcall->result_, result);
}
static inline simgrid::kernel::activity::CommImpl* simcall_comm_wait__get__comm(smx_simcall_t simcall)
return simcall<ssize_t, simgrid::kernel::activity::CommImpl**, size_t>(Simcall::COMM_TESTANY, comms, count);
}
-inline static int simcall_BODY_comm_waitany(simgrid::kernel::activity::CommImpl** comms, size_t count, double timeout)
+inline static ssize_t simcall_BODY_comm_waitany(simgrid::kernel::activity::CommImpl** comms, size_t count, double timeout)
{
if (false) /* Go to that function to follow the code flow through the simcall barrier */
simcall_HANDLER_comm_waitany(&SIMIX_process_self()->simcall_, comms, count, timeout);
- return simcall<int, simgrid::kernel::activity::CommImpl**, size_t, double>(Simcall::COMM_WAITANY, comms, count, timeout);
+ return simcall<ssize_t, simgrid::kernel::activity::CommImpl**, size_t, double>(Simcall::COMM_WAITANY, comms, count, timeout);
}
inline static void simcall_BODY_comm_wait(simgrid::kernel::activity::CommImpl* comm, double timeout)
boost::intrusive_ptr<simgrid::kernel::activity::ActivityImpl> comm_isend(smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, unsigned char* src_buff, size_t src_buff_size, simix_match_func_t match_fun, simix_clean_func_t clean_fun, simix_copy_data_func_t copy_data_fun, void* data, bool detached);
bool comm_test(simgrid::kernel::activity::CommImpl* comm);
ssize_t comm_testany(simgrid::kernel::activity::CommImpl** comms, size_t count);
-int comm_waitany(simgrid::kernel::activity::CommImpl** comms, size_t count, double timeout) [[block]];
+ssize_t comm_waitany(simgrid::kernel::activity::CommImpl** comms, size_t count, double timeout) [[block]];
void comm_wait(simgrid::kernel::activity::CommImpl* comm, double timeout) [[block]];
void run_kernel(std::function<void()> const* code) [[nohandler]];
std::vector<simgrid::s4u::CommPtr> comms = {put1, put2, get1, get2};
while (not comms.empty()) {
- int index = simgrid::s4u::Comm::wait_any_for(comms, 0.5);
+ ssize_t index = simgrid::s4u::Comm::wait_any_for(comms, 0.5);
if (index < 0)
XBT_INFO("wait_any_for: Timeout reached");
else {
- XBT_INFO("wait_any_for: A comm finished (index=%d, #comms=%zu)", index, comms.size());
+ XBT_INFO("wait_any_for: A comm finished (index=%zd, #comms=%zu)", index, comms.size());
comms.erase(comms.begin() + index);
}
}