-/* Copyright (c) 2007-2021. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2007-2022. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
#include <unordered_map>
-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();
-}
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(ker_mailbox, kernel, "Mailbox implementation");
/******************************************************************************/
/* Rendez-Vous Points */
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;
+unsigned MailboxImpl::next_id_ = 0;
+
+
+MailboxImpl::~MailboxImpl() {
+ clear();
+ set_receiver(nullptr);
}
+
+
/** @brief set the receiver of the mailbox to allow eager sends
* @param actor The receiving dude
*/
void MailboxImpl::set_receiver(s4u::ActorPtr actor)
{
+ if(this->permanent_receiver_) {
+ std::vector<MailboxImpl*>& mboxes=this->permanent_receiver_->mailboxes;
+ mboxes.erase(std::remove(mboxes.begin(), mboxes.end(),this), mboxes.end());
+ }
+
if (actor != nullptr)
this->permanent_receiver_ = actor->get_impl();
else
this->permanent_receiver_ = nullptr;
+
}
/** @brief Pushes a communication activity into a mailbox
* @param comm What to add
}
xbt_die("Comm %p not found in mailbox %s", comm.get(), this->get_cname());
}
+
+/** @brief Removes all communication activities from a mailbox
+*/
+void MailboxImpl::clear()
+{
+ for( auto comm : done_comm_queue_ ) {
+ comm->cancel();
+ comm->set_state(State::DST_HOST_FAILURE);
+ }
+ done_comm_queue_.clear();
+
+ //CommImpl::cancel() will remove the comm from the mailbox..
+ while( !comm_queue_.empty() ) {
+ auto comm=comm_queue_.back();
+ if(comm->get_state() == State::WAITING && !comm->detached()) {
+ comm->cancel();
+ comm->set_state(State::DST_HOST_FAILURE);
+ } else
+ comm_queue_.pop_back();
+ }
+
+}
CommImplPtr MailboxImpl::iprobe(int type, bool (*match_fun)(void*, void*, CommImpl*), void* data)
{