1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
2 /*
3 * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
4 * University Research and Technology
5 * Corporation. All rights reserved.
6 * Copyright (c) 2004-2017 The University of Tennessee and The University
7 * of Tennessee Research Foundation. All rights
8 * reserved.
9 * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
10 * University of Stuttgart. All rights reserved.
11 * Copyright (c) 2004-2005 The Regents of the University of California.
12 * All rights reserved.
13 * Copyright (c) 2006 University of Houston. All rights reserved.
14 * Copyright (c) 2013 Cisco Systems, Inc. All rights reserved.
15 * Copyright (c) 2013 Los Alamos National Security, LLC. All rights
16 * reserved.
17 * Copyright (c) 2015 Research Organization for Information Science
18 * and Technology (RIST). All rights reserved.
19 * $COPYRIGHT$
20 *
21 * Additional copyrights may follow
22 *
23 * $HEADER$
24 */
25
26 #include "ompi_config.h"
27
28 #include <stdio.h>
29 #include <string.h>
30
31 #include "mpi.h"
32
33 #include "ompi/errhandler/errcode.h"
34 #include "ompi/constants.h"
35
36 /* Table holding all error codes */
37 opal_pointer_array_t ompi_mpi_errcodes = {{0}};
38 int ompi_mpi_errcode_lastused=0;
39 int ompi_mpi_errcode_lastpredefined=0;
40
41 static ompi_mpi_errcode_t ompi_success;
42 static ompi_mpi_errcode_t ompi_err_buffer;
43 static ompi_mpi_errcode_t ompi_err_count;
44 static ompi_mpi_errcode_t ompi_err_type;
45 static ompi_mpi_errcode_t ompi_err_tag;
46 static ompi_mpi_errcode_t ompi_err_comm;
47 static ompi_mpi_errcode_t ompi_err_rank;
48 static ompi_mpi_errcode_t ompi_err_request;
49 static ompi_mpi_errcode_t ompi_err_root;
50 static ompi_mpi_errcode_t ompi_err_group;
51 static ompi_mpi_errcode_t ompi_err_op;
52 static ompi_mpi_errcode_t ompi_err_topology;
53 static ompi_mpi_errcode_t ompi_err_dims;
54 static ompi_mpi_errcode_t ompi_err_arg;
55 ompi_mpi_errcode_t ompi_err_unknown = {{0}};
56 static ompi_mpi_errcode_t ompi_err_truncate;
57 static ompi_mpi_errcode_t ompi_err_other;
58 static ompi_mpi_errcode_t ompi_err_intern;
59 static ompi_mpi_errcode_t ompi_err_in_status;
60 static ompi_mpi_errcode_t ompi_err_pending;
61
62 static ompi_mpi_errcode_t ompi_err_access;
63 static ompi_mpi_errcode_t ompi_err_amode;
64 static ompi_mpi_errcode_t ompi_err_assert;
65 static ompi_mpi_errcode_t ompi_err_bad_file;
66 static ompi_mpi_errcode_t ompi_err_base;
67 static ompi_mpi_errcode_t ompi_err_conversion;
68 static ompi_mpi_errcode_t ompi_err_disp;
69 static ompi_mpi_errcode_t ompi_err_dup_datarep;
70 static ompi_mpi_errcode_t ompi_err_file_exists;
71 static ompi_mpi_errcode_t ompi_err_file_in_use;
72 static ompi_mpi_errcode_t ompi_err_file;
73 static ompi_mpi_errcode_t ompi_err_info_key;
74 static ompi_mpi_errcode_t ompi_err_info_nokey;
75 static ompi_mpi_errcode_t ompi_err_info_value;
76 static ompi_mpi_errcode_t ompi_err_info;
77 static ompi_mpi_errcode_t ompi_err_io;
78 static ompi_mpi_errcode_t ompi_err_keyval;
79 static ompi_mpi_errcode_t ompi_err_locktype;
80 static ompi_mpi_errcode_t ompi_err_name;
81 static ompi_mpi_errcode_t ompi_err_no_mem;
82 static ompi_mpi_errcode_t ompi_err_not_same;
83 static ompi_mpi_errcode_t ompi_err_no_space;
84 static ompi_mpi_errcode_t ompi_err_no_such_file;
85 static ompi_mpi_errcode_t ompi_err_port;
86 static ompi_mpi_errcode_t ompi_err_quota;
87 static ompi_mpi_errcode_t ompi_err_read_only;
88 static ompi_mpi_errcode_t ompi_err_rma_conflict;
89 static ompi_mpi_errcode_t ompi_err_rma_sync;
90 static ompi_mpi_errcode_t ompi_err_service;
91 static ompi_mpi_errcode_t ompi_err_size;
92 static ompi_mpi_errcode_t ompi_err_spawn;
93 static ompi_mpi_errcode_t ompi_err_unsupported_datarep;
94 static ompi_mpi_errcode_t ompi_err_unsupported_operation;
95 static ompi_mpi_errcode_t ompi_err_win;
96 static ompi_mpi_errcode_t ompi_t_err_memory;
97 static ompi_mpi_errcode_t ompi_t_err_not_initialized;
98 static ompi_mpi_errcode_t ompi_t_err_cannot_init;
99 static ompi_mpi_errcode_t ompi_t_err_invalid_index;
100 static ompi_mpi_errcode_t ompi_t_err_invalid_item;
101 static ompi_mpi_errcode_t ompi_t_err_invalid_handle;
102 static ompi_mpi_errcode_t ompi_t_err_out_of_handles;
103 static ompi_mpi_errcode_t ompi_t_err_out_of_sessions;
104 static ompi_mpi_errcode_t ompi_t_err_invalid_session;
105 static ompi_mpi_errcode_t ompi_t_err_cvar_set_not_now;
106 static ompi_mpi_errcode_t ompi_t_err_cvar_set_never;
107 static ompi_mpi_errcode_t ompi_t_err_pvar_no_startstop;
108 static ompi_mpi_errcode_t ompi_t_err_pvar_no_write;
109 static ompi_mpi_errcode_t ompi_t_err_pvar_no_atomic;
110 static ompi_mpi_errcode_t ompi_err_rma_range;
111 static ompi_mpi_errcode_t ompi_err_rma_attach;
112 static ompi_mpi_errcode_t ompi_err_rma_flavor;
113 static ompi_mpi_errcode_t ompi_err_rma_shared;
114 static ompi_mpi_errcode_t ompi_t_err_invalid;
115 static ompi_mpi_errcode_t ompi_t_err_invalid_name;
116
117 static void ompi_mpi_errcode_construct(ompi_mpi_errcode_t* errcode);
118 static void ompi_mpi_errcode_destruct(ompi_mpi_errcode_t* errcode);
119
120 OBJ_CLASS_INSTANCE(ompi_mpi_errcode_t,opal_object_t,ompi_mpi_errcode_construct, ompi_mpi_errcode_destruct);
121
122 #define CONSTRUCT_ERRCODE(VAR, ERRCODE, TXT ) \
123 do { \
124 OBJ_CONSTRUCT(&(VAR), ompi_mpi_errcode_t); \
125 (VAR).code = (ERRCODE); \
126 (VAR).cls = (ERRCODE); \
127 strncpy((VAR).errstring, (TXT), MPI_MAX_ERROR_STRING); \
128 opal_pointer_array_set_item(&ompi_mpi_errcodes, (ERRCODE), &(VAR)); \
129 } while (0)
130
ompi_mpi_errcode_init(void)131 int ompi_mpi_errcode_init (void)
132 {
133 /* Initialize the pointer array, which will hold the references to
134 the error objects */
135 OBJ_CONSTRUCT(&ompi_mpi_errcodes, opal_pointer_array_t);
136 if( OPAL_SUCCESS != opal_pointer_array_init(&ompi_mpi_errcodes, 64,
137 OMPI_FORTRAN_HANDLE_MAX, 32) ) {
138 return OMPI_ERROR;
139 }
140
141 /* Initialize now each predefined error code and register
142 it in the pointer-array. */
143 CONSTRUCT_ERRCODE( ompi_success, MPI_SUCCESS, "MPI_SUCCESS: no errors" );
144 CONSTRUCT_ERRCODE( ompi_err_buffer, MPI_ERR_BUFFER, "MPI_ERR_BUFFER: invalid buffer pointer");
145 CONSTRUCT_ERRCODE( ompi_err_count, MPI_ERR_COUNT, "MPI_ERR_COUNT: invalid count argument" );
146 CONSTRUCT_ERRCODE( ompi_err_type, MPI_ERR_TYPE, "MPI_ERR_TYPE: invalid datatype" );
147 CONSTRUCT_ERRCODE( ompi_err_tag, MPI_ERR_TAG, "MPI_ERR_TAG: invalid tag" );
148 CONSTRUCT_ERRCODE( ompi_err_comm, MPI_ERR_COMM, "MPI_ERR_COMM: invalid communicator" );
149 CONSTRUCT_ERRCODE( ompi_err_rank, MPI_ERR_RANK, "MPI_ERR_RANK: invalid rank" );
150 CONSTRUCT_ERRCODE( ompi_err_request, MPI_ERR_REQUEST, "MPI_ERR_REQUEST: invalid request" );
151 CONSTRUCT_ERRCODE( ompi_err_root, MPI_ERR_ROOT, "MPI_ERR_ROOT: invalid root" );
152 CONSTRUCT_ERRCODE( ompi_err_group, MPI_ERR_GROUP, "MPI_ERR_GROUP: invalid group" );
153 CONSTRUCT_ERRCODE( ompi_err_op, MPI_ERR_OP, "MPI_ERR_OP: invalid reduce operation" );
154 CONSTRUCT_ERRCODE( ompi_err_topology, MPI_ERR_TOPOLOGY, "MPI_ERR_TOPOLOGY: invalid communicator topology" );
155 CONSTRUCT_ERRCODE( ompi_err_dims, MPI_ERR_DIMS, "MPI_ERR_DIMS: invalid topology dimension" );
156 CONSTRUCT_ERRCODE( ompi_err_arg, MPI_ERR_ARG, "MPI_ERR_ARG: invalid argument of some other kind" );
157 CONSTRUCT_ERRCODE( ompi_err_unknown, MPI_ERR_UNKNOWN, "MPI_ERR_UNKNOWN: unknown error" );
158 CONSTRUCT_ERRCODE( ompi_err_truncate, MPI_ERR_TRUNCATE, "MPI_ERR_TRUNCATE: message truncated" );
159 CONSTRUCT_ERRCODE( ompi_err_other, MPI_ERR_OTHER, "MPI_ERR_OTHER: known error not in list" );
160 CONSTRUCT_ERRCODE( ompi_err_intern, MPI_ERR_INTERN, "MPI_ERR_INTERN: internal error" );
161 CONSTRUCT_ERRCODE( ompi_err_in_status, MPI_ERR_IN_STATUS, "MPI_ERR_IN_STATUS: error code in status" );
162 CONSTRUCT_ERRCODE( ompi_err_pending, MPI_ERR_PENDING, "MPI_ERR_PENDING: pending request" );
163 CONSTRUCT_ERRCODE( ompi_err_access, MPI_ERR_ACCESS, "MPI_ERR_ACCESS: invalid access mode" );
164 CONSTRUCT_ERRCODE( ompi_err_amode, MPI_ERR_AMODE, "MPI_ERR_AMODE: invalid amode argument" );
165 CONSTRUCT_ERRCODE( ompi_err_assert, MPI_ERR_ASSERT, "MPI_ERR_ASSERT: invalid assert argument" );
166 CONSTRUCT_ERRCODE( ompi_err_bad_file, MPI_ERR_BAD_FILE, "MPI_ERR_BAD_FILE: bad file" );
167 CONSTRUCT_ERRCODE( ompi_err_base, MPI_ERR_BASE, "MPI_ERR_BASE: invalid base" );
168 CONSTRUCT_ERRCODE( ompi_err_conversion, MPI_ERR_CONVERSION, "MPI_ERR_CONVERSION: error in data conversion" );
169 CONSTRUCT_ERRCODE( ompi_err_disp, MPI_ERR_DISP, "MPI_ERR_DISP: invalid displacement" );
170 CONSTRUCT_ERRCODE( ompi_err_dup_datarep, MPI_ERR_DUP_DATAREP, "MPI_ERR_DUP_DATAREP: error duplicating data representation" );
171 CONSTRUCT_ERRCODE( ompi_err_file_exists, MPI_ERR_FILE_EXISTS, "MPI_ERR_FILE_EXISTS: file exists alreay" );
172 CONSTRUCT_ERRCODE( ompi_err_file_in_use, MPI_ERR_FILE_IN_USE, "MPI_ERR_FILE_IN_USE: file already in use" );
173 CONSTRUCT_ERRCODE( ompi_err_file, MPI_ERR_FILE, "MPI_ERR_FILE: invalid file" );
174 CONSTRUCT_ERRCODE( ompi_err_info_key, MPI_ERR_INFO_KEY, "MPI_ERR_INFO_KEY: invalid key argument for info object" );
175 CONSTRUCT_ERRCODE( ompi_err_info_nokey, MPI_ERR_INFO_NOKEY, "MPI_ERR_INFO_NOKEY: unknown key for given info object" );
176 CONSTRUCT_ERRCODE( ompi_err_info_value, MPI_ERR_INFO_VALUE, "MPI_ERR_INFO_VALUE: invalid value argument for info object" );
177 CONSTRUCT_ERRCODE( ompi_err_info, MPI_ERR_INFO, "MPI_ERR_INFO: invalid info object" );
178 CONSTRUCT_ERRCODE( ompi_err_io, MPI_ERR_IO, "MPI_ERR_IO: input/output error" );
179 CONSTRUCT_ERRCODE( ompi_err_keyval, MPI_ERR_KEYVAL, "MPI_ERR_KEYVAL: invalid key value" );
180 CONSTRUCT_ERRCODE( ompi_err_locktype, MPI_ERR_LOCKTYPE, "MPI_ERR_LOCKTYPE: invalid lock" );
181 CONSTRUCT_ERRCODE( ompi_err_name, MPI_ERR_NAME, "MPI_ERR_NAME: invalid name argument" );
182 CONSTRUCT_ERRCODE( ompi_err_no_mem, MPI_ERR_NO_MEM, "MPI_ERR_NO_MEM: out of memory" );
183 CONSTRUCT_ERRCODE( ompi_err_not_same, MPI_ERR_NOT_SAME, "MPI_ERR_NOT_SAME: objects are not identical");
184 CONSTRUCT_ERRCODE( ompi_err_no_space, MPI_ERR_NO_SPACE, "MPI_ERR_NO_SPACE: no space left on device" );
185 CONSTRUCT_ERRCODE( ompi_err_no_such_file, MPI_ERR_NO_SUCH_FILE, "MPI_ERR_NO_SUCH_FILE: no such file or directory" );
186 CONSTRUCT_ERRCODE( ompi_err_port, MPI_ERR_PORT, "MPI_ERR_PORT: invalid port" );
187 CONSTRUCT_ERRCODE( ompi_err_quota, MPI_ERR_QUOTA, "MPI_ERR_QUOTA: out of quota" );
188 CONSTRUCT_ERRCODE( ompi_err_read_only, MPI_ERR_READ_ONLY, "MPI_ERR_READ_ONLY: file is read only" );
189 CONSTRUCT_ERRCODE( ompi_err_rma_conflict, MPI_ERR_RMA_CONFLICT, "MPI_ERR_RMA_CONFLICT: rma conflict during operation" );
190 CONSTRUCT_ERRCODE( ompi_err_rma_sync, MPI_ERR_RMA_SYNC, "MPI_ERR_RMA_SYNC: error executing rma sync" );
191 CONSTRUCT_ERRCODE( ompi_err_service, MPI_ERR_SERVICE, "MPI_ERR_SERVICE: unknown service name" );
192 CONSTRUCT_ERRCODE( ompi_err_size, MPI_ERR_SIZE, "MPI_ERR_SIZE: invalid size" );
193 CONSTRUCT_ERRCODE( ompi_err_spawn, MPI_ERR_SPAWN, "MPI_ERR_SPAWN: could not spawn processes" );
194 CONSTRUCT_ERRCODE( ompi_err_unsupported_datarep, MPI_ERR_UNSUPPORTED_DATAREP, "MPI_ERR_UNSUPPORTED_DATAREP: data representation not supported" );
195 CONSTRUCT_ERRCODE( ompi_err_unsupported_operation, MPI_ERR_UNSUPPORTED_OPERATION, "MPI_ERR_UNSUPPORTED_OPERATION: operation not supported" );
196 CONSTRUCT_ERRCODE( ompi_err_win, MPI_ERR_WIN, "MPI_ERR_WIN: invalid window" );
197 CONSTRUCT_ERRCODE( ompi_t_err_memory, MPI_T_ERR_MEMORY, "MPI_T_ERR_MEMORY: out of memory" );
198 CONSTRUCT_ERRCODE( ompi_t_err_not_initialized, MPI_T_ERR_NOT_INITIALIZED, "MPI_T_ERR_NOT_INITIALIZED: interface not initialized" );
199 CONSTRUCT_ERRCODE( ompi_t_err_cannot_init, MPI_T_ERR_CANNOT_INIT, "MPI_T_ERR_CANNOT_INIT: interface not in the state to be initialized" );
200 CONSTRUCT_ERRCODE( ompi_t_err_invalid_index, MPI_T_ERR_INVALID_INDEX, "MPI_T_ERR_INVALID_INDEX: invalid index" );
201 CONSTRUCT_ERRCODE( ompi_t_err_invalid_item, MPI_T_ERR_INVALID_ITEM, "MPI_T_ERR_INVALID_ITEM: the item index queried is out of range" );
202 CONSTRUCT_ERRCODE( ompi_t_err_invalid_handle, MPI_T_ERR_INVALID_HANDLE, "MPI_T_ERR_INVALID_HANDLE: the handle is invalid" );
203 CONSTRUCT_ERRCODE( ompi_t_err_out_of_handles, MPI_T_ERR_OUT_OF_HANDLES, "MPI_T_ERR_OUT_OF_HANDLES: no more handles available" );
204 CONSTRUCT_ERRCODE( ompi_t_err_out_of_sessions, MPI_T_ERR_OUT_OF_SESSIONS, "MPI_T_ERR_OUT_OF_SESSIONS: no more sessions available" );
205 CONSTRUCT_ERRCODE( ompi_t_err_invalid_session, MPI_T_ERR_INVALID_SESSION, "MPI_T_ERR_INVALID_SESSION: session argument is not a valid session" );
206 CONSTRUCT_ERRCODE( ompi_t_err_cvar_set_not_now, MPI_T_ERR_CVAR_SET_NOT_NOW, "MPI_T_ERR_CVAR_SET_NOT_NOW: variable cannot be set at this moment" );
207 CONSTRUCT_ERRCODE( ompi_t_err_cvar_set_never, MPI_T_ERR_CVAR_SET_NEVER, "MPI_T_ERR_CVAR_SET_NEVER: variable cannot be set until end of execution" );
208 CONSTRUCT_ERRCODE( ompi_t_err_pvar_no_startstop, MPI_T_ERR_PVAR_NO_STARTSTOP, "MPI_T_ERR_PVAR_NO_STARTSTOP: variable cannot be started or stopped" );
209 CONSTRUCT_ERRCODE( ompi_t_err_pvar_no_write, MPI_T_ERR_PVAR_NO_WRITE, "MPI_T_ERR_PVAR_NO_WRITE: variable cannot be written or reset" );
210 CONSTRUCT_ERRCODE( ompi_t_err_pvar_no_atomic, MPI_T_ERR_PVAR_NO_ATOMIC, "MPI_T_ERR_PVAR_NO_ATOMIC: variable cannot be read and written atomically" );
211 CONSTRUCT_ERRCODE( ompi_err_rma_range, MPI_ERR_RMA_RANGE, "MPI_ERR_RMA_RANGE: invalid RMA address range" );
212 CONSTRUCT_ERRCODE( ompi_err_rma_attach, MPI_ERR_RMA_ATTACH, "MPI_ERR_RMA_ATTACH: Could not attach RMA segment" );
213 CONSTRUCT_ERRCODE( ompi_err_rma_flavor, MPI_ERR_RMA_FLAVOR, "MPI_ERR_RMA_FLAVOR: Invalid type of window" );
214 CONSTRUCT_ERRCODE( ompi_err_rma_shared, MPI_ERR_RMA_SHARED, "MPI_ERR_RMA_SHARED: Memory cannot be shared" );
215 CONSTRUCT_ERRCODE( ompi_t_err_invalid, MPI_T_ERR_INVALID, "MPI_T_ERR_INVALID: Invalid use of the interface or bad parameter value(s)" );
216 CONSTRUCT_ERRCODE( ompi_t_err_invalid_name, MPI_T_ERR_INVALID_NAME, "MPI_T_ERR_INVALID_NAME: The variable or category name is invalid" );
217
218 /* Per MPI-3 p353:27-32, MPI_LASTUSEDCODE must be >=
219 MPI_ERR_LASTCODE. So just start it as == MPI_ERR_LASTCODE. */
220 ompi_mpi_errcode_lastused = MPI_ERR_LASTCODE;
221 ompi_mpi_errcode_lastpredefined = MPI_ERR_LASTCODE;
222 return OMPI_SUCCESS;
223 }
224
ompi_mpi_errcode_finalize(void)225 int ompi_mpi_errcode_finalize(void)
226 {
227 int i;
228 ompi_mpi_errcode_t *errc;
229
230 for (i=ompi_mpi_errcode_lastpredefined+1; i<=ompi_mpi_errcode_lastused; i++) {
231 /*
232 * there are some user defined error-codes, which
233 * we have to free.
234 */
235 errc = (ompi_mpi_errcode_t *)opal_pointer_array_get_item(&ompi_mpi_errcodes, i);
236 OBJ_RELEASE (errc);
237 }
238
239 OBJ_DESTRUCT(&ompi_success);
240 OBJ_DESTRUCT(&ompi_err_buffer);
241 OBJ_DESTRUCT(&ompi_err_count);
242 OBJ_DESTRUCT(&ompi_err_type);
243 OBJ_DESTRUCT(&ompi_err_tag);
244 OBJ_DESTRUCT(&ompi_err_comm);
245 OBJ_DESTRUCT(&ompi_err_rank);
246 OBJ_DESTRUCT(&ompi_err_request);
247 OBJ_DESTRUCT(&ompi_err_root);
248 OBJ_DESTRUCT(&ompi_err_group);
249 OBJ_DESTRUCT(&ompi_err_op);
250 OBJ_DESTRUCT(&ompi_err_topology);
251 OBJ_DESTRUCT(&ompi_err_dims);
252 OBJ_DESTRUCT(&ompi_err_arg);
253 OBJ_DESTRUCT(&ompi_err_unknown);
254 OBJ_DESTRUCT(&ompi_err_truncate);
255 OBJ_DESTRUCT(&ompi_err_other);
256 OBJ_DESTRUCT(&ompi_err_intern);
257 OBJ_DESTRUCT(&ompi_err_in_status);
258 OBJ_DESTRUCT(&ompi_err_pending);
259 OBJ_DESTRUCT(&ompi_err_access);
260 OBJ_DESTRUCT(&ompi_err_amode);
261 OBJ_DESTRUCT(&ompi_err_assert);
262 OBJ_DESTRUCT(&ompi_err_bad_file);
263 OBJ_DESTRUCT(&ompi_err_base);
264 OBJ_DESTRUCT(&ompi_err_conversion);
265 OBJ_DESTRUCT(&ompi_err_disp);
266 OBJ_DESTRUCT(&ompi_err_dup_datarep);
267 OBJ_DESTRUCT(&ompi_err_file_exists);
268 OBJ_DESTRUCT(&ompi_err_file_in_use);
269 OBJ_DESTRUCT(&ompi_err_file);
270 OBJ_DESTRUCT(&ompi_err_info_key);
271 OBJ_DESTRUCT(&ompi_err_info_nokey);
272 OBJ_DESTRUCT(&ompi_err_info_value);
273 OBJ_DESTRUCT(&ompi_err_info);
274 OBJ_DESTRUCT(&ompi_err_io);
275 OBJ_DESTRUCT(&ompi_err_keyval);
276 OBJ_DESTRUCT(&ompi_err_locktype);
277 OBJ_DESTRUCT(&ompi_err_name);
278 OBJ_DESTRUCT(&ompi_err_no_mem);
279 OBJ_DESTRUCT(&ompi_err_not_same);
280 OBJ_DESTRUCT(&ompi_err_no_space);
281 OBJ_DESTRUCT(&ompi_err_no_such_file);
282 OBJ_DESTRUCT(&ompi_err_port);
283 OBJ_DESTRUCT(&ompi_err_quota);
284 OBJ_DESTRUCT(&ompi_err_read_only);
285 OBJ_DESTRUCT(&ompi_err_rma_conflict);
286 OBJ_DESTRUCT(&ompi_err_rma_sync);
287 OBJ_DESTRUCT(&ompi_err_service);
288 OBJ_DESTRUCT(&ompi_err_size);
289 OBJ_DESTRUCT(&ompi_err_spawn);
290 OBJ_DESTRUCT(&ompi_err_unsupported_datarep);
291 OBJ_DESTRUCT(&ompi_err_unsupported_operation);
292 OBJ_DESTRUCT(&ompi_err_win);
293 OBJ_DESTRUCT(&ompi_t_err_memory);
294 OBJ_DESTRUCT(&ompi_t_err_not_initialized);
295 OBJ_DESTRUCT(&ompi_t_err_cannot_init);
296 OBJ_DESTRUCT(&ompi_t_err_invalid_index);
297 OBJ_DESTRUCT(&ompi_t_err_invalid_item);
298 OBJ_DESTRUCT(&ompi_t_err_invalid_handle);
299 OBJ_DESTRUCT(&ompi_t_err_out_of_handles);
300 OBJ_DESTRUCT(&ompi_t_err_out_of_sessions);
301 OBJ_DESTRUCT(&ompi_t_err_invalid_session);
302 OBJ_DESTRUCT(&ompi_t_err_cvar_set_not_now);
303 OBJ_DESTRUCT(&ompi_t_err_cvar_set_never);
304 OBJ_DESTRUCT(&ompi_t_err_pvar_no_startstop);
305 OBJ_DESTRUCT(&ompi_t_err_pvar_no_write);
306 OBJ_DESTRUCT(&ompi_t_err_pvar_no_atomic);
307 OBJ_DESTRUCT(&ompi_err_rma_range);
308 OBJ_DESTRUCT(&ompi_err_rma_attach);
309 OBJ_DESTRUCT(&ompi_err_rma_flavor);
310 OBJ_DESTRUCT(&ompi_err_rma_shared);
311 OBJ_DESTRUCT(&ompi_t_err_invalid);
312 OBJ_DESTRUCT(&ompi_t_err_invalid_name);
313
314 OBJ_DESTRUCT(&ompi_mpi_errcodes);
315 return OMPI_SUCCESS;
316 }
317
ompi_mpi_errcode_add(int errclass)318 int ompi_mpi_errcode_add(int errclass )
319 {
320 ompi_mpi_errcode_t *newerrcode;
321
322 newerrcode = OBJ_NEW(ompi_mpi_errcode_t);
323 newerrcode->code = (ompi_mpi_errcode_lastused+1);
324 newerrcode->cls = errclass;
325 opal_pointer_array_set_item(&ompi_mpi_errcodes, newerrcode->code, newerrcode);
326
327 ompi_mpi_errcode_lastused++;
328 return newerrcode->code;
329 }
330
ompi_mpi_errclass_add(void)331 int ompi_mpi_errclass_add(void)
332 {
333 ompi_mpi_errcode_t *newerrcode;
334
335 newerrcode = OBJ_NEW(ompi_mpi_errcode_t);
336 newerrcode->cls = ( ompi_mpi_errcode_lastused+1);
337 opal_pointer_array_set_item(&ompi_mpi_errcodes, newerrcode->cls, newerrcode);
338
339 ompi_mpi_errcode_lastused++;
340 return newerrcode->cls;
341 }
342
ompi_mpi_errnum_add_string(int errnum,const char * errstring,int len)343 int ompi_mpi_errnum_add_string(int errnum, const char *errstring, int len)
344 {
345 ompi_mpi_errcode_t *errcodep;
346
347 errcodep = (ompi_mpi_errcode_t *)opal_pointer_array_get_item(&ompi_mpi_errcodes, errnum);
348 if ( NULL == errcodep ) {
349 return OMPI_ERROR;
350 }
351
352 if ( MPI_MAX_ERROR_STRING > len ) {
353 len = MPI_MAX_ERROR_STRING;
354 }
355
356 strncpy ( errcodep->errstring, errstring, len );
357 return OMPI_SUCCESS;
358 }
359
ompi_mpi_errcode_construct(ompi_mpi_errcode_t * errcode)360 static void ompi_mpi_errcode_construct(ompi_mpi_errcode_t *errcode)
361 {
362 errcode->code = MPI_UNDEFINED;
363 errcode->cls = MPI_UNDEFINED;
364 memset ( errcode->errstring, 0, MPI_MAX_ERROR_STRING);
365 return;
366 }
367
ompi_mpi_errcode_destruct(ompi_mpi_errcode_t * errcode)368 static void ompi_mpi_errcode_destruct(ompi_mpi_errcode_t *errcode)
369 {
370 if (MPI_UNDEFINED != errcode->code) {
371 opal_pointer_array_set_item(&ompi_mpi_errcodes, errcode->code, NULL);
372 } else if (MPI_UNDEFINED != errcode->cls) {
373 opal_pointer_array_set_item(&ompi_mpi_errcodes, errcode->cls, NULL);
374 }
375 }
376