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

Add query for exchanger vtable pointer.

* This provides for access to class information without needing an
  instance.
parent 3c3a6777
No related branches found
No related tags found
No related merge requests found
......@@ -142,6 +142,7 @@ libyaxt_c_la_SOURCES = \
instr.h \
xt_sort.c \
xt_exchanger.c \
xt_exchanger_vtable.c \
xt_exchanger.h \
xt_exchanger_simple_base.c \
xt_exchanger_simple_base.h \
......
......@@ -155,6 +155,17 @@ typedef Xt_exchanger
MPI_Comm comm, int tag_offset,
Xt_config config);
/**
* Given an exchanger constructor, query the vtable pointer
*
* @param[in] exchanger_new function to create new exchanger to query
* vtable pointer for
* @return vtable pointer
*/
PPM_DSO_INTERNAL const struct xt_exchanger_vtable *
xt_exchanger_new_get_vtable(Xt_exchanger_new exchanger_new);
#endif // XT_EXCHANGER_H
/*
* Local Variables:
......
......@@ -89,7 +89,8 @@ xt_exchanger_mix_isend_irecv_get_MPI_Datatype(Xt_exchanger exchanger,
enum xt_msg_direction direction,
bool do_dup);
static const struct xt_exchanger_vtable exchanger_mix_isend_irecv_vtable = {
const struct xt_exchanger_vtable
xt_exchanger_mix_isend_irecv_vtable = {
.copy = xt_exchanger_mix_isend_irecv_copy,
.delete = xt_exchanger_mix_isend_irecv_delete,
.s_exchange = xt_exchanger_mix_isend_irecv_s_exchange,
......@@ -119,7 +120,7 @@ xt_exchanger_mix_isend_irecv_alloc(size_t nmsg)
body_size = sizeof (struct Xt_redist_msg) * nmsg;
exchanger = xmalloc(header_size + body_size);
exchanger->n = (int)nmsg;
exchanger->vtable = &exchanger_mix_isend_irecv_vtable;
exchanger->vtable = &xt_exchanger_mix_isend_irecv_vtable;
return exchanger;
}
......
......@@ -78,6 +78,10 @@ xt_exchanger_mix_isend_irecv_new(int nsend, int nrecv,
MPI_Comm comm, int tag_offset,
Xt_config config);
PPM_DSO_INTERNAL extern const struct xt_exchanger_vtable
xt_exchanger_mix_isend_irecv_vtable;
#endif // XT_EXCHANGER_MIX_ISEND_IRECV_H
/*
......
......@@ -90,7 +90,7 @@ xt_exchanger_neigh_alltoall_get_MPI_Datatype(Xt_exchanger exchanger,
bool do_dup);
static const struct xt_exchanger_vtable exchanger_neigh_alltoall_vtable = {
const struct xt_exchanger_vtable xt_exchanger_neigh_alltoall_vtable = {
.copy = xt_exchanger_neigh_alltoall_copy,
.delete = xt_exchanger_neigh_alltoall_delete,
.s_exchange = xt_exchanger_neigh_alltoall_s_exchange,
......@@ -124,7 +124,7 @@ xt_exchanger_neigh_alltoall_alloc(size_t nsend, size_t nrecv)
exchanger->datatypes = xmalloc(nmsg * sizeof(*(exchanger->datatypes)));
exchanger->one_counts = xmalloc(max_msgs * sizeof(*(exchanger->one_counts)));
exchanger->displs = xmalloc(max_msgs * sizeof(*(exchanger->displs)));
exchanger->vtable = &exchanger_neigh_alltoall_vtable;
exchanger->vtable = &xt_exchanger_neigh_alltoall_vtable;
for (size_t i = 0; i < max_msgs; ++i) {
exchanger->one_counts[i] = 1;
exchanger->displs[i] = 0;
......
......@@ -76,6 +76,10 @@ xt_exchanger_neigh_alltoall_new(int nsend, int nrecv,
const struct Xt_redist_msg *recv_msgs,
MPI_Comm comm, int tag_offset, Xt_config config);
PPM_DSO_INTERNAL extern const struct xt_exchanger_vtable
xt_exchanger_neigh_alltoall_vtable;
#endif // XT_EXCHANGER_NEIGH_ALLTOALL_H
/*
......
......@@ -83,7 +83,7 @@ xt_exchanger_simple_base_get_MPI_Datatype(Xt_exchanger exchanger,
bool do_dup);
static const struct xt_exchanger_vtable exchanger_simple_base_vtable = {
const struct xt_exchanger_vtable xt_exchanger_simple_base_vtable = {
.copy = xt_exchanger_simple_base_copy,
.delete = xt_exchanger_simple_base_delete,
.s_exchange = xt_exchanger_simple_base_s_exchange,
......@@ -113,7 +113,7 @@ xt_exchanger_simple_base_alloc(size_t nmsg)
size_t header_size = sizeof(*exchanger),
body_size = nmsg * sizeof (exchanger->msgs[0]);
exchanger = xmalloc(header_size + body_size);
exchanger->vtable = &exchanger_simple_base_vtable;
exchanger->vtable = &xt_exchanger_simple_base_vtable;
return exchanger;
}
......
......@@ -90,6 +90,10 @@ xt_exchanger_simple_base_new(int nsend, int nrecv,
xt_simple_a_exchange_func a_func,
Xt_config config);
PPM_DSO_INTERNAL extern const struct xt_exchanger_vtable
xt_exchanger_simple_base_vtable;
#endif // XT_EXCHANGER_SIMPLE_BASE_H
/*
......
/**
* @file xt_exchanger_get_vtable.c
*
* @copyright Copyright (C) 2021 Jörg Behrens <behrens@dkrz.de>
* Moritz Hanke <hanke@dkrz.de>
* Thomas Jahns <jahns@dkrz.de>
*
* @author Jörg Behrens <behrens@dkrz.de>
* Moritz Hanke <hanke@dkrz.de>
* Thomas Jahns <jahns@dkrz.de>
*/
/*
* Keywords:
* Maintainer: Jörg Behrens <behrens@dkrz.de>
* Moritz Hanke <hanke@dkrz.de>
* Thomas Jahns <jahns@dkrz.de>
* URL: https://doc.redmine.dkrz.de/yaxt/html/
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* Neither the name of the DKRZ GmbH nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include "core/core.h"
#include "xt_exchanger.h"
#include "xt_exchanger_mix_isend_irecv.h"
#include "xt_exchanger_simple_base.h"
#if MPI_VERSION >= 3
# include "xt_exchanger_neigh_alltoall.h"
#endif
#include "xt_exchanger_irecv_isend_packed.h"
#include "xt_exchanger_irecv_isend.h"
#include "xt_exchanger_irecv_send.h"
PPM_DSO_INTERNAL const struct xt_exchanger_vtable *
xt_exchanger_new_get_vtable(Xt_exchanger_new exchanger_new)
{
const struct xt_exchanger_vtable *vtab = NULL;
if (exchanger_new == xt_exchanger_mix_isend_irecv_new)
vtab = &xt_exchanger_mix_isend_irecv_vtable;
else if (exchanger_new == xt_exchanger_irecv_isend_new
|| exchanger_new == xt_exchanger_irecv_isend_packed_new
|| exchanger_new == xt_exchanger_irecv_send_new)
vtab = &xt_exchanger_simple_base_vtable;
#if MPI_VERSION >= 3
else if (exchanger_new == xt_exchanger_neigh_alltoall_new)
vtab = &xt_exchanger_neigh_alltoall_vtable;
#endif
else
Xt_abort(Xt_default_comm, "unexpected exchanger constructor",
"xt_exchanger_vtable.c", __LINE__);
return vtab;
}
/*
* Local Variables:
* c-basic-offset: 2
* coding: utf-8
* indent-tabs-mode: nil
* show-trailing-whitespace: t
* require-trailing-newline: t
* End:
*/
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