Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
fix refcounting issues
authorFrederic Suter <frederic.suter@cc.in2p3.fr>
Tue, 4 Feb 2020 08:34:03 +0000 (09:34 +0100)
committerFrederic Suter <frederic.suter@cc.in2p3.fr>
Tue, 4 Feb 2020 08:34:03 +0000 (09:34 +0100)
include/simgrid/forward.h
include/simgrid/s4u/Activity.hpp
src/s4u/s4u_Comm.cpp
src/s4u/s4u_Mailbox.cpp
teshsuite/c/async-waitany/async-waitany.c
teshsuite/c/async-waitany/async-waitany.tesh

index 4c1db01..3477e16 100644 (file)
@@ -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;
index 1757964..75e5d98 100644 (file)
@@ -55,6 +55,7 @@ protected:
   }
 
 public:
+  kernel::activity::ActivityImpl* get_impl() { return pimpl_.get(); }
   void vetoable_start()
   {
     state_ = State::STARTING;
index 670caa5..4391ce0 100644 (file)
@@ -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;
 }
index 395ae73..0b565a6 100644 (file)
@@ -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
index 04ac7e4..c7475e5 100644 (file)
@@ -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");
index 4027e42..9c959b4 100644 (file)
@@ -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