ATLAS Offline Software
ClusterMessage.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 #ifndef ATHENAKERNEL_CLUSTERMESSAGE_H
5 #define ATHENAKERNEL_CLUSTERMESSAGE_H
6 
7 #include <array>
8 #include <optional>
9 #include <variant>
10 
11 #include "GaudiKernel/StatusCode.h"
16 enum class ClusterMessageType {
19  EventsDone,
23  Data,
24  EMPTY
25 };
26 
31 
32  // Wire message consists of a header and an optional body.
33  // If message type is Data, FinalWorkerStatus or WorkerError, payload
34  // in header indicates tag used to send body.
35  // message type, source, int payload
36  using WireMsgHdr = std::array<int, 3>; // three ints for the three components of the header
37  using WireMsgBody = std::array<int, 10>; // 320 bit max body length (for a DataDescr)
38  using WireMsg = std::tuple<WireMsgHdr, std::optional<WireMsgBody>>;
39 
40  int source = -1; // Filled in when it is sent
42 
43  struct WorkerStatus {
45  int createdEvents = 0;
46  int skippedEvents = 0;
47  int finishedEvents = 0;
48  };
49 
50  struct DataDescr {
51  void* ptr = nullptr;
52  std::size_t len = 0;
53  std::size_t align = 0;
54 
55  bool received = false; // set if this DataDescr was received and therefore
56  // owns its memory
57  std::size_t evtNumber = 0;
58  std::size_t fileNumber = 0;
59 
60  template <typename T>
61  DataDescr(const T* ptr, std::size_t count = 1)
62  : ptr((void*)ptr), len(count * sizeof(T)), align(alignof(T)) {}
63 
64  DataDescr(DataDescr&& rhs) noexcept;
65 
66  DataDescr(const WireMsgBody& body);
67 
68  DataDescr& operator=(DataDescr&& rhs) noexcept;
69 
70  ~DataDescr();
71  };
72 
73  // A payload is used with:
74  // ProvideEvent: an int indicating the event index
75  // ProvideStatus and WorkerError: a WorkerStatus
76  // Data: DataDescr for miscellaneous data (variable size)
77  using Payload_t = std::variant<std::monostate, int, WorkerStatus, DataDescr>;
79 
81 
83 
85 
87 
89 
90  ClusterMessage(const WireMsg&);
91 
92  [[nodiscard]] WireMsg wire_msg() const;
93 };
94 
95 #include "ClusterMessage.icc"
96 #endif // ATHENAKERNEL_CLUSTERMESSAGE_H
ClusterMessage::payload
Payload_t payload
Definition: ClusterMessage.h:78
ClusterMessageType::Data
@ Data
ClusterMessage.icc
ClusterMessage::WorkerStatus
Definition: ClusterMessage.h:43
ClusterMessage::DataDescr::align
std::size_t align
Definition: ClusterMessage.h:53
ClusterMessage::DataDescr::DataDescr
DataDescr(const T *ptr, std::size_t count=1)
Definition: ClusterMessage.h:61
ClusterMessageType::RequestEvent
@ RequestEvent
ClusterMessage::WorkerStatus::status
StatusCode status
Definition: ClusterMessage.h:44
ClusterMessageType
An enum class defining what type of message this is.
ClusterMessage::WorkerStatus::skippedEvents
int skippedEvents
Definition: ClusterMessage.h:46
ClusterMessage::WorkerStatus::finishedEvents
int finishedEvents
Definition: ClusterMessage.h:47
XMLtoHeader.count
count
Definition: XMLtoHeader.py:84
ClusterMessage::ClusterMessage
ClusterMessage()
ClusterMessage::DataDescr::len
std::size_t len
Definition: ClusterMessage.h:52
ClusterMessageType::EmergencyStop
@ EmergencyStop
ClusterMessage::DataDescr::evtNumber
std::size_t evtNumber
Definition: ClusterMessage.h:57
ClusterMessage::WireMsgBody
std::array< int, 10 > WireMsgBody
Definition: ClusterMessage.h:37
ClusterMessage::DataDescr::fileNumber
std::size_t fileNumber
Definition: ClusterMessage.h:58
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ClusterMessage::DataDescr::operator=
DataDescr & operator=(DataDescr &&rhs) noexcept
Definition: ClusterMessage.cxx:34
ClusterMessage::Payload_t
std::variant< std::monostate, int, WorkerStatus, DataDescr > Payload_t
Definition: ClusterMessage.h:77
ClusterMessageType::FinalWorkerStatus
@ FinalWorkerStatus
ClusterMessage::wire_msg
WireMsg wire_msg() const
Definition: ClusterMessage.cxx:118
ClusterMessage
A class describing a message sent between nodes in a cluster.
Definition: ClusterMessage.h:30
ClusterMessage::messageType
ClusterMessageType messageType
Definition: ClusterMessage.h:41
ClusterMessage::DataDescr::~DataDescr
~DataDescr()
Definition: ClusterMessage.cxx:28
ClusterMessage::source
int source
Definition: ClusterMessage.h:40
ClusterMessage::WorkerStatus::createdEvents
int createdEvents
Definition: ClusterMessage.h:45
ClusterMessageType::WorkerError
@ WorkerError
ClusterMessage::DataDescr
Definition: ClusterMessage.h:50
ClusterMessageType::EMPTY
@ EMPTY
ClusterMessage::WireMsgHdr
std::array< int, 3 > WireMsgHdr
Definition: ClusterMessage.h:36
ClusterMessageType::EventsDone
@ EventsDone
ClusterMessage::WireMsg
std::tuple< WireMsgHdr, std::optional< WireMsgBody > > WireMsg
Definition: ClusterMessage.h:38
ClusterMessage::DataDescr::ptr
void * ptr
Definition: ClusterMessage.h:51
ClusterMessageType::ProvideEvent
@ ProvideEvent
TSU::T
unsigned long long T
Definition: L1TopoDataTypes.h:35
ClusterMessage::DataDescr::received
bool received
Definition: ClusterMessage.h:55