00001
00002
00003
00004
00005
00006
00007 #include "mpioimpl.h"
00008 #include "adio_extern.h"
00009
00010 #ifdef HAVE_WEAK_SYMBOLS
00011
00012 #if defined(HAVE_PRAGMA_WEAK)
00013 #pragma weak MPI_Register_datarep = PMPI_Register_datarep
00014 #elif defined(HAVE_PRAGMA_HP_SEC_DEF)
00015 #pragma _HP_SECONDARY_DEF PMPI_Register_datarep MPI_Register_datarep
00016 #elif defined(HAVE_PRAGMA_CRI_DUP)
00017 #pragma _CRI duplicate MPI_Register_datarep as PMPI_Register_datarep
00018
00019 #endif
00020
00021
00022 #define MPIO_BUILD_PROFILING
00023 #include "mpioprof.h"
00024 #endif
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 int MPI_Register_datarep(char *name,
00052 MPI_Datarep_conversion_function *read_conv_fn,
00053 MPI_Datarep_conversion_function *write_conv_fn,
00054 MPI_Datarep_extent_function *extent_fn,
00055 void *state)
00056 {
00057 int error_code;
00058 ADIOI_Datarep *datarep;
00059 static char myname[] = "MPI_REGISTER_DATAREP";
00060
00061 MPIU_THREAD_CS_ENTER(ALLFUNC,);
00062
00063
00064
00065
00066 if (name == NULL ||
00067 strlen(name) < 1 ||
00068 strlen(name) > MPI_MAX_DATAREP_STRING)
00069 {
00070 error_code = MPIO_Err_create_code(MPI_SUCCESS,
00071 MPIR_ERR_RECOVERABLE,
00072 myname, __LINE__,
00073 MPI_ERR_ARG,
00074 "**datarepname", 0);
00075 error_code = MPIO_Err_return_file(MPI_FILE_NULL, error_code);
00076 goto fn_exit;
00077 }
00078
00079
00080 MPIR_MPIOInit(&error_code);
00081 if (error_code != MPI_SUCCESS) goto fn_exit;
00082
00083
00084
00085 for (datarep = CtvAccess(ADIOI_Datarep_head); datarep; datarep = datarep->next) {
00086 if (!strncmp(name, datarep->name, MPI_MAX_DATAREP_STRING)) {
00087 error_code = MPIO_Err_create_code(MPI_SUCCESS,
00088 MPIR_ERR_RECOVERABLE,
00089 myname, __LINE__,
00090 MPI_ERR_DUP_DATAREP,
00091 "**datarepused",
00092 "**datarepused %s",
00093 name);
00094 error_code = MPIO_Err_return_file(MPI_FILE_NULL, error_code);
00095 goto fn_exit;
00096 }
00097 }
00098
00099
00100 if (extent_fn == NULL)
00101 {
00102 error_code = MPIO_Err_create_code(MPI_SUCCESS,
00103 MPIR_ERR_RECOVERABLE,
00104 myname, __LINE__,
00105 MPI_ERR_ARG,
00106 "**datarepextent", 0);
00107 error_code = MPIO_Err_return_file(MPI_FILE_NULL, error_code);
00108 goto fn_exit;
00109 }
00110
00111
00112 datarep = ADIOI_Malloc(sizeof(ADIOI_Datarep));
00113
00114
00115
00116 #ifdef MPICH2
00117 datarep->name = MPIU_Strdup(name);
00118 #else
00119 datarep->name = ADIOI_Strdup(name);
00120 #endif
00121 datarep->state = state;
00122 datarep->read_conv_fn = read_conv_fn;
00123 datarep->write_conv_fn = write_conv_fn;
00124 datarep->extent_fn = extent_fn;
00125 datarep->next = CtvAccess(ADIOI_Datarep_head);
00126
00127 CtvAccess(ADIOI_Datarep_head) = datarep;
00128
00129 error_code = MPI_SUCCESS;
00130
00131 fn_exit:
00132 MPIU_THREAD_CS_EXIT(ALLFUNC,);
00133
00134 return error_code;
00135 }