request_tag_multi.h
1 
5 #pragma once
6 
7 #include <memory>
8 #include <mutex>
9 #include <string>
10 #include <vector>
11 
12 #include <ucp/api/ucp.h>
13 
14 #include <ucxx/buffer.h>
15 #include <ucxx/endpoint.h>
16 #include <ucxx/future.h>
17 #include <ucxx/request.h>
18 #include <ucxx/request_tag_multi_builder.h>
19 
20 namespace ucxx {
21 
22 class RequestTagMulti;
23 
31 struct BufferRequest {
32  std::shared_ptr<Request> request{nullptr};
33  std::shared_ptr<std::string> stringBuffer{nullptr};
34  std::shared_ptr<Buffer> buffer{nullptr};
35 
36  BufferRequest();
37  ~BufferRequest();
38 
39  BufferRequest(const BufferRequest&) = delete;
40  BufferRequest& operator=(BufferRequest const&) = delete;
41  BufferRequest(BufferRequest&& o) = delete;
42  BufferRequest& operator=(BufferRequest&& o) = delete;
43 };
44 
50 typedef std::shared_ptr<BufferRequest> BufferRequestPtr;
51 
61 class RequestTagMulti : public Request {
62  private:
63  size_t _totalFrames{0};
64  std::mutex
65  _completedRequestsMutex{};
66  size_t _completedRequests{0};
67  ucs_status_t _finalStatus{
68  UCS_OK};
69 
70  public:
71  std::vector<BufferRequestPtr> _bufferRequests{};
72  bool _isFilled{false};
73 
74  private:
75  RequestTagMulti() = delete;
76  RequestTagMulti(const RequestTagMulti&) = delete;
77  RequestTagMulti& operator=(RequestTagMulti const&) = delete;
78  RequestTagMulti(RequestTagMulti&& o) = delete;
79  RequestTagMulti& operator=(RequestTagMulti&& o) = delete;
80 
106  RequestTagMulti(std::shared_ptr<Endpoint> endpoint,
107  const std::variant<data::TagMultiSend, data::TagMultiReceive> requestData,
108  std::string operationName,
109  const bool enablePythonFuture);
110 
111  void populateDelayedSubmissionImpl() override;
112 
126  void recvFrames();
127 
137  void recvHeader();
138 
144  void send();
145 
146  public:
147  // Allow internal construction without exposing factory functions.
148  friend class detail::ConstructorFactory;
149 
155  virtual ~RequestTagMulti();
156 
173  void markCompleted(ucs_status_t status);
174 
191  void recvCallback(ucs_status_t status);
192 
193  void cancel() override;
194 };
195 
201 typedef std::shared_ptr<RequestTagMulti> RequestTagMultiPtr;
202 
203 } // namespace ucxx
Send or receive multiple messages with the UCX Tag API.
Definition: request_tag_multi.h:61
void recvCallback(ucs_status_t status)
Callback to submit request to receive new header or frames.
virtual ~RequestTagMulti()
ucxx::RequestTagMulti destructor.
bool _isFilled
Whether the all requests have been posted.
Definition: request_tag_multi.h:72
void markCompleted(ucs_status_t status)
Mark request as completed.
void cancel() override
Cancel the request.
std::vector< BufferRequestPtr > _bufferRequests
Container of all requests posted.
Definition: request_tag_multi.h:71
Base type for a UCXX transfer request.
Definition: request.h:39
Definition: address.h:16
std::shared_ptr< BufferRequest > BufferRequestPtr
Pre-defined type for a pointer to an ucxx::BufferRequest.
Definition: request_tag_multi.h:50
std::shared_ptr< RequestTagMulti > RequestTagMultiPtr
Pre-defined type for a pointer to an ucxx::RequestTagMulti.
Definition: request_tag_multi.h:201
Container for data required by a ucxx::RequestTagMulti.
Definition: request_tag_multi.h:31
std::shared_ptr< Buffer > buffer
Internally allocated buffer to receive a frame.
Definition: request_tag_multi.h:34
std::shared_ptr< std::string > stringBuffer
Serialized Header
Definition: request_tag_multi.h:33
std::shared_ptr< Request > request
The ucxx::RequestTag of a header or frame.
Definition: request_tag_multi.h:32