This source file includes following definitions.
- MPI_Register_datarep
1
2
3
4
5
6
7 #include "mpioimpl.h"
8 #include "adio_extern.h"
9
10 #ifdef HAVE_WEAK_SYMBOLS
11
12 #if defined(HAVE_PRAGMA_WEAK)
13 #pragma weak MPI_Register_datarep = PMPI_Register_datarep
14 #elif defined(HAVE_PRAGMA_HP_SEC_DEF)
15 #pragma _HP_SECONDARY_DEF PMPI_Register_datarep MPI_Register_datarep
16 #elif defined(HAVE_PRAGMA_CRI_DUP)
17 #pragma _CRI duplicate MPI_Register_datarep as PMPI_Register_datarep
18
19 #elif defined(HAVE_WEAK_ATTRIBUTE)
20 int MPI_Register_datarep(const char *datarep, MPI_Datarep_conversion_function *read_conversion_fn,
21 MPI_Datarep_conversion_function *write_conversion_fn,
22 MPI_Datarep_extent_function *dtype_file_extent_fn, void *extra_state) __attribute__((weak,alias("PMPI_Register_datarep")));
23 #endif
24
25
26 #define MPIO_BUILD_PROFILING
27 #include "mpioprof.h"
28 #endif
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 int MPI_Register_datarep(ROMIO_CONST char *datarep,
56 MPI_Datarep_conversion_function *read_conversion_fn,
57 MPI_Datarep_conversion_function *write_conversion_fn,
58 MPI_Datarep_extent_function *dtype_file_extent_fn,
59 void *extra_state)
60 {
61 int error_code;
62 ADIOI_Datarep *adio_datarep;
63 static char myname[] = "MPI_REGISTER_DATAREP";
64
65 ROMIO_THREAD_CS_ENTER();
66
67
68
69
70 if (datarep == NULL ||
71 strlen(datarep) < 1 ||
72 strlen(datarep) > MPI_MAX_DATAREP_STRING)
73 {
74 error_code = MPIO_Err_create_code(MPI_SUCCESS,
75 MPIR_ERR_RECOVERABLE,
76 myname, __LINE__,
77 MPI_ERR_ARG,
78 "**datarepname", 0);
79 error_code = MPIO_Err_return_file(MPI_FILE_NULL, error_code);
80 goto fn_exit;
81 }
82
83
84 MPIR_MPIOInit(&error_code);
85 if (error_code != MPI_SUCCESS) goto fn_exit;
86
87
88
89 for (adio_datarep = ADIOI_Datarep_head; adio_datarep; adio_datarep = adio_datarep->next) {
90 if (!strncmp(datarep, adio_datarep->name, MPI_MAX_DATAREP_STRING)) {
91 error_code = MPIO_Err_create_code(MPI_SUCCESS,
92 MPIR_ERR_RECOVERABLE,
93 myname, __LINE__,
94 MPI_ERR_DUP_DATAREP,
95 "**datarepused",
96 "**datarepused %s",
97 datarep);
98 error_code = MPIO_Err_return_file(MPI_FILE_NULL, error_code);
99 goto fn_exit;
100 }
101 }
102
103
104
105 if ( (read_conversion_fn != NULL) || (write_conversion_fn != NULL) )
106 {
107 error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
108 myname, __LINE__,
109 MPI_ERR_CONVERSION,
110 "**drconvnotsupported", 0);
111
112 error_code = MPIO_Err_return_file(MPI_FILE_NULL, error_code);
113 goto fn_exit;
114 }
115
116
117 if (dtype_file_extent_fn == NULL)
118 {
119 error_code = MPIO_Err_create_code(MPI_SUCCESS,
120 MPIR_ERR_RECOVERABLE,
121 myname, __LINE__,
122 MPI_ERR_ARG,
123 "**datarepextent", 0);
124 error_code = MPIO_Err_return_file(MPI_FILE_NULL, error_code);
125 goto fn_exit;
126 }
127
128
129 adio_datarep = ADIOI_Malloc(sizeof(ADIOI_Datarep));
130 adio_datarep->name = ADIOI_Strdup(datarep);
131 adio_datarep->state = extra_state;
132 adio_datarep->read_conv_fn = read_conversion_fn;
133 adio_datarep->write_conv_fn = write_conversion_fn;
134 adio_datarep->extent_fn = dtype_file_extent_fn;
135 adio_datarep->next = ADIOI_Datarep_head;
136
137 ADIOI_Datarep_head = adio_datarep;
138
139 error_code = MPI_SUCCESS;
140
141 fn_exit:
142 ROMIO_THREAD_CS_EXIT();
143
144 return error_code;
145 }