#ifndef UCP_DT_H_
#define UCP_DT_H_
#include <ucp/api/ucp.h>
#include <ucp/core/ucp_mm.h>
#include <ucp/core/ucp_types.h>
#include <ucs/arch/cpu.h>
#include <ucs/profile/profile.h>
#include <uct/api/uct.h>
typedef enum ucp_dt_type ucp_dt_class_t;
typedef struct ucp_dt_reg {
ucp_md_map_t md_map;
uct_mem_h memh[UCP_MAX_OP_MDS];
} ucp_dt_reg_t;
typedef struct ucp_dt_state {
size_t offset;
union {
ucp_dt_reg_t contig;
struct {
size_t iov_offset;
size_t iovcnt_offset;
size_t iovcnt;
ucp_dt_reg_t *dt_reg;
} iov;
struct {
void *state;
} generic;
} dt;
} ucp_dt_state_t;
typedef struct {
uint8_t type;
ucs_sys_device_t sys_dev;
} ucp_memory_info_t;
typedef ucs_status_t (*ucp_dt_pack_func_t)(ucp_worker_h worker, void *dest,
const void *src, size_t length,
ucs_memory_type_t mem_type);
typedef ucs_status_t (*ucp_dt_unpack_func_t)(ucp_worker_h worker, void *dest,
const void *src, size_t length,
ucs_memory_type_t mem_type);
extern const char *ucp_datatype_class_names[];
size_t ucp_dt_pack(ucp_worker_h worker, ucp_datatype_t datatype,
ucs_memory_type_t mem_type, void *dest, const void *src,
ucp_dt_state_t *state, size_t length);
ucs_status_t ucp_mem_type_pack(ucp_worker_h worker, void *dest,
const void *src, size_t length,
ucs_memory_type_t mem_type);
ucs_status_t ucp_mem_type_unpack(ucp_worker_h worker, void *buffer,
const void *recv_data, size_t recv_length,
ucs_memory_type_t mem_type);
static UCS_F_ALWAYS_INLINE ucs_status_t
ucp_memcpy_pack_unpack(ucp_worker_h worker, void *buffer, const void *data,
size_t length, ucs_memory_type_t mem_type)
{
UCS_PROFILE_CALL(ucs_memcpy_relaxed, buffer, data, length);
return UCS_OK;
}
#endif