/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* Copyright (C) 1997 University of Chicago.
* See COPYRIGHT notice in top-level directory.
*/
#include "mpioimpl.h"
#include "adio_extern.h"
#ifdef HAVE_WEAK_SYMBOLS
#if defined(HAVE_PRAGMA_WEAK)
#pragma weak MPI_Register_datarep = PMPI_Register_datarep
#elif defined(HAVE_PRAGMA_HP_SEC_DEF)
#pragma _HP_SECONDARY_DEF PMPI_Register_datarep MPI_Register_datarep
#elif defined(HAVE_PRAGMA_CRI_DUP)
#pragma _CRI duplicate MPI_Register_datarep as PMPI_Register_datarep
/* end of weak pragmas */
#elif defined(HAVE_WEAK_ATTRIBUTE)
int MPI_Register_datarep(const char *datarep, MPI_Datarep_conversion_function * read_conversion_fn,
MPI_Datarep_conversion_function * write_conversion_fn,
MPI_Datarep_extent_function * dtype_file_extent_fn, void *extra_state)
__attribute__ ((weak, alias("PMPI_Register_datarep")));
#endif
/* Include mapping from MPI->PMPI */
#define MPIO_BUILD_PROFILING
#include "mpioprof.h"
#endif
/*@
MPI_Register_datarep - Register functions for user-defined data
representations
Input Parameters:
+ datarep - data representation name (string)
. read_conversion_fn - function invoked to convert from file representation to
native representation (function)
. write_conversion_fn - function invoked to convert from native representation to
file representation (function)
. dtype_file_extent_fn - function invoked to get the exted of a datatype as represented
in the file (function)
- extra_state - pointer to extra state that is passed to each of the
three functions
Notes:
This function allows the user to provide routines to convert data from
an external representation, used within a file, and the native representation,
used within the CPU. There is one predefined data representation,
'external32'. Please consult the MPI-2 standard for details on this
function.
.N fortran
@*/
int MPI_Register_datarep(ROMIO_CONST char *datarep,
MPI_Datarep_conversion_function * read_conversion_fn,
MPI_Datarep_conversion_function * write_conversion_fn,
MPI_Datarep_extent_function * dtype_file_extent_fn, void *extra_state)
{
int error_code;
ADIOI_Datarep *adio_datarep;
static char myname[] = "MPI_REGISTER_DATAREP";
ROMIO_THREAD_CS_ENTER();
/* --BEGIN ERROR HANDLING-- */
/* check datarep name (use strlen instead of strnlen because
* strnlen is not portable) */
if (datarep == NULL || strlen(datarep) < 1 || strlen(datarep) > MPI_MAX_DATAREP_STRING) {
error_code = MPIO_Err_create_code(MPI_SUCCESS,
MPIR_ERR_RECOVERABLE,
myname, __LINE__, MPI_ERR_ARG, "**datarepname", 0);
error_code = MPIO_Err_return_file(MPI_FILE_NULL, error_code);
goto fn_exit;
}
/* --END ERROR HANDLING-- */
MPIR_MPIOInit(&error_code);
if (error_code != MPI_SUCCESS)
goto fn_exit;
/* --BEGIN ERROR HANDLING-- */
/* check datarep isn't already registered */
for (adio_datarep = ADIOI_Datarep_head; adio_datarep; adio_datarep = adio_datarep->next) {
if (!strncmp(datarep, adio_datarep->name, MPI_MAX_DATAREP_STRING)) {
error_code = MPIO_Err_create_code(MPI_SUCCESS,
MPIR_ERR_RECOVERABLE,
myname, __LINE__,
MPI_ERR_DUP_DATAREP,
"**datarepused", "**datarepused %s", datarep);
error_code = MPIO_Err_return_file(MPI_FILE_NULL, error_code);
goto fn_exit;
}
}
/* Check Non-NULL Read and Write conversion function pointer */
/* Read and Write conversions are currently not supported. */
if ((read_conversion_fn != NULL) || (write_conversion_fn != NULL)) {
error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
myname, __LINE__,
MPI_ERR_CONVERSION, "**drconvnotsupported", 0);
error_code = MPIO_Err_return_file(MPI_FILE_NULL, error_code);
goto fn_exit;
}
/* check extent function pointer */
if (dtype_file_extent_fn == NULL) {
error_code = MPIO_Err_create_code(MPI_SUCCESS,
MPIR_ERR_RECOVERABLE,
myname, __LINE__, MPI_ERR_ARG, "**datarepextent", 0);
error_code = MPIO_Err_return_file(MPI_FILE_NULL, error_code);
goto fn_exit;
}
/* --END ERROR HANDLING-- */
adio_datarep = ADIOI_Malloc(sizeof(ADIOI_Datarep));
adio_datarep->name = ADIOI_Strdup(datarep);
adio_datarep->state = extra_state;
adio_datarep->read_conv_fn = read_conversion_fn;
adio_datarep->write_conv_fn = write_conversion_fn;
adio_datarep->extent_fn = dtype_file_extent_fn;
adio_datarep->next = ADIOI_Datarep_head;
ADIOI_Datarep_head = adio_datarep;
error_code = MPI_SUCCESS;
fn_exit:
ROMIO_THREAD_CS_EXIT();
return error_code;
}