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

exchangers: Add missing destructor.

parent 3e602a30
No related branches found
No related tags found
1 merge request!31Draft: Attempt at fuller exchanger interface
......@@ -124,7 +124,17 @@ xt_exchanger_get_MPI_Datatype(Xt_exchanger exchanger, int rank,
Xt_exchanger_thread_share
xt_exchanger_create_thread_share(Xt_exchanger exchanger, Xt_config config)
{
return exchanger->vtable->create_thread_share(exchanger, config);
if (exchanger->vtable->create_thread_share)
return exchanger->vtable->create_thread_share(exchanger, config);
else
return NULL;
}
void
xt_exchanger_destroy_thread_share(Xt_exchanger exchanger, Xt_exchanger_thread_share thread_share)
{
if (exchanger->vtable->destroy_thread_share)
exchanger->vtable->destroy_thread_share(exchanger, thread_share);
}
void
......
......@@ -81,6 +81,7 @@ struct xt_exchanger_vtable {
void (*team_share_destroy)(void *share);
size_t team_share_size;
Xt_exchanger_thread_share (*create_thread_share)(Xt_exchanger, Xt_config);
void (*destroy_thread_share)(Xt_exchanger, Xt_exchanger_thread_share);
Xt_exchanger_iter (*get_iterator)(Xt_exchanger exchanger, Xt_config config);
};
......@@ -230,6 +231,17 @@ xt_exchanger_new_team_share_destroy(Xt_exchanger_new exchanger_new,
PPM_DSO_INTERNAL Xt_exchanger_thread_share
xt_exchanger_create_thread_share(Xt_exchanger exchanger, Xt_config config);
/**
* Given an exchanger, destroy an object holding shared data for
* multi-threaded invocation.
*
* @param[in] exchanger exchanger to prepare the shared data for.
* @param[in] config custom configuration parameters
*/
PPM_DSO_INTERNAL void
xt_exchanger_destroy_thread_share(Xt_exchanger exchanger,
Xt_exchanger_thread_share thread_share);
PPM_DSO_INTERNAL void
xt_msg_params_copy(size_t n,
......
......@@ -235,6 +235,15 @@ xt_exchanger_irecv_isend_create_thread_share(
return (Xt_exchanger_thread_share)xt_request_msgs_alloc(nmsg, comm, config);
}
static void
xt_exchanger_irecv_isend_destroy_thread_share(
Xt_exchanger exchanger, Xt_exchanger_thread_share thread_share)
{
(void)exchanger;
/* assert that thread_share contains no in-flight requests */
free(thread_share);
}
Xt_exchanger
xt_exchanger_irecv_isend_new(int nsend, int nrecv,
......@@ -271,6 +280,7 @@ xt_exchanger_irecv_isend_new(int nsend, int nrecv,
s_exch_by_mthread_mode[mthread_mode],
a_exch_by_mthread_mode[mthread_mode],
xt_exchanger_irecv_isend_create_thread_share,
xt_exchanger_irecv_isend_destroy_thread_share,
config);
}
......
......@@ -253,6 +253,7 @@ xt_exchanger_irecv_isend_ddt_packed_new(int nsend, int nrecv,
xt_exchanger_irecv_isend_ddt_packed_s_exchange,
xt_exchanger_irecv_isend_ddt_packed_a_exchange,
(xt_simple_create_thread_share_func)0,
(xt_simple_destroy_thread_share_func)0,
config);
}
......
......@@ -559,6 +559,14 @@ xt_exchanger_irecv_isend_packed_create_thread_share(
return (Xt_exchanger_thread_share)shared_req;
}
static void
xt_exchanger_irecv_isend_packed_destroy_thread_share(
Xt_exchanger exchanger, Xt_exchanger_thread_share thread_share)
{
(void)exchanger;
/* assert that thread_share contains no in-flight requests */
free(thread_share);
}
Xt_exchanger
xt_exchanger_irecv_isend_packed_new(int nsend, int nrecv,
......@@ -596,6 +604,7 @@ xt_exchanger_irecv_isend_packed_new(int nsend, int nrecv,
s_exch_by_mthread_mode[mthread_mode],
a_exch_by_mthread_mode[mthread_mode],
xt_exchanger_irecv_isend_packed_create_thread_share,
xt_exchanger_irecv_isend_packed_destroy_thread_share,
config);
}
......
......@@ -180,6 +180,14 @@ xt_exchanger_irecv_send_create_thread_share(
return (Xt_exchanger_thread_share)xt_request_msgs_alloc(nrecv, comm, config);
}
static void
xt_exchanger_irecv_send_destroy_thread_share(
Xt_exchanger exchanger, Xt_exchanger_thread_share thread_share)
{
(void)exchanger;
/* assert that exchanger matches and thread_share contains no in-flight requests */
free(thread_share);
}
Xt_exchanger
xt_exchanger_irecv_send_new(int nsend, int nrecv,
......@@ -205,7 +213,8 @@ xt_exchanger_irecv_send_new(int nsend, int nrecv,
nsend, nrecv, send_msgs, recv_msgs,
comm, tag_offset,
s_exch_by_mthread_mode[mthread_mode], 0,
xt_exchanger_irecv_send_create_thread_share, config);
xt_exchanger_irecv_send_create_thread_share,
xt_exchanger_irecv_send_destroy_thread_share, config);
}
/*
......
......@@ -100,6 +100,10 @@ static Xt_exchanger_thread_share
xt_exchanger_mix_isend_irecv_create_thread_share(Xt_exchanger exchanger,
Xt_config config);
static void
xt_exchanger_mix_isend_irecv_destroy_thread_share(
Xt_exchanger exchanger, Xt_exchanger_thread_share thread_share);
static int
xt_exchanger_mix_isend_irecv_get_num_msg(Xt_exchanger exchanger,
int direction);
......@@ -127,6 +131,7 @@ xt_exchanger_mix_isend_irecv_vtable = {
.get_msg_ranks = xt_exchanger_mix_isend_irecv_get_msg_ranks,
.get_MPI_Datatype = xt_exchanger_mix_isend_irecv_get_MPI_Datatype,
.create_thread_share = xt_exchanger_mix_isend_irecv_create_thread_share,
.destroy_thread_share = xt_exchanger_mix_isend_irecv_destroy_thread_share,
.get_iterator = xt_exchanger_mix_isend_irecv_get_iterator,
}
#ifdef _OPENMP
......@@ -136,9 +141,11 @@ xt_exchanger_mix_isend_irecv_auto_omp_vtable = {
.delete = xt_exchanger_mix_isend_irecv_delete,
.s_exchange = xt_exchanger_mix_isend_irecv_s_exchange_omp,
.a_exchange = xt_exchanger_mix_isend_irecv_a_exchange_omp,
.get_num_msg = xt_exchanger_mix_isend_irecv_get_num_msg,
.get_msg_ranks = xt_exchanger_mix_isend_irecv_get_msg_ranks,
.get_MPI_Datatype = xt_exchanger_mix_isend_irecv_get_MPI_Datatype,
.create_thread_share = xt_exchanger_mix_isend_irecv_create_thread_share,
.destroy_thread_share = xt_exchanger_mix_isend_irecv_destroy_thread_share,
.get_iterator = xt_exchanger_mix_isend_irecv_get_iterator,
}
#endif
......@@ -436,6 +443,15 @@ xt_exchanger_mix_isend_irecv_create_thread_share(Xt_exchanger exchanger,
config);
}
static void
xt_exchanger_mix_isend_irecv_destroy_thread_share(
Xt_exchanger exchanger, Xt_exchanger_thread_share thread_share)
{
(void)exchanger;
/* assert that thread_share contains no in-flight requests */
free(thread_share);
}
static int
xt_exchanger_mix_isend_irecv_get_num_msg(Xt_exchanger exchanger,
int direction)
......
......@@ -93,6 +93,10 @@ static Xt_exchanger_thread_share
xt_exchanger_simple_base_create_thread_share(Xt_exchanger exchanger,
Xt_config config);
static void
xt_exchanger_simple_base_destroy_thread_share(
Xt_exchanger exchanger, Xt_exchanger_thread_share thread_share);
static Xt_exchanger_iter
xt_exchanger_simple_base_get_iterator(Xt_exchanger exchanger, Xt_config config);
......@@ -105,6 +109,7 @@ const struct xt_exchanger_vtable xt_exchanger_simple_base_vtable = {
.get_msg_ranks = xt_exchanger_simple_base_get_msg_ranks,
.get_MPI_Datatype = xt_exchanger_simple_base_get_MPI_Datatype,
.create_thread_share = xt_exchanger_simple_base_create_thread_share,
.destroy_thread_share = xt_exchanger_simple_base_destroy_thread_share,
.get_iterator = xt_exchanger_simple_base_get_iterator,
};
......@@ -121,6 +126,7 @@ struct Xt_exchanger_simple_base_ {
xt_simple_s_exchange_func s_func;
xt_simple_a_exchange_func a_func;
xt_simple_create_thread_share_func create_thread_share_func;
xt_simple_destroy_thread_share_func destroy_thread_share_func;
struct Xt_msg_param msgs[];
};
......@@ -167,6 +173,7 @@ xt_exchanger_simple_base_new(
xt_simple_s_exchange_func s_func,
xt_simple_a_exchange_func a_func,
xt_simple_create_thread_share_func create_thread_share_func,
xt_simple_destroy_thread_share_func destroy_thread_share_func,
Xt_config config)
{
/** note: tag_offset + xt_mpi_tag_exchange_msg must not
......@@ -194,6 +201,7 @@ xt_exchanger_simple_base_new(
exchanger->s_func = s_func;
exchanger->a_func = a_func;
exchanger->create_thread_share_func = create_thread_share_func;
exchanger->destroy_thread_share_func = destroy_thread_share_func;
{
int comm_size, comm_rank, is_inter;
......@@ -365,12 +373,27 @@ xt_exchanger_simple_base_create_thread_share(Xt_exchanger exchanger,
Xt_exchanger_simple_base exchanger_sb =
(Xt_exchanger_simple_base)exchanger;
int nsend = exchanger_sb->nmsg[SEND];
return exchanger_sb->create_thread_share_func(
nsend, exchanger_sb->nmsg[RECV],
exchanger_sb->msgs, exchanger_sb->msgs + nsend,
exchanger_sb->comm, config);
if (exchanger_sb->create_thread_share_func)
return exchanger_sb->create_thread_share_func(
nsend, exchanger_sb->nmsg[RECV],
exchanger_sb->msgs, exchanger_sb->msgs + nsend,
exchanger_sb->comm, config);
else
return NULL;
}
static void
xt_exchanger_simple_base_destroy_thread_share(
Xt_exchanger exchanger, Xt_exchanger_thread_share thread_share)
{
Xt_exchanger_simple_base exchanger_sb =
(Xt_exchanger_simple_base)exchanger;
/* assert that thread_share contains no in-flight requests */
if (exchanger_sb->destroy_thread_share_func)
exchanger_sb->destroy_thread_share_func(exchanger, thread_share);
}
typedef struct Xt_exchanger_simple_base_iter_ *Xt_exchanger_simple_base_iter;
struct Xt_exchanger_simple_base_iter_ {
......
......@@ -71,6 +71,9 @@ typedef Xt_exchanger_thread_share (*xt_simple_create_thread_share_func)(
const struct Xt_msg_param *send_msgs, const struct Xt_msg_param *recv_msgs,
MPI_Comm comm, Xt_config config);
typedef void (*xt_simple_destroy_thread_share_func)(
Xt_exchanger exchanger, Xt_exchanger_thread_share thread_share);
/**
* constructor for an exchanger using asynchronous send and recv
* @param[in] nsend number of send messages
......@@ -98,6 +101,7 @@ xt_exchanger_simple_base_new(
xt_simple_s_exchange_func s_func,
xt_simple_a_exchange_func a_func,
xt_simple_create_thread_share_func create_thread_share_func,
xt_simple_destroy_thread_share_func destroy_thread_share_func,
Xt_config config);
PPM_DSO_INTERNAL extern const struct xt_exchanger_vtable
......
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