NewMadeleine

Documentation

« back to PM2 home.
nm_sendrecv_interface.h
Go to the documentation of this file.
1/*
2 * NewMadeleine
3 * Copyright (C) 2006-2026 (see AUTHORS file)
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or (at
8 * your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 */
15
16#ifndef NM_SENDRECV_INTERFACE_H
17#define NM_SENDRECV_INTERFACE_H
18
28#include <nm_public.h>
30#include <nm_core_interface.h>
31#include <sys/uio.h>
32#include <limits.h>
33
35
58
61
63typedef union
64{
65 struct
66 {
72 } recv_unexpected;
73 struct
74 {
76 } req;
78
81typedef void (*nm_sr_event_notifier_t)(nm_sr_event_t event, const nm_sr_event_info_t*event_info, void*ref);
82
93
94/* ** Operations on requests (send or recv) **************** */
95
99
101 nm_sr_event_t mask, nm_sr_event_notifier_t notifier, void*ref);
102
105
110
112static inline int nm_sr_request_isnull(nm_sr_request_t*p_request);
113
115static inline int nm_sr_request_set_ref(nm_sr_request_t*p_request, void*ref);
116
118static inline void*nm_sr_request_get_ref(nm_sr_request_t*p_request);
119
122
125
128
130
133
136
138static inline void nm_sr_request_wait_all(nm_sr_request_t**p_requests, int n);
139
141static inline int nm_sr_request_test(nm_sr_request_t*p_request);
142
145
147static inline int nm_sr_request_get_error(nm_sr_request_t*p_request);
148
152
153
154/* ** Building blocks for send ***************************** */
155
156/* Rationale for the send interface:
157 * either use the high-level interface (nm_sr_isend() et al., see below
158 * or the low-level building blocks
159 * Sequence for a send with the low-level building blocks:
160 * 1. nm_sr_send_init() init request
161 * 2. nm_sr_send_pack_*() pack data into request
162 * 3. nm_sr_send_isend|issend|rsend() to send data
163 * alternative:
164 * 3.1 nm_sr_send_dest() set destination of message
165 * 3.2 nm_sr_send_header() set data header size
166 * 3.3 nm_sr_send_submit() submit send request to nmad
167 */
168
173 const void*, nm_len_t len);
176 const struct iovec*iov, int num_entries);
179 const struct nm_data_s*p_data);
202 int n, const struct nm_chunk_s*p_chunks);
207
208/* ** Building blocks for recv ***************************** */
209
212 void*ptr, nm_len_t len);
214 const struct iovec*iov, int num_entry);
216 const struct nm_data_s*p_data);
224 const nm_sr_event_info_t*p_event);
227 const struct nm_data_s*p_data);
228
231 const struct nm_data_s*p_data, nm_len_t peek_offset, nm_len_t peek_len);
232
234static inline void nm_sr_recv_offset(nm_session_t p_session, nm_sr_request_t*p_request, nm_len_t offset);
235
238
241
244
247
250
251/* ** High level / legacy send ***************************** */
252
256 const void*data, nm_len_t len,
257 nm_sr_request_t*p_request)
258{
259 nm_sr_send_init(p_session, p_request);
260 nm_sr_send_pack_contiguous(p_session, p_request, data, len);
261 const int err = nm_sr_send_issend(p_session, p_request, p_gate, tag);
262 return err;
263}
264
276 const void*data, nm_len_t len,
277 nm_sr_request_t*p_request)
278{
279 nm_sr_send_init(p_session, p_request);
280 nm_sr_send_pack_contiguous(p_session, p_request, data, len);
281 const int err = nm_sr_send_isend(p_session, p_request, p_gate, tag);
282 return err;
283}
284
297 const void*data, nm_len_t len,
298 nm_sr_request_t*p_request)
299{
300 nm_sr_send_init(p_session, p_request);
301 nm_sr_send_pack_contiguous(p_session, p_request, data, len);
302 const int err = nm_sr_send_rsend(p_session, p_request, p_gate, tag);
303 return err;
304}
305
317 const struct iovec *iov, int num_entries,
318 nm_sr_request_t*p_request)
319{
320 nm_sr_send_init(p_session, p_request);
321 nm_sr_send_pack_iov(p_session, p_request, iov, num_entries);
322 const int err = nm_sr_send_isend(p_session, p_request, p_gate, tag);
323 return err;
324}
325
328 struct nm_data_s*p_data,
329 nm_sr_request_t*p_request)
330{
331 nm_sr_send_init(p_session, p_request);
333 const int err = nm_sr_send_isend(p_session, p_request, p_gate, tag);
334 return err;
335}
336
337
344 nm_sr_request_t*p_request);
345
351
357static inline int nm_sr_swait(nm_session_t p_session, nm_sr_request_t*p_request);
358
365 nm_sr_request_t*p_request);
366
367
379 void*data, nm_len_t len,
380 nm_sr_request_t*p_request)
381{
382 nm_sr_recv_init(p_session, p_request);
383 nm_sr_recv_unpack_contiguous(p_session, p_request, data, len);
385 return NM_ESUCCESS;
386}
387
390 struct iovec *iov, int num_entries,
391 nm_sr_request_t*p_request)
392{
393 nm_sr_recv_init(p_session, p_request);
394 nm_sr_recv_unpack_iov(p_session, p_request, iov, num_entries);
396}
397
400 struct nm_data_s*p_data,
401 nm_sr_request_t*p_request)
402{
403 nm_sr_recv_init(p_session, p_request);
406}
407
409 nm_sr_event_t mask, nm_sr_event_notifier_t notifier, void*ref)
410{
411 nm_sr_request_set_ref(p_request, ref);
412 return nm_sr_request_monitor(p_session, p_request, mask, notifier);
413}
414
415
422
423
429static inline int nm_sr_rwait(nm_session_t p_session, nm_sr_request_t*p_request);
430
439
446
454 nm_sr_request_t*p_request, nm_gate_t*p_gate);
455
468 nm_gate_t p_gate, nm_gate_t*p_out_gate,
469 nm_tag_t tag, nm_tag_t tag_mask, nm_tag_t*p_out_tag,
470 nm_len_t*p_out_len);
471
474
477
482
487
488
489
490#include <nm_sendrecv_private.h> /* private header included for inlining */
491
495 const void*data, nm_len_t len)
496{
497 nm_sr_request_t request;
498 int rc = nm_sr_isend(p_session, p_gate, tag, data, len, &request);
499 if(rc == NM_ESUCCESS)
500 {
501 rc = nm_sr_swait(p_session, &request);
502 }
503 return rc;
504}
505
509 void*data, nm_len_t len)
510{
511 nm_sr_request_t request;
512 int rc = nm_sr_irecv(p_session, p_gate, tag, data, len, &request);
513 if(rc == NM_ESUCCESS)
514 {
515 rc = nm_sr_rwait(p_session, &request);
516 }
517 return rc;
518}
519
522{
523 nm_sr_request_t request;
524 int rc = nm_sr_isend_data(p_session, p_gate, tag, p_data, &request);
525 if(rc == NM_ESUCCESS)
526 {
527 rc = nm_sr_swait(p_session, &request);
528 }
529 return rc;
530}
531
534{
535 nm_sr_request_t request;
536 int rc = nm_sr_irecv_data(p_session, p_gate, tag, p_data, &request);
537 if(rc == NM_ESUCCESS)
538 {
539 rc = nm_sr_rwait(p_session, &request);
540 }
541 return rc;
542}
543
547
548#endif /* NM_SENDRECV_INTERFACE_H */
@ NM_ESUCCESS
successful operation
Definition nm_errno.h:36
#define NM_STATUS_UNPACK_CANCELLED
unpack operation has been cancelled
#define NM_STATUS_FINALIZED
request is finalized, may be freed
#define NM_STATUS_UNEXPECTED
data or rdv has arrived, with no matching unpack
#define NM_STATUS_UNPACK_DATA0
first byte of data arrived, not unpacked yet- event triggered only if unpack is posted without data s...
uint32_t nm_status_t
status bits of pack/unpack requests
#define NM_STATUS_PACK_COMPLETED
sending operation has completed
#define NM_STATUS_UNPACK_COMPLETED
unpack operation has completed
static void nm_sr_recv_unpack_data(nm_session_t p_session, nm_sr_request_t *p_request, const struct nm_data_s *p_data)
int nm_sr_request_monitor(nm_session_t p_session, nm_sr_request_t *p_request, nm_sr_event_t mask, nm_sr_event_notifier_t notifier)
Set a notification function called upon request completion.
static void nm_sr_recv_init(nm_session_t p_session, nm_sr_request_t *p_request)
static int nm_sr_send_submit_chunks(nm_session_t p_session, nm_sr_request_t *p_request, int n, const struct nm_chunk_s *p_chunks)
submit partial chunks of a request.
void(* nm_sr_event_notifier_t)(nm_sr_event_t event, const nm_sr_event_info_t *event_info, void *ref)
notification function for sendrecv events.
int nm_sr_rtest(nm_session_t p_session, nm_sr_request_t *p_request)
Test for the completion of a non blocking receive request.
static int nm_sr_recv_peek(nm_session_t p_session, nm_sr_request_t *p_request, const struct nm_data_s *p_data)
peek for already received (unexpected) data
static nm_gate_t nm_sr_request_get_gate(nm_sr_request_t *p_request)
int nm_sr_stest(nm_session_t p_session, nm_sr_request_t *p_request)
Test for the completion of a non blocking send request.
static int nm_sr_isend_data(nm_session_t p_session, nm_gate_t p_gate, nm_tag_t tag, struct nm_data_s *p_data, nm_sr_request_t *p_request)
static void nm_sr_send_set_priority(nm_session_t p_session, nm_sr_request_t *p_request, nm_prio_t priority)
attach the given priority to the request.
static int nm_sr_swait(nm_session_t p_session, nm_sr_request_t *p_request)
Wait for the completion of a non blocking send request.
static void nm_sr_recv_data_wait(nm_session_t p_session, nm_sr_request_t *p_request)
waits for first byte of data to be available, for a request posted without data descriptor
int nm_sr_session_monitor_set(nm_session_t p_session, const struct nm_sr_monitor_s *p_monitor)
set a monitor for events on the session
static int nm_sr_send_dest(nm_session_t p_session, nm_sr_request_t *p_request, nm_gate_t p_gate, nm_tag_t tag)
set destination to a request, but do not send it immediately
static int nm_sr_recv_data(nm_session_t p_session, nm_gate_t p_gate, nm_tag_t tag, struct nm_data_s *p_data)
blocking recv
static int nm_sr_request_get_error(nm_sr_request_t *p_request)
Get the error status of the request.
static int nm_sr_request_get_size(nm_sr_request_t *request, nm_len_t *size)
Returns the actual received or sent size of the message with the specified request.
static int nm_sr_rwait(nm_session_t p_session, nm_sr_request_t *p_request)
Wait for the completion of a non blocking receive request.
static nm_tag_t nm_sr_request_get_tag(nm_sr_request_t *p_request)
Retrieve the tag from a sendrecv request.
static int nm_sr_send_rsend(nm_session_t p_session, nm_sr_request_t *p_request, nm_gate_t p_gate, nm_tag_t tag)
send a built request in ready mode
static int nm_sr_send_header(nm_session_t p_session, nm_sr_request_t *p_request, nm_len_t hlen)
static void nm_sr_recv_unpack_iov(nm_session_t p_session, nm_sr_request_t *p_request, const struct iovec *iov, int num_entry)
static int nm_sr_request_isnull(nm_sr_request_t *p_request)
tests whether a request is NULL
static int nm_sr_request_monitor_with_ref(nm_session_t p_session, nm_sr_request_t *p_request, nm_sr_event_t mask, nm_sr_event_notifier_t notifier, void *ref)
static int nm_sr_recv_post(nm_session_t p_session, nm_sr_request_t *p_request)
posts the receive request to the scheduler
static void nm_sr_send_init(nm_session_t p_session, nm_sr_request_t *p_request)
Init a send request.
int nm_sr_session_monitor_remove(nm_session_t p_session, const struct nm_sr_monitor_s *p_monitor)
remove the event monitor from the session
static int nm_sr_request_test(nm_sr_request_t *p_request)
tests whether the given request is completed; make it progress if needed
static int nm_sr_rwait_data(nm_session_t p_session, nm_sr_request_t *p_request)
Wait for data to be available from a non blocking receive request.
int nm_sr_recv_success(nm_session_t p_session, nm_sr_request_t **out_req)
Poll for any completed recv request (any source, any tag).
static int nm_sr_recv(nm_session_t p_session, nm_gate_t p_gate, nm_tag_t tag, void *data, nm_len_t len)
blocking recv
static int nm_sr_send_isend(nm_session_t p_session, nm_sr_request_t *p_request, nm_gate_t p_gate, nm_tag_t tag)
send a built request to given gate & tag
static int nm_sr_send_issend(nm_session_t p_session, nm_sr_request_t *p_request, nm_gate_t p_gate, nm_tag_t tag)
send a built request in synchronous mode
static void nm_sr_recv_match_event(nm_session_t p_session, nm_sr_request_t *p_request, const nm_sr_event_info_t *p_event)
match the request with event
static void nm_sr_request_wait_all(nm_sr_request_t **p_requests, int n)
wait for completion of an array of requests
static int nm_sr_isend_iov(nm_session_t p_session, nm_gate_t p_gate, nm_tag_t tag, const struct iovec *iov, int num_entries, nm_sr_request_t *p_request)
Test for the completion of a non blocking send request.
int nm_sr_progress(nm_session_t p_session)
Calls the scheduler.
static int nm_sr_issend(nm_session_t p_session, nm_gate_t p_gate, nm_tag_t tag, const void *data, nm_len_t len, nm_sr_request_t *p_request)
Synchronous send.
int nm_sr_rcancel(nm_session_t p_session, nm_sr_request_t *p_request)
Cancel a reception request.
static int nm_sr_recv_data_test(nm_session_t p_session, nm_sr_request_t *p_request)
checks whether data is available, for a request posted without data descriptor
static void nm_sr_recv_offset(nm_session_t p_session, nm_sr_request_t *p_request, nm_len_t offset)
set offset of data to receive; data before offset will be discarded
static int nm_sr_recv_peek_offset(nm_session_t p_session, nm_sr_request_t *p_request, const struct nm_data_s *p_data, nm_len_t peek_offset, nm_len_t peek_len)
peek for already received (unexpected) data, with offset and explicit len
static void nm_sr_recv_match(nm_session_t p_session, nm_sr_request_t *p_request, nm_gate_t p_gate, nm_tag_t tag, nm_tag_t mask)
match the request with given gate/tag/mask
static int nm_sr_irecv_data(nm_session_t p_session, nm_gate_t p_gate, nm_tag_t tag, struct nm_data_s *p_data, nm_sr_request_t *p_request)
static int nm_sr_irecv_iov(nm_session_t p_session, nm_gate_t p_gate, nm_tag_t tag, struct iovec *iov, int num_entries, nm_sr_request_t *p_request)
int nm_sr_recv_source(nm_session_t p_session, nm_sr_request_t *p_request, nm_gate_t *p_gate)
Retrieve the pkt source of a complete any source receive request.
nm_sr_event_t
events for monitors
int nm_sr_request_wait(nm_sr_request_t *p_request)
Wait for request completion (or cancelation)
static int nm_sr_request_test_status(nm_sr_request_t *p_request, nm_status_t status)
Tests whether the given status bits are set in request- does not make communication progress.
static void nm_sr_recv_unpack_contiguous(nm_session_t p_session, nm_sr_request_t *p_request, void *ptr, nm_len_t len)
int nm_sr_flush(struct nm_session_s *p_session)
Flush all pending requests (force submission to the core) and all pending events.
int nm_sr_request_unset_completion_queue(nm_session_t p_session, nm_sr_request_t *p_request)
Ask to not enqueue the request in the completion queue upon completion.
static int nm_sr_send_data(nm_session_t p_session, nm_gate_t p_gate, nm_tag_t tag, struct nm_data_s *p_data)
blocking data send
static int nm_sr_send(nm_session_t p_session, nm_gate_t p_gate, nm_tag_t tag, const void *data, nm_len_t len)
blocking send
static int nm_sr_recv_irecv(nm_session_t p_session, nm_sr_request_t *p_request, nm_gate_t p_gate, nm_tag_t tag, nm_tag_t mask)
int nm_sr_request_set_completion_queue(nm_session_t p_session, nm_sr_request_t *p_request)
Ask to enqueue the request in the completion queue upon completion.
static int nm_sr_request_get_expected_size(nm_sr_request_t *request, nm_len_t *size)
Returns the expected size (to be received or to be sent) of the message with the specified request.
static void nm_sr_send_pack_iov(nm_session_t p_session, nm_sr_request_t *p_request, const struct iovec *iov, int num_entries)
Pack data described through iovec into the given request.
static nm_session_t nm_sr_request_get_session(nm_sr_request_t *p_request)
Returns the session this request belongs to.
int nm_sr_send_success(nm_session_t p_session, nm_sr_request_t **out_req)
Poll for any completed send request.
int nm_sr_probe(nm_session_t p_session, nm_gate_t p_gate, nm_gate_t *p_out_gate, nm_tag_t tag, nm_tag_t tag_mask, nm_tag_t *p_out_tag, nm_len_t *p_out_len)
Unblockingly check if a packet is available for extraction on the (gate,tag) pair .
static void nm_sr_send_pack_data(nm_session_t p_session, nm_sr_request_t *p_request, const struct nm_data_s *p_data)
Pack data described through an iterator into the given request.
static int nm_sr_rsend(nm_session_t p_session, nm_gate_t p_gate, nm_tag_t tag, const void *data, nm_len_t len, nm_sr_request_t *p_request)
Post a ready send request, i.e.
static int nm_sr_irecv(nm_session_t p_session, nm_gate_t p_gate, nm_tag_t tag, void *data, nm_len_t len, nm_sr_request_t *p_request)
Post a non blocking receive request.
static int nm_sr_send_submit(nm_session_t p_session, nm_sr_request_t *p_request)
submit the request once it is built
static void * nm_sr_request_get_ref(nm_sr_request_t *p_request)
Retrieve the 'ref' from a sendrecv request.
static int nm_sr_request_set_ref(nm_sr_request_t *p_request, void *ref)
Add a user reference to a request.
static int nm_sr_recv_iprobe(nm_session_t p_session, nm_sr_request_t *p_request)
probes whether an incoming packet matched this non-posted request
int nm_sr_scancel(nm_session_t p_session, nm_sr_request_t *p_request)
Cancel a emission request.
static int nm_sr_isend(nm_session_t p_session, nm_gate_t p_gate, nm_tag_t tag, const void *data, nm_len_t len, nm_sr_request_t *p_request)
Post a non blocking send request.
static void nm_sr_send_pack_contiguous(nm_session_t p_session, nm_sr_request_t *p_request, const void *, nm_len_t len)
Pack contiguous data into the given request.
static void nm_sr_recv_data_size_wait(nm_session_t p_session, nm_sr_request_t *p_request)
waits for data size to be available, for a request posted without data descriptor
@ NM_SR_EVENT_NONE
no event
@ NM_SR_EVENT_RECV_DATA
some data has arrived on a req posted without data spec
@ NM_SR_EVENT_SEND_COMPLETED
a posted send has completed
@ NM_SR_EVENT_RECV_CANCELLED
recv operation was canceled
@ NM_SR_EVENT_FINALIZED
request finalized, may be freed by user
@ NM_SR_EVENT_RECV_UNEXPECTED
an unexpected packet has arrived.
@ NM_SR_EVENT_RECV_COMPLETED
a posted recv has completed
nm_tag_t tag
the user-supplied tag
nm_len_t len
Definition nm_data.h:1007
nm_data_propertie_gpu_preinit & p_data
Definition nm_data.h:539
static nm_session_t p_session
static nm_gate_t p_gate
nm_prio_t priority
Definition nm_headers.h:6
uint16_t hlen
length in header (header + data in header)
Definition nm_headers.h:5
uint64_t req
a type of debug request; unused for now
Definition nm_headers.h:1
nm_mpi_status_t status
status of request
nm_len_t size
size of the onsided data (not incuding target-side completion)
This is the common public header for NewMad.
#define NM_EXTERN_C_END
Definition nm_public.h:78
#define NM_EXTERN_C_BEGIN
Definition nm_public.h:77
This file contains private bits of the sendrecv interface.
int32_t nm_prio_t
message priority
Definition nm_types.h:78
uint64_t nm_tag_t
user tags, 64 bits, contained in indirect hashtable
Definition nm_types.h:56
uint64_t nm_len_t
data length used by nmad
Definition nm_types.h:68
#define NM_TAG_MASK_FULL
tag mask that matches all bits
Definition nm_types.h:61
An event, generated by the NewMad core.
a data descriptor, used to pack/unpack data from app layout to/from contiguous buffers
Definition nm_data.h:200
Connection to another process.
Definition nm_gate.h:109
a global monitor to listen to events on the full session
nm_tag_t tag
tag value for event filter
nm_sr_event_notifier_t p_notifier
the function to call when a matching event happen
nm_tag_t tag_mask
tag mask for event filter- fire event when event.tag & monitor.tag_mask == monitor....
void * ref
reference for user
nm_sr_event_t event_mask
a bitmask containing events kinds to listen to
nm_gate_t p_gate
listen for events on given gate; NM_ANY_GATE for any
internal defintion of the sendrecv request
information field for sendrecv events
const struct nm_core_event_s * p_core_event
nm_sr_request_t * p_request
the request on which the event happened
nm_session_t p_session
session where the unexpected packet arrived
nm_tag_t tag
tag of the unexpected received packet
nm_gate_t p_gate
gate from where the unexpected packet arrived
nm_len_t len
length of unexpected data