/*
 * Copyright (C) by Argonne National Laboratory
 *     See COPYRIGHT in top-level directory
 */

#include "mpi.h"
#include <stdio.h>

/* style: allow:printf:6 sig:0 */

/* This definition is almost the same as the MPIR_Comm_list in dbginit,
   except a void * is used instead of MPIR_Comm * for head; for the use
   here, void * is all that is needed */
typedef struct MPIR_Comm_list {
    int sequence_number;        /* Used to detect changes in the list */
    void *head;                 /* Head of the list */
} MPIR_Comm_list;

extern MPIR_Comm_list MPIR_All_communicators;

int main(int argc, char **argv)
{
    int errs = 0;
    MPI_Init(&argc, &argv);

    printf("sequence number for communicators is %d\n", MPIR_All_communicators.sequence_number);
    printf("head pointer is %p\n", MPIR_All_communicators.head);

    if (MPIR_All_communicators.head == (void *) 0) {
        printf("ERROR: The communicator list field has a null head pointer\n");
        printf("Either the debugger support is not enabled (--enable-debuginfo)\n\
or the necessary symbols, including the extern variable\n\
MPIR_All_communicators, are not properly exported to the main program\n");
        errs++;
    }

    MPI_Finalize();
    if (errs) {
        printf(" Found %d errors\n", errs);
    } else {
        printf(" No Errors\n");
    }

    return 0;
}
