#ifndef UCP_AM_H_
#define UCP_AM_H_
#include <ucs/datastruct/array.h>
#include <ucp/rndv/rndv.h>
#define ucp_am_hdr_from_rts(_rts) \
({ \
UCS_STATIC_ASSERT(sizeof((_rts)->hdr) == sizeof(ucp_am_hdr_t)); \
((ucp_am_hdr_t*)&(_rts)->hdr); \
})
enum {
UCP_AM_CB_PRIV_FIRST_FLAG = UCS_BIT(15),
UCP_AM_CB_PRIV_FLAG_NBX = UCP_AM_CB_PRIV_FIRST_FLAG
};
typedef struct ucp_am_entry {
union {
ucp_am_callback_t cb_old;
ucp_am_recv_callback_t cb;
};
void *context;
unsigned flags;
} ucp_am_entry_t;
UCS_ARRAY_DECLARE_TYPE(ucp_am_cbs, unsigned, ucp_am_entry_t)
typedef struct ucp_am_info {
size_t alignment;
ucs_array_t(ucp_am_cbs) cbs;
} ucp_am_info_t;
typedef union {
struct {
uint16_t am_id;
uint16_t flags;
uint32_t header_length;
};
uint64_t u64;
} UCS_S_PACKED ucp_am_hdr_t;
typedef struct {
size_t offset;
} UCS_S_PACKED ucp_am_mid_hdr_t;
typedef struct {
uint64_t ep_id;
} UCS_S_PACKED ucp_am_reply_ftr_t;
typedef struct {
uint64_t msg_id;
uint64_t ep_id;
} UCS_S_PACKED ucp_am_mid_ftr_t;
typedef struct {
ucp_am_mid_ftr_t super;
size_t total_size;
} UCS_S_PACKED ucp_am_first_ftr_t;
typedef struct {
ucs_list_link_t list;
size_t remaining;
} ucp_am_first_desc_t;
ucs_status_t ucp_am_init(ucp_worker_h worker);
void ucp_am_cleanup(ucp_worker_h worker);
void ucp_am_ep_init(ucp_ep_h ep);
void ucp_am_ep_cleanup(ucp_ep_h ep);
size_t ucp_am_max_header_size(ucp_worker_h worker);
ucs_status_t ucp_proto_progress_am_rndv_rts(uct_pending_req_t *self);
ucs_status_t ucp_am_rndv_process_rts(void *arg, void *data, size_t length,
unsigned tl_flags);
#endif