X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f8e2498e855c9b875ea7598a0e10e4994954fc1c..4b04faa98dd6b4d52c3383a177e810f8e450fd48:/src/msg/msg_gos.cpp diff --git a/src/msg/msg_gos.cpp b/src/msg/msg_gos.cpp index ed298144cb..877cfcfab2 100644 --- a/src/msg/msg_gos.cpp +++ b/src/msg/msg_gos.cpp @@ -6,6 +6,7 @@ #include "simgrid/Exception.hpp" #include +#include "simgrid/s4u/Comm.hpp" #include "simgrid/s4u/Mailbox.hpp" #include "src/instr/instr_private.hpp" #include "src/kernel/activity/ExecImpl.hpp" @@ -92,11 +93,8 @@ msg_error_t MSG_parallel_task_execute_with_timeout(msg_task_t task, double timeo status = MSG_HOST_FAILURE; } catch (simgrid::TimeoutError& e) { status = MSG_TIMEOUT; - } catch (xbt_ex& e) { - if (e.category == cancel_error) - status = MSG_TASK_CANCELED; - else - throw; + } catch (simgrid::CancelException& e) { + status = MSG_TASK_CANCELED; } /* action ended, set comm and compute = nullptr, the actions is already destroyed in the main function */ @@ -259,17 +257,13 @@ msg_error_t MSG_task_receive_ext_bounded(msg_task_t * task, const char *alias, d ret = MSG_HOST_FAILURE; } catch (simgrid::TimeoutError& e) { ret = MSG_TIMEOUT; + } catch (simgrid::CancelException& e) { + ret = MSG_HOST_FAILURE; } catch (xbt_ex& e) { - switch (e.category) { - case cancel_error: - ret = MSG_HOST_FAILURE; - break; - case network_error: + if (e.category == network_error) ret = MSG_TRANSFER_FAILURE; - break; - default: + else throw; - } } if (ret != MSG_HOST_FAILURE && ret != MSG_TRANSFER_FAILURE && ret != MSG_TIMEOUT) { @@ -487,12 +481,12 @@ int MSG_comm_testany(xbt_dynar_t comms) int finished_index = -1; /* Create the equivalent array with SIMIX objects: */ - std::vector s_comms; + std::vector 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(comm->s_comm.get())); } msg_error_t status = MSG_OK; @@ -582,20 +576,18 @@ int MSG_comm_waitany(xbt_dynar_t comms) { int finished_index = -1; - /* create the equivalent dynar with SIMIX objects */ - xbt_dynar_t s_comms = xbt_dynar_new(sizeof(smx_activity_t), [](void*ptr){ - intrusive_ptr_release(*(simgrid::kernel::activity::ActivityImpl**)ptr); - }); + /* Create the equivalent array with SIMIX objects: */ + std::vector s_comms; + s_comms.reserve(xbt_dynar_length(comms)); msg_comm_t comm; unsigned int cursor; xbt_dynar_foreach(comms, cursor, comm) { - intrusive_ptr_add_ref(comm->s_comm.get()); - xbt_dynar_push_as(s_comms, simgrid::kernel::activity::ActivityImpl*, comm->s_comm.get()); + s_comms.push_back(static_cast(comm->s_comm.get())); } msg_error_t status = MSG_OK; try { - finished_index = simcall_comm_waitany(s_comms, -1); + finished_index = simcall_comm_waitany(s_comms.data(), s_comms.size(), -1); } catch (simgrid::TimeoutError& e) { finished_index = e.value; status = MSG_TIMEOUT; @@ -610,7 +602,6 @@ int MSG_comm_waitany(xbt_dynar_t comms) } xbt_assert(finished_index != -1, "WaitAny returned -1"); - xbt_dynar_free(&s_comms); comm = xbt_dynar_get_as(comms, finished_index, msg_comm_t); /* the communication is finished */ @@ -649,15 +640,12 @@ msg_task_t MSG_comm_get_task(msg_comm_t comm) /** * @brief This function is called by SIMIX in kernel mode to copy the data of a comm. - * @param synchro the comm + * @param comm the comm * @param buff the data copied * @param buff_size size of the buffer */ -void MSG_comm_copy_data_from_SIMIX(smx_activity_t synchro, void* buff, size_t buff_size) +void MSG_comm_copy_data_from_SIMIX(simgrid::kernel::activity::CommImpl* comm, void* buff, size_t buff_size) { - simgrid::kernel::activity::CommImplPtr comm = - boost::static_pointer_cast(synchro); - SIMIX_comm_copy_pointer_callback(comm, buff, buff_size); // notify the user callback if any @@ -729,7 +717,11 @@ msg_error_t MSG_task_send_with_timeout(msg_task_t task, const char *alias, doubl msg_process_t process = MSG_process_self(); simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::by_name(alias); - TRACE_msg_task_put_start(task); + if (TRACE_actor_is_enabled()) { + container_t process_container = simgrid::instr::Container::by_name(instr_pid(MSG_process_self())); + std::string key = std::string("p") + std::to_string(task->counter); + simgrid::instr::Container::get_root()->get_link("ACTOR_TASK_LINK")->start_event(process_container, "SR", key); + } /* Prepare the task to send */ t_simdata = task->simdata; @@ -743,33 +735,26 @@ msg_error_t MSG_task_send_with_timeout(msg_task_t task, const char *alias, doubl /* Try to send it by calling SIMIX network layer */ try { - smx_activity_t comm = nullptr; /* MC needs the comm to be set to nullptr during the simix call */ - comm = simcall_comm_isend(SIMIX_process_self(), mailbox->get_impl(), t_simdata->bytes_amount, t_simdata->rate, task, - sizeof(void*), nullptr, nullptr, nullptr, nullptr, 0); + simgrid::s4u::CommPtr comm = mailbox->put_init(task, t_simdata->bytes_amount)->set_rate(t_simdata->rate); + t_simdata->comm = boost::static_pointer_cast(comm->get_impl()); + comm->start(); if (TRACE_is_enabled() && task->category != nullptr) - simgrid::simix::simcall([comm, task] { comm->set_category(task->category); }); - t_simdata->comm = boost::static_pointer_cast(comm); - simcall_comm_wait(comm, timeout); + simgrid::simix::simcall([comm, task] { comm->get_impl()->set_category(task->category); }); + comm->wait_for(timeout); } catch (simgrid::TimeoutError& e) { ret = MSG_TIMEOUT; - } - catch (xbt_ex& e) { - switch (e.category) { - case cancel_error: - ret = MSG_HOST_FAILURE; - break; - case network_error: + } catch (simgrid::CancelException& e) { + ret = MSG_HOST_FAILURE; + } catch (xbt_ex& e) { + if (e.category == network_error) ret = MSG_TRANSFER_FAILURE; - break; - default: + else throw; - } /* If the send failed, it is not used anymore */ t_simdata->setNotUsed(); } - TRACE_msg_task_put_end(); return ret; } @@ -807,14 +792,9 @@ msg_error_t MSG_task_send_with_timeout_bounded(msg_task_t task, const char *alia */ int MSG_task_listen_from(const char *alias) { - simgrid::s4u::MailboxPtr mbox = simgrid::s4u::Mailbox::by_name(alias); - simgrid::kernel::activity::CommImplPtr comm = - boost::static_pointer_cast(mbox->front()); - - if (not comm) - return -1; + simgrid::kernel::activity::CommImplPtr comm = simgrid::s4u::Mailbox::by_name(alias)->front(); - return MSG_process_get_PID(static_cast(comm->src_buff_)->simdata->sender); + return comm ? MSG_process_get_PID(static_cast(comm->src_buff_)->simdata->sender) : -1; } /**