From: Frederic Suter Date: Tue, 4 Feb 2020 08:34:03 +0000 (+0100) Subject: fix refcounting issues X-Git-Tag: v3.26~1060 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/ed1e833154dee7dd68eb7bcae79d33592936201a fix refcounting issues --- diff --git a/include/simgrid/forward.h b/include/simgrid/forward.h index 4c1db01539..3477e16146 100644 --- a/include/simgrid/forward.h +++ b/include/simgrid/forward.h @@ -192,7 +192,7 @@ class VirtualMachineImpl; typedef simgrid::s4u::Actor s4u_Actor; typedef simgrid::s4u::Barrier s4u_Barrier; -typedef simgrid::s4u::CommPtr s4u_CommPtr; +typedef simgrid::s4u::Comm s4u_Comm; typedef simgrid::s4u::Host s4u_Host; typedef simgrid::s4u::Link s4u_Link; typedef simgrid::s4u::File s4u_File; @@ -217,7 +217,7 @@ typedef simgrid::kernel::activity::State e_smx_state_t; typedef struct s4u_Actor s4u_Actor; typedef struct s4u_Barrier s4u_Barrier; -typedef struct s4u_Comm* s4u_CommPtr; +typedef struct s4u_Comm s4u_Comm; typedef struct s4u_Host s4u_Host; typedef struct s4u_Link s4u_Link; typedef struct s4u_File s4u_File; @@ -245,8 +245,8 @@ typedef struct s_smx_sem* smx_sem_t; typedef s4u_Barrier* sg_bar_t; /** Constant pointer to a SimGrid barrier object */ typedef const s4u_Barrier* const_sg_bar_t; -typedef s4u_CommPtr sg_comm_t; -typedef const s4u_CommPtr const_sg_comm_t; +typedef s4u_Comm* sg_comm_t; +typedef const s4u_Comm* const_sg_comm_t; typedef s4u_ConditionVariable* sg_cond_t; typedef const s4u_ConditionVariable* const_sg_cond_t; typedef s4u_Mailbox* sg_mailbox_t; diff --git a/include/simgrid/s4u/Activity.hpp b/include/simgrid/s4u/Activity.hpp index 1757964d85..75e5d98b85 100644 --- a/include/simgrid/s4u/Activity.hpp +++ b/include/simgrid/s4u/Activity.hpp @@ -55,6 +55,7 @@ protected: } public: + kernel::activity::ActivityImpl* get_impl() { return pimpl_.get(); } void vetoable_start() { state_ = State::STARTING; diff --git a/src/s4u/s4u_Comm.cpp b/src/s4u/s4u_Comm.cpp index 670caa547e..4391ce07fb 100644 --- a/src/s4u/s4u_Comm.cpp +++ b/src/s4u/s4u_Comm.cpp @@ -260,7 +260,10 @@ int sg_comm_wait_any_for(const xbt_dynar_t comms, double timeout) unsigned int i; sg_comm_t comm; xbt_dynar_foreach (comms, i, comm) { - s4u_comms.push_back(comm); + s4u_comms.emplace_back(comm); } - return simgrid::s4u::Comm::wait_any_for(&s4u_comms, timeout); + int pos = simgrid::s4u::Comm::wait_any_for(&s4u_comms, timeout); + if (pos != -1) + intrusive_ptr_release(xbt_dynar_get_as(comms, pos, sg_comm_t)); + return pos; } diff --git a/src/s4u/s4u_Mailbox.cpp b/src/s4u/s4u_Mailbox.cpp index 395ae73c1e..0b565a6556 100644 --- a/src/s4u/s4u_Mailbox.cpp +++ b/src/s4u/s4u_Mailbox.cpp @@ -173,7 +173,7 @@ const char* sg_mailbox_get_name(sg_mailbox_t mailbox) sg_comm_t sg_mailbox_put_async(sg_mailbox_t mailbox, void* payload, long simulated_size_in_bytes) { - return mailbox->put_async(payload, simulated_size_in_bytes); + return (mailbox->put_async(payload, simulated_size_in_bytes)).detach(); } /** @brief Set the mailbox to receive in asynchronous mode diff --git a/teshsuite/c/async-waitany/async-waitany.c b/teshsuite/c/async-waitany/async-waitany.c index 04ac7e4137..c7475e5796 100644 --- a/teshsuite/c/async-waitany/async-waitany.c +++ b/teshsuite/c/async-waitany/async-waitany.c @@ -25,34 +25,33 @@ static int sender(int argc, char* argv[]) /* Dynar in which we store all ongoing communications */ xbt_dynar_t pending_comms = xbt_dynar_new(sizeof(sg_comm_t), NULL); - ; /* Make a dynar of the mailboxes to use */ xbt_dynar_t mboxes = xbt_dynar_new(sizeof(sg_mailbox_t), NULL); for (long i = 0; i < receivers_count; i++) { char mailbox_name[80]; snprintf(mailbox_name, 79, "receiver-%ld", (i)); - xbt_dynar_push_as(mboxes, sg_mailbox_t, sg_mailbox_by_name(mailbox_name)); + sg_mailbox_t mbox = sg_mailbox_by_name(mailbox_name); + xbt_dynar_push(mboxes, &mbox); } /* Start dispatching all messages to receivers, in a round robin fashion */ for (int i = 0; i < messages_count; i++) { char msg_content[80]; snprintf(msg_content, 79, "Message_%d", i); - sg_mailbox_t mbox = (sg_mailbox_t)xbt_dynar_get_ptr(mboxes, i % receivers_count); - + sg_mailbox_t mbox = xbt_dynar_get_as(mboxes, i % receivers_count, sg_mailbox_t); XBT_INFO("Send '%s' to '%s'", msg_content, sg_mailbox_get_name(mbox)); sg_comm_t comm = sg_mailbox_put_async(mbox, xbt_strdup(msg_content), msg_size); - xbt_dynar_push_as(pending_comms, sg_comm_t, comm); + xbt_dynar_push(pending_comms, &comm); } /* Start sending messages to let the workers know that they should stop */ for (int i = 0; i < receivers_count; i++) { XBT_INFO("Send 'finalize' to 'receiver-%d'", i); char* end_msg = xbt_strdup("finalize"); - sg_comm_t comm = sg_mailbox_put_async((sg_mailbox_t)xbt_dynar_get_ptr(mboxes, i % receivers_count), end_msg, 0); - xbt_dynar_push_as(pending_comms, sg_comm_t, comm); - xbt_free(end_msg); + sg_mailbox_t mbox = xbt_dynar_get_as(mboxes, i % receivers_count, sg_mailbox_t); + sg_comm_t comm = sg_mailbox_put_async(mbox, end_msg, 0); + xbt_dynar_push(pending_comms, &comm); } XBT_INFO("Done dispatching all messages"); diff --git a/teshsuite/c/async-waitany/async-waitany.tesh b/teshsuite/c/async-waitany/async-waitany.tesh index 4027e42175..9c959b406a 100644 --- a/teshsuite/c/async-waitany/async-waitany.tesh +++ b/teshsuite/c/async-waitany/async-waitany.tesh @@ -1,34 +1,28 @@ #!/usr/bin/env tesh -p Testing the MSG_comm_waitany function - ! output sort 19 $ ${bindir:=.}/async-waitany ${platfdir:=.}/small_platform.xml ${srcdir:=.}/async-waitany_d.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" -> [ 0.000000] (1:sender@Tremblay) Send to receiver-0 Task_0 comm_size 1000000.000000 -> [ 0.000000] (1:sender@Tremblay) Send to receiver-1 Task_1 comm_size 1000000.000000 -> [ 0.000000] (1:sender@Tremblay) Send to receiver-0 Task_2 comm_size 1000000.000000 -> [ 0.000000] (1:sender@Tremblay) Send to receiver-1 Task_3 comm_size 1000000.000000 -> [ 0.000000] (1:sender@Tremblay) Send to receiver-0 Task_4 comm_size 1000000.000000 -> [ 0.000000] (1:sender@Tremblay) Send to receiver-1 Task_5 comm_size 1000000.000000 -> [ 10.000000] (2:receiver@Fafard) Wait to receive task 0 -> [ 10.000000] (2:receiver@Fafard) Wait to receive task 1 -> [ 10.000000] (2:receiver@Fafard) Wait to receive task 2 -> [ 10.000000] (3:receiver@Jupiter) Wait to receive task 0 -> [ 10.000000] (3:receiver@Jupiter) Wait to receive task 1 -> [ 10.000000] (3:receiver@Jupiter) Wait to receive task 2 -> [ 10.423774] (2:receiver@Fafard) Processing "Task_4" -> [ 10.469435] (3:receiver@Jupiter) Processing "Task_5" -> [ 11.079116] (2:receiver@Fafard) "Task_4" done -> [ 11.079116] (2:receiver@Fafard) Processing "Task_0" -> [ 11.124778] (3:receiver@Jupiter) "Task_5" done -> [ 11.124778] (3:receiver@Jupiter) Processing "Task_1" -> [ 11.734459] (2:receiver@Fafard) "Task_0" done -> [ 11.734459] (2:receiver@Fafard) Processing "Task_2" -> [ 11.780120] (3:receiver@Jupiter) "Task_1" done -> [ 11.780120] (3:receiver@Jupiter) Processing "Task_3" -> [ 12.389801] (2:receiver@Fafard) "Task_2" done -> [ 12.415509] (2:receiver@Fafard) I'm done. See you! -> [ 12.435462] (3:receiver@Jupiter) "Task_3" done -> [ 12.454477] (0:maestro@) Simulation time 12.4545 -> [ 12.454477] (1:sender@Tremblay) Goodbye now! -> [ 12.454477] (3:receiver@Jupiter) I'm done. See you! +> [ 0.000000] (1:sender@Tremblay) Send 'Message_0' to 'receiver-0' +> [ 0.000000] (1:sender@Tremblay) Send 'Message_1' to 'receiver-1' +> [ 0.000000] (1:sender@Tremblay) Send 'Message_2' to 'receiver-0' +> [ 0.000000] (1:sender@Tremblay) Send 'Message_3' to 'receiver-1' +> [ 0.000000] (1:sender@Tremblay) Send 'Message_4' to 'receiver-0' +> [ 0.000000] (1:sender@Tremblay) Send 'Message_5' to 'receiver-1' +> [ 0.000000] (1:sender@Tremblay) Send 'finalize' to 'receiver-0' +> [ 0.000000] (1:sender@Tremblay) Send 'finalize' to 'receiver-1' +> [ 0.000000] (1:sender@Tremblay) Done dispatching all messages +> [ 0.000000] (2:receiver@Fafard) Wait for my first message on 'receiver-0' +> [ 0.000000] (3:receiver@Jupiter) Wait for my first message on 'receiver-1' +> [ 0.158397] (2:receiver@Fafard) I got a 'Message_0'. +> [ 0.169155] (3:receiver@Jupiter) I got a 'Message_1'. +> [ 0.316794] (2:receiver@Fafard) I got a 'Message_2'. +> [ 0.338309] (3:receiver@Jupiter) I got a 'Message_3'. +> [ 0.475190] (2:receiver@Fafard) I got a 'Message_4'. +> [ 0.500898] (1:sender@Tremblay) Remove the 1th pending comm: it terminated earlier than another comm that was initiated first. +> [ 0.500898] (2:receiver@Fafard) I got a 'finalize'. +> [ 0.500898] (2:receiver@Fafard) I'm done. See you! +> [ 0.507464] (3:receiver@Jupiter) I got a 'Message_5'. +> [ 0.526478] (0:maestro@) Simulation time 0.526478 +> [ 0.526478] (1:sender@Tremblay) Goodbye now! +> [ 0.526478] (3:receiver@Jupiter) I got a 'finalize'. +> [ 0.526478] (3:receiver@Jupiter) I'm done. See you! \ No newline at end of file