Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
PointToPointMessageInfo.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* PointToPointMessageInfo.h (C) 2000-2022 */
9/* */
10/* Informations pour les messages point à point. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCCORE_MESSAGEPASSING_POINTTOPOINTINFO_H
13#define ARCCORE_MESSAGEPASSING_POINTTOPOINTINFO_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arccore/message_passing/MessageId.h"
18#include "arccore/message_passing/MessageTag.h"
19#include "arccore/message_passing/MessageRank.h"
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
25{
26/*!
27 * \brief Informations pour envoyer/recevoir un message point à point.
28 *
29 * Il existe deux manières de construire une instance de cette classe:
30 *
31 * 1. en donnant un couple (rang destinataire,tag). Le tag est optionnel
32 * et s'il n'est pas spécifié, sa valeur sera celle de MessageTag::defaultTag().
33 * 2. via un MessageId obtenu lors d'un appel à mpProbe(). Dans ce dernier
34 * cas, l'instance ne peut alors être utilisée qu'en réception via mpReceive().
35 *
36 * Il est possible de spécifier si le message sera bloquant lors de la
37 * construction ou via l'appel à setBlocking(). Par défaut un message
38 * est créé en mode bloquant.
39 *
40 * L'émetteur (emiterRank()) du message est l'émetteur et la
41 * destination (destinationRank() le récepteur. Pour un message d'envoi (mpSend()),
42 * destinationRank() est donc le rang de celui qui va recevoir le message. Pour un
43 * message de réception (mpReceive()), destinationRank() est le rang de celui dont
44 * on souhaite recevoir le message ou A_NULL_RANK si on souhaite recevoir de
45 * n'importe qui.
46 *
47 * \note L'émetteur est en général positionnée par l'implémentation de
48 * IMessagePassingMng car il correspond au rang de celui qui poste le message.
49 * L'utilisateur n'a donc jamais besoin de le spécifier.
50 */
51class ARCCORE_MESSAGEPASSING_EXPORT PointToPointMessageInfo
52{
53 public:
54
55 enum class Type
56 {
57 T_RankTag,
58 T_MessageId,
59 T_Null
60 };
61
62 public:
63
64 //! Message nul.
66
67 //! Message bloquant avec tag par défaut et ayant pour destination \a rank
69 : m_destination_rank(dest_rank)
70 , m_type(Type::T_RankTag)
71 {}
72
73 //! Message avec tag par défaut, ayant destination \a dest_rank et mode bloquant \a blocking_type
75 : m_destination_rank(dest_rank)
76 , m_is_blocking(blocking_type == Blocking)
77 , m_type(Type::T_RankTag)
78 {}
79
80 //! Message bloquant avec tag \a tag et ayant pour destination \a rank
82 : m_destination_rank(dest_rank)
83 , m_tag(tag)
84 , m_type(Type::T_RankTag)
85 {}
86
87 //! Message avec tag \a tag, ayant pour destination \a dest_rank et mode bloquant \a blocking_type
89 : m_destination_rank(dest_rank)
90 , m_tag(tag)
91 , m_is_blocking(blocking_type == Blocking)
92 , m_type(Type::T_RankTag)
93 {}
94
95 //! Message bloquant associé à \a message_id
97 : m_message_id(message_id)
98 , m_type(Type::T_MessageId)
99 {
100 _setInfosFromMessageId();
101 }
102
103 //! Message associé à \a message_id avec le mode bloquant \a blocking_type
105 : m_message_id(message_id)
106 , m_is_blocking(blocking_type == Blocking)
107 , m_type(Type::T_MessageId)
108 {
109 _setInfosFromMessageId();
110 }
111
112 public:
113
114 /*!
115 * \brief Message avec tag par défaut et ayant pour source \a emiter_rank,
116 * destination \a dest_rank et mode bloquant \a blocking_type
117 */
118 ARCCORE_DEPRECATED_REASON("Y2022: This constructor is internal to Arcane and deprecated")
119 PointToPointMessageInfo(MessageRank emiter_rank, MessageRank dest_rank, eBlockingType blocking_type)
120 : m_emiter_rank(emiter_rank)
121 , m_destination_rank(dest_rank)
122 , m_is_blocking(blocking_type == Blocking)
123 , m_type(Type::T_RankTag)
124 {}
125
126 //! Message bloquant avec tag \a tag, ayant pour source \a emiter_rank, et ayant pour destination \a rank
127 ARCCORE_DEPRECATED_REASON("Y2022: This constructor is internal to Arcane and deprecated")
129 : m_emiter_rank(emiter_rank)
130 , m_destination_rank(dest_rank)
131 , m_tag(tag)
132 , m_type(Type::T_RankTag)
133 {}
134
135 //! Message bloquant avec tag par défaut et ayant pour source \a emiter_rank et destination \a dest_rank
136 ARCCORE_DEPRECATED_REASON("Y2022: This constructor is internal to Arcane and deprecated")
138 : m_emiter_rank(emiter_rank)
139 , m_destination_rank(dest_rank)
140 , m_type(Type::T_RankTag)
141 {}
142
143 public:
144
145 /*!
146 * \internal
147 * \brief Message avec tag \a tag, ayant pour source \a emiter_rank,
148 * pour destination \a dest_rank et mode bloquant \a blocking_type.
149 */
150 PointToPointMessageInfo(MessageRank emiter_rank, MessageRank dest_rank, MessageTag tag, eBlockingType blocking_type)
151 : m_emiter_rank(emiter_rank)
152 , m_destination_rank(dest_rank)
153 , m_tag(tag)
154 , m_is_blocking(blocking_type == Blocking)
155 , m_type(Type::T_RankTag)
156 {}
157
158 public:
159
160 PointToPointMessageInfo& setBlocking(bool is_blocking)
161 {
162 m_is_blocking = is_blocking;
163 return (*this);
164 }
165 //! Indique si le message est bloquant.
166 bool isBlocking() const { return m_is_blocking; }
167 //! Vrai si l'instance a été créée avec un MessageId. Dans ce cas messageId() est valide
168 bool isMessageId() const { return m_type == Type::T_MessageId; }
169 //! Vrai si l'instance a été créée avec un couple (rank,tag). Dans ce cas rank() et tag() sont valides.
170 bool isRankTag() const { return m_type == Type::T_RankTag; }
171 //! Identifiant du message
172 MessageId messageId() const { return m_message_id; }
173 //! Positionne l'identifiant du message et change le type du message
174 void setMessageId(const MessageId& message_id)
175 {
176 m_type = Type::T_MessageId;
177 m_message_id = message_id;
178 _setInfosFromMessageId();
179 }
180 //! Positionne le rang destination et le tag du message et change le type du message
182 {
183 m_type = Type::T_RankTag;
184 // Attention à bien appeler les méthodes pour mettre à jour
185 // les valeurs associées de `m_message_id`
186 setDestinationRank(rank);
187 setTag(tag);
188 }
189 //! Rang de la destination du message
190 MessageRank destinationRank() const { return m_destination_rank; }
191 //! Positionne le rang de la destination du message
193 {
194 m_destination_rank = rank;
195 MessageId::SourceInfo si = m_message_id.sourceInfo();
196 si.setRank(rank);
197 m_message_id.setSourceInfo(si);
198 }
199
200 //! Rang de l'émetteur du message
201 MessageRank emiterRank() const { return m_emiter_rank; }
202 //! Positionne le rang de l'émetteur du message
203 void setEmiterRank(MessageRank rank) { m_emiter_rank = rank; }
204
205 //! Tag du message
206 MessageTag tag() const { return m_tag; }
207 //! Positionne le tag du message
209 {
210 m_tag = tag;
211 MessageId::SourceInfo si = m_message_id.sourceInfo();
212 si.setTag(tag);
213 m_message_id.setSourceInfo(si);
214 }
215 //! Affiche le message
216 void print(std::ostream& o) const;
217
218 friend std::ostream& operator<<(std::ostream& o, const PointToPointMessageInfo& pmessage)
219 {
220 pmessage.print(o);
221 return o;
222 }
223
224 public:
225
226 // Indique si le message est valide (i.e: il a été initialisé avec un message valide)
227 bool isValid() const
228 {
229 if (m_type == Type::T_Null)
230 return false;
231 if (m_type == Type::T_MessageId)
232 return m_message_id.isValid();
233 if (m_type == Type::T_RankTag)
234 return true;
235 return false;
236 }
237
238 public:
239
240 //! Rang d'origine du message
241 ARCCORE_DEPRECATED_REASON("Y2022: Use emiterRank() instead")
242 MessageRank sourceRank() const { return m_emiter_rank; }
243
244 //! Positionne le rang d'origine du message
245 ARCCORE_DEPRECATED_REASON("Y2022: Use setEmiterRank() instead")
246 void setSourceRank(MessageRank rank) { m_emiter_rank = rank; }
247
248 private:
249
250 MessageRank m_emiter_rank;
251 MessageRank m_destination_rank;
252 MessageTag m_tag = MessageTag::defaultTag();
253 MessageId m_message_id;
254 bool m_is_blocking = true;
255 Type m_type = Type::T_Null;
256
257 void _setInfosFromMessageId()
258 {
259 m_destination_rank = m_message_id.sourceInfo().rank();
260 m_tag = m_message_id.sourceInfo().tag();
261 }
262};
263
264/*---------------------------------------------------------------------------*/
265/*---------------------------------------------------------------------------*/
266
267} // End namespace Arccore::MessagePassing
268
269/*---------------------------------------------------------------------------*/
270/*---------------------------------------------------------------------------*/
271
272#endif
273
MessageSourceInfo sourceInfo() const
Informations sur la source du message;.
Definition MessageId.h:153
Informations sur la source d'un message.
MessageTag tag() const
Tag du message.
MessageRank rank() const
Rang de la source.
void setTag(MessageTag tag)
Positionne le tag du message.
void setRank(MessageRank rank)
Positionne le rang de la source.
Informations pour envoyer/recevoir un message point à point.
MessageId messageId() const
Identifiant du message.
void setDestinationRank(MessageRank rank)
Positionne le rang de la destination du message.
PointToPointMessageInfo(MessageRank dest_rank, MessageTag tag)
Message bloquant avec tag tag et ayant pour destination rank.
PointToPointMessageInfo(MessageId message_id)
Message bloquant associé à message_id.
PointToPointMessageInfo(MessageRank dest_rank)
Message bloquant avec tag par défaut et ayant pour destination rank.
MessageRank emiterRank() const
Rang de l'émetteur du message.
void setEmiterRank(MessageRank rank)
Positionne le rang de l'émetteur du message.
MessageRank destinationRank() const
Rang de la destination du message.
void setRankTag(MessageRank rank, MessageTag tag)
Positionne le rang destination et le tag du message et change le type du message.
void setTag(MessageTag tag)
Positionne le tag du message.
PointToPointMessageInfo(MessageId message_id, eBlockingType blocking_type)
Message associé à message_id avec le mode bloquant blocking_type.
PointToPointMessageInfo(MessageRank dest_rank, eBlockingType blocking_type)
Message avec tag par défaut, ayant destination dest_rank et mode bloquant blocking_type.
bool isBlocking() const
Indique si le message est bloquant.
bool isMessageId() const
Vrai si l'instance a été créée avec un MessageId. Dans ce cas messageId() est valide.
PointToPointMessageInfo(MessageRank dest_rank, MessageTag tag, eBlockingType blocking_type)
Message avec tag tag, ayant pour destination dest_rank et mode bloquant blocking_type.
void setMessageId(const MessageId &message_id)
Positionne l'identifiant du message et change le type du message.
void print(std::ostream &o) const
Affiche le message.
bool isRankTag() const
Vrai si l'instance a été créée avec un couple (rank,tag). Dans ce cas rank() et tag() sont valides.
Espace de nommage contenant les types et déclarations qui gèrent le mécanisme de parallélisme par éch...
eBlockingType
Type indiquant si un message est bloquant ou non.