- keep the global map in EngineImpl (not as a static global in
MailboxImpl.cpp)
- Delete mailboxes in ~EngineImpl() and get rid of SIMIX_mailbox_exit
- replace MailboxImpl::by_name_or_null and
MailboxImpl::by_name_or_create by Engine::mailbox_by_name_or_create
+ better match with what is done for hosts, links, and actors
+ Mailbox::by_name cause two searchs in the map. One to check if
name already points to a mailbox (by_name_or_null) and if not
search again before creating a new mailbox. As there is no
Mailbox::by_name_or_null, just keep the latter.
- Revalidate a bunch of tests (message ordering mostly)
14 files changed:
> [VM00:WRK00:(2) 0.000000] [cloud_masterworker/INFO] WRK00 is listening on mailbox(MBOX:WRK00)
> [node-0.simgrid.org:master:(1) 0.000000] [cloud_masterworker/INFO] put an actor (WRK01) on VM01
> [node-0.simgrid.org:master:(1) 0.000000] [cloud_masterworker/INFO] # Send to 2 worker actors
> [VM00:WRK00:(2) 0.000000] [cloud_masterworker/INFO] WRK00 is listening on mailbox(MBOX:WRK00)
> [node-0.simgrid.org:master:(1) 0.000000] [cloud_masterworker/INFO] put an actor (WRK01) on VM01
> [node-0.simgrid.org:master:(1) 0.000000] [cloud_masterworker/INFO] # Send to 2 worker actors
-> [node-0.simgrid.org:master:(1) 0.000000] [cloud_masterworker/INFO] Send to mailbox(MBOX:WRK00)
> [VM01:WRK01:(3) 0.000000] [cloud_masterworker/INFO] WRK01 is listening on mailbox(MBOX:WRK01)
> [VM01:WRK01:(3) 0.000000] [cloud_masterworker/INFO] WRK01 is listening on mailbox(MBOX:WRK01)
+> [node-0.simgrid.org:master:(1) 0.000000] [cloud_masterworker/INFO] Send to mailbox(MBOX:WRK00)
> [VM00:WRK00:(2) 0.090280] [cloud_masterworker/INFO] WRK00 received from mailbox(MBOX:WRK00)
> [node-0.simgrid.org:master:(1) 0.090280] [cloud_masterworker/INFO] Send to mailbox(MBOX:WRK01)
> [VM00:WRK00:(2) 0.100280] [cloud_masterworker/INFO] WRK00 executed
> [VM00:WRK00:(2) 0.090280] [cloud_masterworker/INFO] WRK00 received from mailbox(MBOX:WRK00)
> [node-0.simgrid.org:master:(1) 0.090280] [cloud_masterworker/INFO] Send to mailbox(MBOX:WRK01)
> [VM00:WRK00:(2) 0.100280] [cloud_masterworker/INFO] WRK00 executed
> [node-0.simgrid.org:master:(1) 10.000000] [cloud_masterworker/INFO] put an actor (WRK03) on VM01
> [VM00:WRK02:(4) 10.000000] [cloud_masterworker/INFO] WRK02 is listening on mailbox(MBOX:WRK02)
> [node-0.simgrid.org:master:(1) 10.000000] [cloud_masterworker/INFO] # Send to 4 worker actors
> [node-0.simgrid.org:master:(1) 10.000000] [cloud_masterworker/INFO] put an actor (WRK03) on VM01
> [VM00:WRK02:(4) 10.000000] [cloud_masterworker/INFO] WRK02 is listening on mailbox(MBOX:WRK02)
> [node-0.simgrid.org:master:(1) 10.000000] [cloud_masterworker/INFO] # Send to 4 worker actors
-> [node-0.simgrid.org:master:(1) 10.000000] [cloud_masterworker/INFO] Send to mailbox(MBOX:WRK00)
> [VM01:WRK03:(5) 10.000000] [cloud_masterworker/INFO] WRK03 is listening on mailbox(MBOX:WRK03)
> [VM01:WRK03:(5) 10.000000] [cloud_masterworker/INFO] WRK03 is listening on mailbox(MBOX:WRK03)
+> [node-0.simgrid.org:master:(1) 10.000000] [cloud_masterworker/INFO] Send to mailbox(MBOX:WRK00)
> [VM00:WRK00:(2) 10.090280] [cloud_masterworker/INFO] WRK00 received from mailbox(MBOX:WRK00)
> [node-0.simgrid.org:master:(1) 10.090280] [cloud_masterworker/INFO] Send to mailbox(MBOX:WRK01)
> [VM00:WRK00:(2) 10.100280] [cloud_masterworker/INFO] WRK00 executed
> [VM00:WRK00:(2) 10.090280] [cloud_masterworker/INFO] WRK00 received from mailbox(MBOX:WRK00)
> [node-0.simgrid.org:master:(1) 10.090280] [cloud_masterworker/INFO] Send to mailbox(MBOX:WRK01)
> [VM00:WRK00:(2) 10.100280] [cloud_masterworker/INFO] WRK00 executed
> [ 0.000000] (11:node@node-10.simgrid.org) Hi, I'm going to join the network with id 1023
> [ 0.000000] (12:node@node-11.simgrid.org) Hi, I'm going to join the network with id 2047
> [ 0.000000] (13:node@node-12.simgrid.org) Hi, I'm going to join the network with id 4095
> [ 0.000000] (11:node@node-10.simgrid.org) Hi, I'm going to join the network with id 1023
> [ 0.000000] (12:node@node-11.simgrid.org) Hi, I'm going to join the network with id 2047
> [ 0.000000] (13:node@node-12.simgrid.org) Hi, I'm going to join the network with id 4095
-> [780.000000] ( 7:node@node-6.simgrid.org) 5/5 FIND_NODE have succeeded
-> [780.000000] ( 9:node@node-8.simgrid.org) 6/6 FIND_NODE have succeeded
-> [780.000000] ( 3:node@node-2.simgrid.org) 5/5 FIND_NODE have succeeded
+> [780.000000] ( 9:node@node-8.simgrid.org) 5/5 FIND_NODE have succeeded
+> [780.000000] ( 3:node@node-2.simgrid.org) 6/6 FIND_NODE have succeeded
> [780.000000] ( 2:node@node-1.simgrid.org) 6/6 FIND_NODE have succeeded
> [780.000000] (11:node@node-10.simgrid.org) 6/6 FIND_NODE have succeeded
> [780.000000] ( 1:node@node-0.simgrid.org) 7/7 FIND_NODE have succeeded
> [780.000000] ( 2:node@node-1.simgrid.org) 6/6 FIND_NODE have succeeded
> [780.000000] (11:node@node-10.simgrid.org) 6/6 FIND_NODE have succeeded
> [780.000000] ( 1:node@node-0.simgrid.org) 7/7 FIND_NODE have succeeded
-> [780.000000] ( 5:node@node-4.simgrid.org) 6/6 FIND_NODE have succeeded
+> [780.000000] ( 5:node@node-4.simgrid.org) 5/5 FIND_NODE have succeeded
+> [780.000000] ( 6:node@node-5.simgrid.org) 6/6 FIND_NODE have succeeded
+> [780.000000] ( 7:node@node-6.simgrid.org) 5/5 FIND_NODE have succeeded
> [780.000000] (13:node@node-12.simgrid.org) 6/6 FIND_NODE have succeeded
> [780.000000] ( 8:node@node-7.simgrid.org) 5/5 FIND_NODE have succeeded
> [780.000000] (13:node@node-12.simgrid.org) 6/6 FIND_NODE have succeeded
> [780.000000] ( 8:node@node-7.simgrid.org) 5/5 FIND_NODE have succeeded
-> [780.000000] ( 6:node@node-5.simgrid.org) 5/5 FIND_NODE have succeeded
> [780.000000] (10:node@node-9.simgrid.org) 5/5 FIND_NODE have succeeded
> [780.000000] (12:node@node-11.simgrid.org) 6/6 FIND_NODE have succeeded
> [780.000000] ( 4:node@node-3.simgrid.org) 5/5 FIND_NODE have succeeded
> [780.000000] (10:node@node-9.simgrid.org) 5/5 FIND_NODE have succeeded
> [780.000000] (12:node@node-11.simgrid.org) 6/6 FIND_NODE have succeeded
> [780.000000] ( 4:node@node-3.simgrid.org) 5/5 FIND_NODE have succeeded
$ ${bindir:=.}/s4u-comm-ready ${platfdir}/small_platform_fatpipe.xml s4u-comm-ready_d.xml "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n"
> [ 0.000000] (1:peer@Tremblay) Send 'Message 0 from peer 0' to 'peer-1'
> [ 0.000000] (2:peer@Ruby) Send 'Message 0 from peer 1' to 'peer-0'
$ ${bindir:=.}/s4u-comm-ready ${platfdir}/small_platform_fatpipe.xml s4u-comm-ready_d.xml "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n"
> [ 0.000000] (1:peer@Tremblay) Send 'Message 0 from peer 0' to 'peer-1'
> [ 0.000000] (2:peer@Ruby) Send 'Message 0 from peer 1' to 'peer-0'
+> [ 0.000000] (3:peer@Perl) Send 'finalize' to 'peer-0'
> [ 0.000000] (1:peer@Tremblay) Send 'Message 0 from peer 0' to 'peer-2'
> [ 0.000000] (2:peer@Ruby) Send 'Message 0 from peer 1' to 'peer-2'
> [ 0.000000] (1:peer@Tremblay) Send 'Message 0 from peer 0' to 'peer-2'
> [ 0.000000] (2:peer@Ruby) Send 'Message 0 from peer 1' to 'peer-2'
-> [ 0.000000] (3:peer@Perl) Send 'finalize' to 'peer-0'
-> [ 0.000000] (1:peer@Tremblay) Send 'Message 1 from peer 0' to 'peer-1'
-> [ 0.000000] (2:peer@Ruby) Send 'Message 1 from peer 1' to 'peer-0'
> [ 0.000000] (3:peer@Perl) Send 'finalize' to 'peer-1'
> [ 0.000000] (3:peer@Perl) Done dispatching all messages
> [ 0.000000] (3:peer@Perl) Nothing ready to consume yet, I better sleep for a while
> [ 0.000000] (3:peer@Perl) Send 'finalize' to 'peer-1'
> [ 0.000000] (3:peer@Perl) Done dispatching all messages
> [ 0.000000] (3:peer@Perl) Nothing ready to consume yet, I better sleep for a while
+> [ 0.000000] (1:peer@Tremblay) Send 'Message 1 from peer 0' to 'peer-1'
+> [ 0.000000] (2:peer@Ruby) Send 'Message 1 from peer 1' to 'peer-0'
> [ 0.000000] (1:peer@Tremblay) Send 'Message 1 from peer 0' to 'peer-2'
> [ 0.000000] (2:peer@Ruby) Send 'Message 1 from peer 1' to 'peer-2'
> [ 0.000000] (2:peer@Ruby) Send 'Message 2 from peer 1' to 'peer-0'
> [ 0.000000] (1:peer@Tremblay) Send 'Message 1 from peer 0' to 'peer-2'
> [ 0.000000] (2:peer@Ruby) Send 'Message 1 from peer 1' to 'peer-2'
> [ 0.000000] (2:peer@Ruby) Send 'Message 2 from peer 1' to 'peer-0'
#!/usr/bin/env tesh
$ ${bindir:=.}/s4u-comm-waitall ${platfdir}/small_platform_fatpipe.xml s4u-comm-waitall_d.xml "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n"
#!/usr/bin/env tesh
$ ${bindir:=.}/s4u-comm-waitall ${platfdir}/small_platform_fatpipe.xml s4u-comm-waitall_d.xml "--log=root.fmt:[%10.6r]%e(%i:%a@%h)%e%m%n"
-> [ 0.000000] (1:sender@Tremblay) Send 'Message 0' to 'receiver-0'
> [ 0.000000] (2:receiver@Ruby) Wait for my first message
> [ 0.000000] (3:receiver@Perl) Wait for my first message
> [ 0.000000] (2:receiver@Ruby) Wait for my first message
> [ 0.000000] (3:receiver@Perl) Wait for my first message
+> [ 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 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] (12:node@node-11.simgrid.org) Hi, I'm going to join the network with id 2047
> [ 0.000000] (13:node@node-12.simgrid.org) Hi, I'm going to join the network with id 4095
> [780.000000] ( 7:node@node-6.simgrid.org) 5/5 FIND_NODE have succeeded
> [ 0.000000] (12:node@node-11.simgrid.org) Hi, I'm going to join the network with id 2047
> [ 0.000000] (13:node@node-12.simgrid.org) Hi, I'm going to join the network with id 4095
> [780.000000] ( 7:node@node-6.simgrid.org) 5/5 FIND_NODE have succeeded
-> [780.000000] ( 9:node@node-8.simgrid.org) 6/6 FIND_NODE have succeeded
-> [780.000000] ( 3:node@node-2.simgrid.org) 5/5 FIND_NODE have succeeded
+> [780.000000] ( 9:node@node-8.simgrid.org) 5/5 FIND_NODE have succeeded
+> [780.000000] ( 3:node@node-2.simgrid.org) 6/6 FIND_NODE have succeeded
> [780.000000] ( 2:node@node-1.simgrid.org) 6/6 FIND_NODE have succeeded
> [780.000000] (11:node@node-10.simgrid.org) 6/6 FIND_NODE have succeeded
> [780.000000] ( 1:node@node-0.simgrid.org) 7/7 FIND_NODE have succeeded
> [780.000000] ( 2:node@node-1.simgrid.org) 6/6 FIND_NODE have succeeded
> [780.000000] (11:node@node-10.simgrid.org) 6/6 FIND_NODE have succeeded
> [780.000000] ( 1:node@node-0.simgrid.org) 7/7 FIND_NODE have succeeded
-> [780.000000] ( 5:node@node-4.simgrid.org) 6/6 FIND_NODE have succeeded
+> [780.000000] ( 5:node@node-4.simgrid.org) 5/5 FIND_NODE have succeeded
> [780.000000] (13:node@node-12.simgrid.org) 6/6 FIND_NODE have succeeded
> [780.000000] ( 8:node@node-7.simgrid.org) 5/5 FIND_NODE have succeeded
> [780.000000] (13:node@node-12.simgrid.org) 6/6 FIND_NODE have succeeded
> [780.000000] ( 8:node@node-7.simgrid.org) 5/5 FIND_NODE have succeeded
-> [780.000000] ( 6:node@node-5.simgrid.org) 5/5 FIND_NODE have succeeded
+> [780.000000] ( 6:node@node-5.simgrid.org) 6/6 FIND_NODE have succeeded
> [780.000000] (10:node@node-9.simgrid.org) 5/5 FIND_NODE have succeeded
> [780.000000] (12:node@node-11.simgrid.org) 6/6 FIND_NODE have succeeded
> [780.000000] ( 4:node@node-3.simgrid.org) 5/5 FIND_NODE have succeeded
> [780.000000] (10:node@node-9.simgrid.org) 5/5 FIND_NODE have succeeded
> [780.000000] (12:node@node-11.simgrid.org) 6/6 FIND_NODE have succeeded
> [780.000000] ( 4:node@node-3.simgrid.org) 5/5 FIND_NODE have succeeded
$ ./masterworker_mailbox_smpi ${srcdir:=.}/../../platforms/small_platform_with_routers.xml ${srcdir:=.}/deployment_masterworker_mailbox_smpi.xml --log=smpi.:info --cfg=smpi/simulate-computation:no
> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'smpi/simulate-computation' to 'no'
> [0.000000] [smpi_config/INFO] You did not set the power of the host running the simulation. The timings will certainly not be accurate. Use the option "--cfg=smpi/host-speed:<flops>" to set its value. Check https://simgrid.org/doc/latest/Configuring_SimGrid.html#automatic-benchmarking-of-smpi-code for more information.
$ ./masterworker_mailbox_smpi ${srcdir:=.}/../../platforms/small_platform_with_routers.xml ${srcdir:=.}/deployment_masterworker_mailbox_smpi.xml --log=smpi.:info --cfg=smpi/simulate-computation:no
> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'smpi/simulate-computation' to 'no'
> [0.000000] [smpi_config/INFO] You did not set the power of the host running the simulation. The timings will certainly not be accurate. Use the option "--cfg=smpi/host-speed:<flops>" to set its value. Check https://simgrid.org/doc/latest/Configuring_SimGrid.html#automatic-benchmarking-of-smpi-code for more information.
-> [Tremblay:master:(1) 0.000000] [msg_test/INFO] Got 2 workers and 20 tasks to process
-> [Tremblay:master:(1) 0.000000] [msg_test/INFO] Sending task 0 of 20 to mailbox 'Ginette'
> [Ginette:master_mpi:(4) 0.000000] [msg_test/INFO] here for rank 0
> [Bourassa:master_mpi:(5) 0.000000] [msg_test/INFO] here for rank 1
> [Ginette:alltoall_mpi:(6) 0.000000] [msg_test/INFO] alltoall for rank 0
> [Bourassa:alltoall_mpi:(7) 0.000000] [msg_test/INFO] alltoall for rank 1
> [Jupiter:alltoall_mpi:(8) 0.000000] [msg_test/INFO] alltoall for rank 2
> [Fafard:alltoall_mpi:(9) 0.000000] [msg_test/INFO] alltoall for rank 3
> [Ginette:master_mpi:(4) 0.000000] [msg_test/INFO] here for rank 0
> [Bourassa:master_mpi:(5) 0.000000] [msg_test/INFO] here for rank 1
> [Ginette:alltoall_mpi:(6) 0.000000] [msg_test/INFO] alltoall for rank 0
> [Bourassa:alltoall_mpi:(7) 0.000000] [msg_test/INFO] alltoall for rank 1
> [Jupiter:alltoall_mpi:(8) 0.000000] [msg_test/INFO] alltoall for rank 2
> [Fafard:alltoall_mpi:(9) 0.000000] [msg_test/INFO] alltoall for rank 3
+> [Tremblay:master:(1) 0.000000] [msg_test/INFO] Got 2 workers and 20 tasks to process
+> [Tremblay:master:(1) 0.000000] [msg_test/INFO] Sending task 0 of 20 to mailbox 'Ginette'
> [Ginette:master_mpi:(4) 0.000000] [msg_test/INFO] After comm 0
> [Ginette:master_mpi:(4) 0.000000] [msg_test/INFO] After finalize 0 0
> [Bourassa:master_mpi:(5) 0.016871] [msg_test/INFO] After comm 1
> [Ginette:master_mpi:(4) 0.000000] [msg_test/INFO] After comm 0
> [Ginette:master_mpi:(4) 0.000000] [msg_test/INFO] After finalize 0 0
> [Bourassa:master_mpi:(5) 0.016871] [msg_test/INFO] After comm 1
Link* link_by_name(const std::string& name) const;
Link* link_by_name_or_null(const std::string& name) const;
Link* link_by_name(const std::string& name) const;
Link* link_by_name_or_null(const std::string& name) const;
+ Mailbox* mailbox_by_name_or_create(const std::string& name) const;
+
size_t get_actor_count() const;
std::vector<ActorPtr> get_all_actors() const;
std::vector<ActorPtr> get_filtered_actors(const std::function<bool(ActorPtr)>& filter) const;
size_t get_actor_count() const;
std::vector<ActorPtr> get_all_actors() const;
std::vector<ActorPtr> get_filtered_actors(const std::function<bool(ActorPtr)>& filter) const;
if (kv.second)
kv.second->destroy();
if (kv.second)
kv.second->destroy();
- /* Free the remaining data structures */
+ for (auto const& kv : mailboxes_)
+ delete kv.second;
+
+ /* Free the remaining data structures */
#if SIMGRID_HAVE_MC
xbt_dynar_free(&actors_vector_);
xbt_dynar_free(&dead_actors_vector_);
#if SIMGRID_HAVE_MC
xbt_dynar_free(&actors_vector_);
xbt_dynar_free(&dead_actors_vector_);
std::map<std::string, s4u::Host*, std::less<>> hosts_;
std::map<std::string, resource::LinkImpl*, std::less<>> links_;
std::unordered_map<std::string, routing::NetPoint*> netpoints_;
std::map<std::string, s4u::Host*, std::less<>> hosts_;
std::map<std::string, resource::LinkImpl*, std::less<>> links_;
std::unordered_map<std::string, routing::NetPoint*> netpoints_;
+ std::unordered_map<std::string, activity::MailboxImpl*> mailboxes_;
+
std::unordered_map<std::string, actor::ActorCodeFactory> registered_functions; // Maps function names to actor code
actor::ActorCodeFactory default_function; // Function to use as a fallback when the provided name matches nothing
std::vector<resource::Model*> models_;
std::unordered_map<std::string, actor::ActorCodeFactory> registered_functions; // Maps function names to actor code
actor::ActorCodeFactory default_function; // Function to use as a fallback when the provided name matches nothing
std::vector<resource::Model*> models_;
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_mailbox, simix, "Mailbox implementation");
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_mailbox, simix, "Mailbox implementation");
-static std::unordered_map<std::string, smx_mailbox_t> mailboxes;
-
-void SIMIX_mailbox_exit()
-{
- for (auto const& elm : mailboxes)
- delete elm.second;
- mailboxes.clear();
-}
-
/******************************************************************************/
/* Rendez-Vous Points */
/******************************************************************************/
/******************************************************************************/
/* Rendez-Vous Points */
/******************************************************************************/
namespace simgrid {
namespace kernel {
namespace activity {
namespace simgrid {
namespace kernel {
namespace activity {
-/** @brief Returns the mailbox of that name, or nullptr */
-MailboxImpl* MailboxImpl::by_name_or_null(const std::string& name)
-{
- auto mbox = mailboxes.find(name);
- if (mbox != mailboxes.end())
- return mbox->second;
- else
- return nullptr;
-}
-/** @brief Returns the mailbox of that name, newly created on need */
-MailboxImpl* MailboxImpl::by_name_or_create(const std::string& name)
-{
- /* two actors may have pushed the same mbox_create simcall at the same time */
- auto m = mailboxes.find(name);
- if (m == mailboxes.end()) {
- auto* mbox = new MailboxImpl(name);
- XBT_DEBUG("Creating a mailbox at %p with name %s", mbox, name.c_str());
- mailboxes[name] = mbox;
- return mbox;
- } else
- return m->second;
-}
/** @brief set the receiver of the mailbox to allow eager sends
* @param actor The receiving dude
*/
/** @brief set the receiver of the mailbox to allow eager sends
* @param actor The receiving dude
*/
#include <boost/circular_buffer.hpp>
#include <xbt/string.hpp>
#include <boost/circular_buffer.hpp>
#include <xbt/string.hpp>
+#include "simgrid/s4u/Engine.hpp"
#include "simgrid/s4u/Mailbox.hpp"
#include "src/kernel/activity/CommImpl.hpp"
#include "src/kernel/actor/ActorImpl.hpp"
#include "simgrid/s4u/Mailbox.hpp"
#include "src/kernel/activity/CommImpl.hpp"
#include "src/kernel/actor/ActorImpl.hpp"
s4u::Mailbox piface_;
xbt::string name_;
s4u::Mailbox piface_;
xbt::string name_;
+ friend s4u::Engine;
+ friend s4u::Mailbox* s4u::Engine::mailbox_by_name_or_create(const std::string& name) const;
friend s4u::Mailbox;
friend s4u::Mailbox* s4u::Mailbox::by_name(const std::string& name);
friend mc::CommunicationDeterminismChecker;
friend s4u::Mailbox;
friend s4u::Mailbox* s4u::Mailbox::by_name(const std::string& name);
friend mc::CommunicationDeterminismChecker;
explicit MailboxImpl(const std::string& name) : piface_(this), name_(name) {}
public:
explicit MailboxImpl(const std::string& name) : piface_(this), name_(name) {}
public:
+ /** @brief Public interface */
+ const s4u::Mailbox* get_iface() const { return &piface_; }
+ s4u::Mailbox* get_iface() { return &piface_; }
+
const xbt::string& get_name() const { return name_; }
const char* get_cname() const { return name_.c_str(); }
const xbt::string& get_name() const { return name_; }
const char* get_cname() const { return name_.c_str(); }
- static MailboxImpl* by_name_or_null(const std::string& name);
- static MailboxImpl* by_name_or_create(const std::string& name);
void set_receiver(s4u::ActorPtr actor);
void push(CommImplPtr comm);
void remove(const CommImplPtr& comm);
void set_receiver(s4u::ActorPtr actor);
void push(CommImplPtr comm);
void remove(const CommImplPtr& comm);
} // namespace kernel
} // namespace simgrid
} // namespace kernel
} // namespace simgrid
-XBT_PRIVATE void SIMIX_mailbox_exit();
-
return link == pimpl->links_.end() ? nullptr : link->second->get_iface();
}
return link == pimpl->links_.end() ? nullptr : link->second->get_iface();
}
+/** @brief Find a mailox from its name or create one if it does not exist) */
+Mailbox* Engine::mailbox_by_name_or_create(const std::string& name) const
+{
+ /* two actors may have pushed the same mbox_create simcall at the same time */
+ kernel::activity::MailboxImpl* mbox = kernel::actor::simcall([&name, this] {
+ auto m = pimpl->mailboxes_.find(name);
+ if (m == pimpl->mailboxes_.end()) {
+ auto* mbox = new kernel::activity::MailboxImpl(name);
+ XBT_DEBUG("Creating a mailbox at %p with name %s", mbox, name.c_str());
+ pimpl->mailboxes_[name] = mbox;
+ return mbox;
+ } else
+ return m->second;
+ });
+ return mbox->get_iface();
+}
+
void Engine::link_register(const std::string& name, const Link* link)
{
pimpl->links_[name] = link->get_impl();
void Engine::link_register(const std::string& name, const Link* link)
{
pimpl->links_[name] = link->get_impl();
* under the terms of the license (GNU LGPL) which comes with this package. */
#include "simgrid/s4u/Comm.hpp"
* under the terms of the license (GNU LGPL) which comes with this package. */
#include "simgrid/s4u/Comm.hpp"
+#include "simgrid/s4u/Engine.hpp"
#include "simgrid/s4u/Mailbox.hpp"
#include "src/kernel/activity/MailboxImpl.hpp"
#include "simgrid/s4u/Mailbox.hpp"
#include "src/kernel/activity/MailboxImpl.hpp"
Mailbox* Mailbox::by_name(const std::string& name)
{
Mailbox* Mailbox::by_name(const std::string& name)
{
- kernel::activity::MailboxImpl* mbox = kernel::activity::MailboxImpl::by_name_or_null(name);
- if (mbox == nullptr) {
- mbox = kernel::actor::simcall([&name] { return kernel::activity::MailboxImpl::by_name_or_create(name); });
- }
- return &mbox->piface_;
+ return Engine::get_instance()->mailbox_by_name_or_create(name);
}
bool Mailbox::empty() const
}
bool Mailbox::empty() const
engine->run_all_actors();
engine->empty_trash();
engine->run_all_actors();
engine->empty_trash();
- /* Exit the SIMIX network module */
- SIMIX_mailbox_exit();
-
-
/* Let's free maestro now */
delete simix_global->maestro_;
simix_global->maestro_ = nullptr;
/* Let's free maestro now */
delete simix_global->maestro_;
simix_global->maestro_ = nullptr;