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;
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;
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;
}
public:
+ kernel::activity::ActivityImpl* get_impl() { return pimpl_.get(); }
void vetoable_start()
{
state_ = State::STARTING;
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;
}
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
/* 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");
#!/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