#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <assert.h>
#include <string.h>
#ifdef XT_NEED_MPI_ABORT_WORK_AROUND
# include <fcntl.h>
# include <sys/stat.h>
# include <sys/types.h>
#endif
#include <unistd.h>
#include <mpi.h>
#include <yaxt.h>
#define VERBOSE
#include "tests.h"
#include "ctest_common.h"
#include "test_xmap_common.h"
#ifndef __GNUC__
# define __attribute__(x)
#endif
static enum test_idxlist_size index_list_size = SMALL;
static void
parse_options(int *argc, char ***argv);
typedef void (*Xt_abort_func)(
MPI_Comm comm,
const char *msg,
const char *source, int line)
extern Xt_abort_func Xt_abort;
int main(int argc, char **argv) {
test_init_mpi(&argc, &argv, comm);
int my_rank;
MPI_Comm_rank(comm, &my_rank);
parse_options(&argc, &argv);
{
src_stripe.
nstrides = (index_list_size == SMALL)?7:1023;
src_stripe.start = (
Xt_int)(1 + (
Xt_int)my_rank * src_stripe.nstrides);
src_stripe.stride = 1;
dst_stripe.
nstrides = src_stripe.nstrides;
dst_stripe.start = (
Xt_int)(src_stripe.start + src_stripe.nstrides);
dst_stripe.stride = -1;
test_self_xmap_construct_idxstripes(&src_stripe, 1, &dst_stripe, 1,
xmap_new_fail3, comm);
}
return TEST_EXIT_CODE;
}
static void
xfail_abort(
MPI_Comm comm,
const char *msg,
const char *source,
int line)
{
Xt_abort_func orig_xt_abort = Xt_abort;
Xt_abort = xfail_abort;
Xt_abort = orig_xt_abort;
return xmap;
}
static void
parse_options(int *argc, char ***argv)
{
int opt;
while ((opt = getopt(*argc, *argv, "s:")) != -1) {
switch (opt) {
case 's':
if (!strcmp(optarg, "small"))
index_list_size = SMALL;
else if (!strcmp(optarg, "big"))
index_list_size = BIG;
else
{
fprintf(stderr, "Unknown data size \"%s\"\n", optarg);
exit(EXIT_FAILURE);
}
}
}
}
static void
xfail_abort(
MPI_Comm comm,
const char *msg,
const char *source,
int line)
{
fprintf(stderr, "Fatal error in %s, line %d: %s\n", source, line, msg);
#ifdef XT_NEED_MPI_ABORT_WORK_AROUND
static const char exit_msg[] = "MPI_Abort(0xdeadbeef, 3)\n";
int fd;
# if XT_NEED_MPI_ABORT_WORK_AROUND == 1
fd = STDERR_FILENO;
# elif XT_NEED_MPI_ABORT_WORK_AROUND == 2
fd = open("test_xmap_all2all_fail.result.txt",
O_WRONLY | O_TRUNC | O_CREAT | O_NOCTTY, 0777);
# endif
write(fd, exit_msg, sizeof (exit_msg)-1);
# if XT_NEED_MPI_ABORT_WORK_AROUND == 2
close(fd);
# endif
#endif
MPI_Abort(comm, 3);
abort();
}
void xt_initialize(MPI_Comm default_comm)
struct Xt_xmap_ * Xt_xmap
struct Xt_idxlist_ * Xt_idxlist
#define xt_mpi_call(call, comm)
Xt_xmap xt_xmap_all2all_new(Xt_idxlist src_idxlist, Xt_idxlist dst_idxlist, MPI_Comm comm)