Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Minimal change to support host on-off and permanent mailboxes
[simgrid.git] / src / kernel / activity / MailboxImpl.cpp
index 0403639..20c12e3 100644 (file)
@@ -1,4 +1,4 @@
-/* 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. */
@@ -8,7 +8,7 @@
 
 #include <unordered_map>
 
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_mailbox, simix, "Mailbox implementation");
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(ker_mailbox, kernel, "Mailbox implementation");
 
 /******************************************************************************/
 /*                           Rendez-Vous Points                               */
@@ -18,15 +18,30 @@ namespace simgrid {
 namespace kernel {
 namespace activity {
 
+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
@@ -53,6 +68,28 @@ void MailboxImpl::remove(const CommImplPtr& comm)
     }
   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)
 {