16#ifndef NM_SENDRECV_PRIVATE_H
17#define NM_SENDRECV_PRIVATE_H
44#define NM_SR_EVENT_MONITOR_NULL ((struct nm_sr_event_monitor_s){ (nm_sr_event_t)0, (nm_sr_event_notifier_t)NULL })
46#define NM_SR_EVENT_MONITOR_NULL ((struct nm_sr_event_monitor_s){ .mask = 0, .notifier = NULL })
60#define NM_SR_REQUEST_NULL ((struct nm_sr_request_s){ .p_session = NULL, .monitor = NM_SR_EVENT_MONITOR_NULL, .ref = NULL})
71 return p_request->
ref;
151 const uintptr_t offset = (uintptr_t)&p_req->
req - (uintptr_t)p_req;
152 struct nm_core*p_core = nm_core_get_singleton();
161 return p_request->
req.
err;
169 nm_core_t p_core = nm_core_get_singleton();
171 return p_request->
req.
err;
182 nm_core_t p_core = nm_core_get_singleton();
185 p_request->
ref = NULL;
190 nm_core_t p_core = nm_core_get_singleton();
201 const struct iovec*v,
int n)
211 nm_core_t p_core = nm_core_get_singleton();
219 nm_core_t p_core = nm_core_get_singleton();
225 nm_core_t p_core = nm_core_get_singleton();
231 nm_core_t p_core = nm_core_get_singleton();
239 nm_core_t p_core = nm_core_get_singleton();
254 nm_core_t p_core = nm_core_get_singleton();
263 nm_core_t p_core = nm_core_get_singleton();
274 nm_core_t p_core = nm_core_get_singleton();
277 p_request->
ref = NULL;
283 nm_core_t p_core = nm_core_get_singleton();
296 const struct iovec*v,
int n)
313 nm_core_t p_core = nm_core_get_singleton();
322 nm_core_t p_core = nm_core_get_singleton();
328 nm_core_t p_core = nm_core_get_singleton();
336 nm_core_t p_core = nm_core_get_singleton();
344 nm_core_t p_core = nm_core_get_singleton();
351 nm_core_t p_core = nm_core_get_singleton();
357 nm_core_t p_core = nm_core_get_singleton();
364 nm_core_t p_core = nm_core_get_singleton();
371 nm_core_t p_core = nm_core_get_singleton();
int nm_core_unpack_iprobe(struct nm_core *p_core, struct nm_req_s *p_unpack)
probes whether an incoming packet matched this unposted request.
void nm_core_pack_data(nm_core_t p_core, struct nm_req_s *p_pack, const struct nm_data_s *p_data)
build a pack request from data descriptor
void nm_core_unpack_init(struct nm_core *p_core, struct nm_req_s *p_unpack)
initializes an empty unpack request
#define NM_REQ_FLAG_UNPACK
request is an unpack
int nm_core_unpack_peek(struct nm_core *p_core, struct nm_req_s *p_unpack, const struct nm_data_s *p_data, nm_len_t peek_offset, nm_len_t peek_len)
peeks unexpected data without consumming it.
void nm_core_pack_send(struct nm_core *p_core, struct nm_req_s *p_pack, nm_core_tag_t tag, nm_gate_t p_gate, nm_req_flag_t flags)
set tag/gate/flags for pack request
void nm_core_unpack_offset(struct nm_core *p_core, struct nm_req_s *p_unpack, nm_len_t offset)
set an offset on data; data before offset will be discarded
#define NM_STATUS_UNPACK_DATA_SIZE
size of data is known (last chunk of data arrived), not unpacked yet- event triggered only if unpack ...
#define NM_STATUS_FINALIZED
request is finalized, may be freed
#define NM_REQ_FLAG_NONE
no flag set
void nm_core_unpack_match_recv(struct nm_core *p_core, struct nm_req_s *p_unpack, nm_gate_t p_gate, nm_core_tag_t tag, nm_core_tag_t tag_mask)
match an unpack request with given gate/tag, next sequence number assumed
void nm_core_pack_init(struct nm_core *p_core, struct nm_req_s *p_pack)
initializes an empty pack request
#define NM_CORE_TAG_HASH_FULL
mask for all sessions
#define NM_STATUS_UNPACK_DATA0
first byte of data arrived, not unpacked yet- event triggered only if unpack is posted without data s...
struct nm_core_event_s __attribute__
void nm_core_pack_submit(struct nm_core *p_core, struct nm_req_s *p_pack)
post a pack request
static void nm_status_wait_all(void **pp_reqs, int n, uintptr_t offset, nm_status_t bitmask, nm_core_t p_core)
wait for all reqs, any bit in bitmask
void nm_core_unpack_data(struct nm_core *p_core, struct nm_req_s *p_unpack, const struct nm_data_s *p_data)
build an unpack request from data descriptor
#define NM_REQ_FLAG_PACK_SYNCHRONOUS
flag pack as synchronous (i.e.
static void nm_core_pack_set_hlen(struct nm_core *p_core __attribute__((unused)), struct nm_req_s *p_pack, nm_len_t hlen)
set a header length for the given pack request
uint32_t nm_status_t
status bits of pack/unpack requests
static nm_core_tag_t nm_core_tag_build(nm_session_hash_t hashcode, nm_tag_t tag)
static int nm_status_test_allbits(struct nm_req_s *p_req, nm_status_t bitmask)
tests for all given bits in status
void nm_core_unpack_match_event(struct nm_core *p_core, struct nm_req_s *p_unpack, const struct nm_core_event_s *p_event)
match an unpack request with a packet that triggered an event
static nm_tag_t nm_core_tag_get_tag(nm_core_tag_t core_tag)
#define NM_REQ_FLAG_PACK
request is a pack
void nm_core_unpack_submit(struct nm_core *p_core, struct nm_req_s *p_unpack, nm_req_flag_t flags)
submit an unpack request
#define NM_STATUS_UNPACK_POSTED
unpack operation is in progress
void nm_core_pack_set_priority(struct nm_core *p_core, struct nm_req_s *p_pack, nm_prio_t priority)
set a priority for the given pack request
static void nm_status_wait(struct nm_req_s *p_req, nm_status_t bitmask, nm_core_t p_core)
wait for any bit matching in req status
#define NM_STATUS_UNPACK_COMPLETED
unpack operation has completed
static nm_status_t nm_status_test(const struct nm_req_s *p_req, nm_status_t bitmask)
query for given bits in req status; returns matched bits
void nm_core_pack_submit_chunks(struct nm_core *p_core, struct nm_req_s *p_pack, int n, const struct nm_chunk_s *p_chunks)
@ NM_EALREADY
already in progress or done
@ NM_ESUCCESS
successful operation
@ NM_EINVAL
invalid parameter
static nm_len_t nm_data_size(const struct nm_data_s *p_data)
returns the amount of data contained in the descriptor
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.
nm_sr_event_t
events for nm_sr_monitor()
int nm_sr_request_wait(nm_sr_request_t *p_request)
Wait for request completion (or cancelation)
nm_tag_t tag
the user-supplied tag
static void nm_data_contiguous_build(struct nm_data_s *p_data, void *ptr, nm_len_t len)
static void nm_data_iov_build(struct nm_data_s *p_data, const struct iovec *v, int n)
static nm_session_t p_session
nm_mpi_status_t status
status of request
nm_len_t size
size of the onsided data (not incuding target-side completion)
int nm_sr_progress(nm_session_t p_session)
Calls the scheduler.
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)
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)
static int nm_sr_recv_peek(nm_session_t p_session, nm_sr_request_t *p_request, const struct nm_data_s *p_data)
static nm_gate_t nm_sr_request_get_gate(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)
static void nm_sr_recv_data_wait(nm_session_t p_session, nm_sr_request_t *p_request)
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)
static void nm_sr_send_pack_contiguous(nm_session_t p_session, nm_sr_request_t *p_request, const void *ptr, nm_len_t len)
static int nm_sr_request_get_error(nm_sr_request_t *p_request)
static nm_tag_t nm_sr_request_get_tag(nm_sr_request_t *p_request)
static void nm_sr_recv_unpack_iov(nm_session_t p_session, nm_sr_request_t *p_request, const struct iovec *v, int n)
static int nm_sr_rwait(nm_session_t p_session __attribute__((unused)), nm_sr_request_t *p_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)
static int nm_sr_send_header(nm_session_t p_session, nm_sr_request_t *p_request, nm_len_t hlen)
static int nm_sr_request_isnull(nm_sr_request_t *p_request)
static int nm_sr_recv_post(nm_session_t p_session, nm_sr_request_t *p_request)
static void nm_sr_send_init(nm_session_t p_session, nm_sr_request_t *p_request)
static int nm_sr_rwait_data(nm_session_t p_session, nm_sr_request_t *p_request)
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)
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)
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)
static void nm_sr_request_wait_all(nm_sr_request_t **p_requests, int n)
static int nm_sr_recv_data_test(nm_session_t p_session, nm_sr_request_t *p_request)
static void nm_sr_recv_offset(nm_session_t p_session, nm_sr_request_t *p_request, nm_len_t offset)
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)
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)
static int nm_sr_request_get_expected_size(nm_sr_request_t *p_request, nm_len_t *size)
static int nm_sr_request_get_size(nm_sr_request_t *p_request, nm_len_t *size)
static void nm_sr_recv_unpack_contiguous(nm_session_t p_session, nm_sr_request_t *p_request, void *ptr, nm_len_t len)
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)
#define NM_SR_EVENT_MONITOR_NULL
static nm_session_t nm_sr_request_get_session(nm_sr_request_t *p_request)
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)
static int nm_sr_send_submit(nm_session_t p_session, nm_sr_request_t *p_request)
static int nm_sr_swait(nm_session_t p_session __attribute__((unused)), nm_sr_request_t *p_request)
static void * nm_sr_request_get_ref(nm_sr_request_t *p_request)
static int nm_sr_request_set_ref(nm_sr_request_t *p_request, void *ref)
static int nm_sr_recv_iprobe(nm_session_t p_session, nm_sr_request_t *p_request)
static int nm_sr_request_test(nm_sr_request_t *p_request, nm_status_t status)
static void nm_sr_send_pack_iov(nm_session_t p_session, nm_sr_request_t *p_request, const struct iovec *v, int n)
static void nm_sr_recv_data_size_wait(nm_session_t p_session, nm_sr_request_t *p_request)
#define NM_LEN_UNDEFINED
length is undefined
int32_t nm_prio_t
message priority
uint64_t nm_tag_t
user tags, 64 bits, contained in indirect hashtable
uint64_t nm_len_t
data length used by nmad
Core NewMadeleine structure.
a data descriptor, used to pack/unpack data from app layout to/from contiguous buffers
Connection to another process.
a generic pack/unpack request
struct nm_req_s::@18::@21 unpack
nm_core_tag_t tag
tag to send to/from (works in combination with tag_mask for recv)
nm_len_t expected_len
length of posted recv (may be updated if matched packet is shorter)
nm_gate_t p_gate
dest/src gate; NULL if recv from any source
nm_len_t done
cumulated length of data sent so far
nm_req_flag_t flags
flags given by user
struct nm_req_s::@18::@20 pack
nm_len_t cumulated_len
amount of data unpacked so far
nm_len_t len
cumulated data length
int err
error status of the request
nm_session_hash_t hash_code
hash of session label, used as ID on the wire
descriptor for an event monitor
nm_sr_event_notifier_t notifier
notification function to call uppon event
nm_sr_event_t mask
event bitmask
internal defintion of the sendrecv request
void * ref
reference usable by end-user
struct nm_req_s req
inlined core pack/unpack request to avoid dynamic allocation
nm_session_t p_session
session this request belongs to
struct nm_sr_event_monitor_s monitor
events triggered on status transitions
information field for sendrecv events
struct nm_sr_event_info_t::@55 recv_unexpected
field for unexpected packets (global event NM_SR_EVENT_RECV_UNEXPECTED)
const struct nm_core_event_s * p_core_event