A
lgorithmique
N
umérique
D
istribuée
Public GIT Repository
projects
/
simgrid.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Remove MSG. Its EOL was scheduled for 2020
[simgrid.git]
/
src
/
kernel
/
activity
/
MailboxImpl.cpp
diff --git
a/src/kernel/activity/MailboxImpl.cpp
b/src/kernel/activity/MailboxImpl.cpp
index
7af7743
..
7bbb815
100644
(file)
--- a/
src/kernel/activity/MailboxImpl.cpp
+++ b/
src/kernel/activity/MailboxImpl.cpp
@@
-1,4
+1,4
@@
-/* Copyright (c) 2007-202
2
. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2007-202
3
. 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. */
/* 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. */
@@
-14,15
+14,17
@@
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(ker_mailbox, kernel, "Mailbox implementation");
/* Rendez-Vous Points */
/******************************************************************************/
/* Rendez-Vous Points */
/******************************************************************************/
-namespace simgrid {
-namespace kernel {
-namespace activity {
+namespace simgrid::kernel::activity {
unsigned MailboxImpl::next_id_ = 0;
MailboxImpl::~MailboxImpl()
{
unsigned MailboxImpl::next_id_ = 0;
MailboxImpl::~MailboxImpl()
{
- clear();
+ try {
+ clear(false);
+ } catch (const std::bad_alloc& ba) {
+ XBT_ERROR("MailboxImpl::clear() failure: %s", ba.what());
+ }
set_receiver(nullptr);
}
set_receiver(nullptr);
}
@@
-32,7
+34,7
@@
MailboxImpl::~MailboxImpl()
void MailboxImpl::set_receiver(s4u::ActorPtr actor)
{
if (this->permanent_receiver_) {
void MailboxImpl::set_receiver(s4u::ActorPtr actor)
{
if (this->permanent_receiver_) {
- std::vector<MailboxImpl*>& mboxes = this->permanent_receiver_->mailboxes;
+ std::vector<MailboxImpl*>& mboxes = this->permanent_receiver_->mailboxes
_
;
mboxes.erase(std::remove(mboxes.begin(), mboxes.end(), this), mboxes.end());
}
mboxes.erase(std::remove(mboxes.begin(), mboxes.end(), this), mboxes.end());
}
@@
-69,26
+71,31
@@
void MailboxImpl::remove(const CommImplPtr& comm)
/** @brief Removes all communication activities from a mailbox
*/
/** @brief Removes all communication activities from a mailbox
*/
-void MailboxImpl::clear()
+void MailboxImpl::clear(
bool do_post
)
{
{
+ // CommImpl::cancel() will remove the comm from the mailbox..
for (auto comm : done_comm_queue_) {
comm->cancel();
for (auto comm : done_comm_queue_) {
comm->cancel();
- comm->set_state(State::DST_HOST_FAILURE);
+ comm->set_state(State::FAILED);
+ if(do_post)
+ comm->post();
}
done_comm_queue_.clear();
}
done_comm_queue_.clear();
- // CommImpl::cancel() will remove the comm from the mailbox..
while (not comm_queue_.empty()) {
auto comm = comm_queue_.back();
if (comm->get_state() == State::WAITING && not comm->is_detached()) {
comm->cancel();
while (not comm_queue_.empty()) {
auto comm = comm_queue_.back();
if (comm->get_state() == State::WAITING && not comm->is_detached()) {
comm->cancel();
- comm->set_state(State::DST_HOST_FAILURE);
+ comm->set_state(State::FAILED);
+ if(do_post)
+ comm->post();
} else
comm_queue_.pop_back();
}
} else
comm_queue_.pop_back();
}
+ xbt_assert(comm_queue_.empty() && done_comm_queue_.empty());
}
}
-CommImplPtr MailboxImpl::iprobe(int type,
bool (*match_fun)(void*, void*, CommImpl*)
, void* data)
+CommImplPtr MailboxImpl::iprobe(int type,
const std::function<bool(void*, void*, CommImpl*)>& match_fun
, void* data)
{
XBT_DEBUG("iprobe from %p %p", this, &comm_queue_);
{
XBT_DEBUG("iprobe from %p %p", this, &comm_queue_);
@@
-123,7
+130,8
@@
CommImplPtr MailboxImpl::iprobe(int type, bool (*match_fun)(void*, void*, CommIm
* @param remove_matching whether or not to clean the found object from the queue
* @return The communication activity if found, nullptr otherwise
*/
* @param remove_matching whether or not to clean the found object from the queue
* @return The communication activity if found, nullptr otherwise
*/
-CommImplPtr MailboxImpl::find_matching_comm(CommImplType type, bool (*match_fun)(void*, void*, CommImpl*),
+CommImplPtr MailboxImpl::find_matching_comm(CommImplType type,
+ const std::function<bool(void*, void*, CommImpl*)>& match_fun,
void* this_user_data, const CommImplPtr& my_synchro, bool done,
bool remove_matching)
{
void* this_user_data, const CommImplPtr& my_synchro, bool done,
bool remove_matching)
{
@@
-148,6
+156,4
@@
CommImplPtr MailboxImpl::find_matching_comm(CommImplType type, bool (*match_fun)
comm_queue.erase(iter);
return comm_cpy;
}
comm_queue.erase(iter);
return comm_cpy;
}
-} // namespace activity
-} // namespace kernel
-} // namespace simgrid
+} // namespace simgrid::kernel::activity