1 /* Copyright (c) 2015-2023. The SimGrid Team. All rights reserved. */
3 /* This program is free software; you can redistribute it and/or modify it
4 * under the terms of the license (GNU LGPL) which comes with this package. */
6 #ifndef SIMGRID_MC_TRANSITION_COMM_HPP
7 #define SIMGRID_MC_TRANSITION_COMM_HPP
9 #include "src/kernel/actor/SimcallObserver.hpp"
10 #include "src/mc/transition/Transition.hpp"
16 namespace simgrid::mc {
18 class CommRecvTransition;
19 class CommSendTransition;
20 class CommTestTransition;
22 class CommWaitTransition : public Transition {
31 friend CommRecvTransition;
32 friend CommSendTransition;
33 friend CommTestTransition;
36 CommWaitTransition(aid_t issuer, int times_considered, bool timeout_, uintptr_t comm_, aid_t sender_, aid_t receiver_,
37 unsigned mbox_, uintptr_t sbuff_, uintptr_t rbuff_, size_t size_);
38 CommWaitTransition(aid_t issuer, int times_considered, std::stringstream& stream);
39 std::string to_string(bool verbose) const override;
40 bool depends(const Transition* other) const override;
42 bool get_timeout() const { return timeout_; }
43 /** Address of the corresponding Communication object in the application */
44 uintptr_t get_comm() const { return comm_; }
46 aid_t get_sender() const { return sender_; }
48 aid_t get_receiver() const { return receiver_; }
50 unsigned get_mailbox() const { return mbox_; }
52 uintptr_t get_sbuff() const { return sbuff_; }
53 /** Receiver buffer */
54 uintptr_t get_rbuff() const { return rbuff_; }
56 size_t get_size() const { return size_; }
58 class CommTestTransition : public Transition {
66 friend CommSendTransition;
67 friend CommRecvTransition;
70 CommTestTransition(aid_t issuer, int times_considered, std::stringstream& stream);
71 std::string to_string(bool verbose) const override;
72 bool depends(const Transition* other) const override;
74 /** Address of the corresponding Communication object in the application */
75 uintptr_t get_comm() const { return comm_; }
77 aid_t get_sender() const { return sender_; }
79 aid_t get_receiver() const { return receiver_; }
81 unsigned get_mailbox() const { return mbox_; }
83 uintptr_t get_sbuff() const { return sbuff_; }
84 /** Receiver buffer */
85 uintptr_t get_rbuff() const { return rbuff_; }
87 size_t get_size() const { return size_; }
90 class CommRecvTransition : public Transition {
91 uintptr_t comm_; /* Addr of the CommImpl */
97 CommRecvTransition(aid_t issuer, int times_considered, uintptr_t comm_, unsigned mbox_, uintptr_t rbuff_, int tag_);
98 CommRecvTransition(aid_t issuer, int times_considered, std::stringstream& stream);
99 std::string to_string(bool verbose) const override;
100 bool depends(const Transition* other) const override;
102 /** Address of the corresponding Communication object in the application */
103 uintptr_t get_comm() const { return comm_; }
105 unsigned get_mailbox() const { return mbox_; }
106 /** Receiver buffer */
107 uintptr_t get_rbuff() const { return rbuff_; }
108 /** If using SMPI, the tag */
109 int get_tag() const { return tag_; }
112 class CommSendTransition : public Transition {
113 uintptr_t comm_; /* Addr of the CommImpl */
120 CommSendTransition(aid_t issuer, int times_considered, uintptr_t comm_, unsigned mbox_, uintptr_t sbuff_,
121 size_t size_, int tag_);
122 CommSendTransition(aid_t issuer, int times_considered, std::stringstream& stream);
123 std::string to_string(bool verbose) const override;
124 bool depends(const Transition* other) const override;
126 /** Address of the corresponding Communication object in the application */
127 uintptr_t get_comm() const { return comm_; }
129 unsigned get_mailbox() const { return mbox_; }
131 uintptr_t get_sbuff() const { return sbuff_; }
133 size_t get_size() const { return size_; }
134 /** If using SMPI, the tag */
135 int get_tag() const { return tag_; }
138 /** Make a new transition from serialized description */
139 Transition* deserialize_transition(aid_t issuer, int times_considered, std::stringstream& stream);
141 } // namespace simgrid::mc