Skip to content
Snippets Groups Projects
Commit 4cd92cf2 authored by Thomas Jahns's avatar Thomas Jahns :cartwheel:
Browse files

Extract part of xmap copy code.

parent a00197c1
No related branches found
No related tags found
No related merge requests found
......@@ -186,30 +186,54 @@ static int xmap_intersection_ext_get_max_dst_pos(Xt_xmap xmap) {
return xmie(xmap)->max_dst_pos;
}
typedef void (*Xt_pos_ext_copy)(size_t num_orig_pos_ext,
size_t *num_pos_ext,
struct Xt_pos_ext **pos_ext,
const struct Xt_pos_ext *orig_pos_ext,
size_t num_orig_pos, const int *orig_pos,
void *state);
static void
pos_ext_copy_verbatim(size_t num_orig_pos_ext,
size_t *num_pos_ext,
struct Xt_pos_ext **pos_ext,
const struct Xt_pos_ext *orig_pos_ext,
size_t num_orig_pos, const int *orig_pos,
void *state)
{
(void)state; (void)num_orig_pos; (void)orig_pos;
size_t size_pos_ext = num_orig_pos_ext * sizeof (**pos_ext);
struct Xt_pos_ext *pos_ext_ = *pos_ext = xmalloc(size_pos_ext);
memcpy(pos_ext_, orig_pos_ext, size_pos_ext);
*num_pos_ext = num_orig_pos_ext;
}
static void
xmap_intersection_ext_msg_copy(size_t nmsg, struct exchange_ext *restrict msg,
int *nmsg_copy, struct exchange_ext **msg_copy)
xmap_intersection_ext_msg_copy(size_t nmsg,
const struct exchange_ext *restrict msg,
int *nmsg_copy, struct exchange_ext **msg_copy,
Xt_pos_ext_copy pos_ext_copy, void *pec_state)
{
*nmsg_copy = (int)nmsg;
struct exchange_ext *restrict msg_copy_
= *msg_copy = xmalloc(sizeof (*msg_copy_) * nmsg);
for (size_t i = 0; i < nmsg; ++i) {
size_t num_transfer_pos_ext
= (size_t)(msg_copy_[i].num_transfer_pos_ext
= msg[i].num_transfer_pos_ext);
msg_copy_[i].num_transfer_pos = msg[i].num_transfer_pos;
msg_copy_[i].rank = msg[i].rank;
msg_copy_[i].transfer_pos = NULL;
size_t size_transfer_pos_ext
= num_transfer_pos_ext * sizeof (*(msg[i].transfer_pos_ext));
msg_copy_[i].transfer_pos_ext = xmalloc(size_transfer_pos_ext);
memcpy(msg_copy_[i].transfer_pos_ext, msg[i].transfer_pos_ext,
size_transfer_pos_ext);
size_t num_transfer_pos_ext;
pos_ext_copy((size_t)msg[i].num_transfer_pos_ext, &num_transfer_pos_ext,
&msg_copy_[i].transfer_pos_ext, msg[i].transfer_pos_ext,
(size_t)msg[i].num_transfer_pos, msg[i].transfer_pos,
pec_state);
msg_copy_[i].num_transfer_pos_ext = (int)num_transfer_pos_ext;
}
}
static Xt_xmap
xmap_intersection_ext_copy(Xt_xmap xmap)
xmap_intersection_ext_copy_(Xt_xmap xmap,
Xt_pos_ext_copy pe_cpy_in, void *peci_state,
Xt_pos_ext_copy pe_cpy_out, void *peco_state)
{
Xt_xmap_intersection_ext xmap_intersection_ext = xmie(xmap),
xmap_intersection_ext_new = xmalloc(sizeof (*xmap_intersection_ext_new));
......@@ -220,16 +244,26 @@ xmap_intersection_ext_copy(Xt_xmap xmap)
xmap_intersection_ext_new->max_dst_pos = xmap_intersection_ext->max_dst_pos;
xmap_intersection_ext_msg_copy(n_in, xmap_intersection_ext->in_msg,
&xmap_intersection_ext_new->n_in,
&xmap_intersection_ext_new->in_msg);
&xmap_intersection_ext_new->in_msg,
pe_cpy_in, peci_state);
xmap_intersection_ext_msg_copy(n_out, xmap_intersection_ext->out_msg,
&xmap_intersection_ext_new->n_out,
&xmap_intersection_ext_new->out_msg);
&xmap_intersection_ext_new->out_msg,
pe_cpy_out, peco_state);
xmap_intersection_ext_new->comm
= xt_mpi_comm_smart_dup(xmap_intersection_ext->comm,
&xmap_intersection_ext_new->tag_offset);
return (Xt_xmap)xmap_intersection_ext_new;
}
static Xt_xmap
xmap_intersection_ext_copy(Xt_xmap xmap)
{
return xmap_intersection_ext_copy_(xmap,
pos_ext_copy_verbatim, NULL,
pos_ext_copy_verbatim, NULL);
}
static void
xt_free_exchange_ext(size_t num_msg, struct exchange_ext *restrict msg)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment