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_, unsigned 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 /** ID of the corresponding Communication object in the application, or 0 if unknown */
44 unsigned 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, unsigned comm_, aid_t sender_, aid_t receiver_, unsigned mbox_,
71 uintptr_t sbuff_, uintptr_t rbuff_, size_t size_);
72 CommTestTransition(aid_t issuer, int times_considered, std::stringstream& stream);
73 std::string to_string(bool verbose) const override;
74 bool depends(const Transition* other) const override;
76 /** ID of the corresponding Communication object in the application, or 0 if unknown */
77 unsigned get_comm() const { return comm_; }
79 aid_t get_sender() const { return sender_; }
81 aid_t get_receiver() const { return receiver_; }
83 unsigned get_mailbox() const { return mbox_; }
85 uintptr_t get_sbuff() const { return sbuff_; }
86 /** Receiver buffer */
87 uintptr_t get_rbuff() const { return rbuff_; }
89 size_t get_size() const { return size_; }
92 class CommRecvTransition : public Transition {
93 unsigned comm_; /* ID of the CommImpl or 0 if not known */
99 CommRecvTransition(aid_t issuer, int times_considered, unsigned comm_, unsigned mbox_, uintptr_t rbuff_, int tag_);
100 CommRecvTransition(aid_t issuer, int times_considered, std::stringstream& stream);
101 std::string to_string(bool verbose) const override;
102 bool depends(const Transition* other) const override;
104 /** ID of the corresponding Communication object in the application (or 0 if unknown)*/
105 unsigned get_comm() const { return comm_; }
107 unsigned get_mailbox() const { return mbox_; }
108 /** Receiver buffer */
109 uintptr_t get_rbuff() const { return rbuff_; }
110 /** If using SMPI, the tag */
111 int get_tag() const { return tag_; }
114 class CommSendTransition : public Transition {
122 CommSendTransition(aid_t issuer, int times_considered, unsigned comm_, unsigned mbox_, uintptr_t sbuff_, size_t size_,
124 CommSendTransition(aid_t issuer, int times_considered, std::stringstream& stream);
125 std::string to_string(bool verbose) const override;
126 bool depends(const Transition* other) const override;
128 /** ID of the corresponding Communication object in the application, or 0 if unknown */
129 unsigned get_comm() const { return comm_; }
131 unsigned get_mailbox() const { return mbox_; }
133 uintptr_t get_sbuff() const { return sbuff_; }
135 size_t get_size() const { return size_; }
136 /** If using SMPI, the tag */
137 int get_tag() const { return tag_; }
140 /** Make a new transition from serialized description */
141 Transition* deserialize_transition(aid_t issuer, int times_considered, std::stringstream& stream);
143 } // namespace simgrid::mc