summaryrefslogtreecommitdiffstats
path: root/src/H5Eprivate.h
blob: 228ebc05111cd68a4ec88db00e834e9afc5c24ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Copyright by the Board of Trustees of the University of Illinois.         *
 * All rights reserved.                                                      *
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
 * the files COPYING and Copyright.html.  COPYING can be found at the root   *
 * of the source code distribution tree; Copyright.html can be found at the  *
 * root level of an installed copy of the electronic HDF5 document set and   *
 * is linked from the top-level documents page.  It can also be found at     *
 * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html.  If you do not have     *
 * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

/*
 *  Header file for error values, etc.
 */
#ifndef _H5Eprivate_H
#define _H5Eprivate_H

#include "H5Epublic.h"

/* Private headers needed by this file */
#include "H5private.h"

#define H5E_NSLOTS	32	/*number of slots in an error stack	     */

#ifndef NEW_ERR

#define H5E_RESERVED_ATOMS  0
#ifdef TMP
/* HDF5 error class */
#define    H5E_CLS_NAME         "HDF5"
#define    H5E_CLS_LIB_NAME     "HDF5"
#define    H5E_CLS_LIB_VERS     ""              /* How to find out version number? */

/* HDF5 error class: major errors */
#define    H5E_NONE_MAJOR_MSG	        "No error"
#define    H5E_ARGS_MSG		"Function arguments"
#define    H5E_RESOURCE_MSG	        "Resource unavailable"
#define    H5E_INTERNAL_MSG	        "Internal HDF5 error"
#define    H5E_FILE_MSG		"File interface"
#define    H5E_IO_MSG		        "Low-level I/O layer"
#define    H5E_FUNC_MSG		"Function entry/exit"
#define    H5E_ATOM_MSG		"Atom layer"
#define    H5E_CACHE_MSG		"Meta data cache layer"
#define    H5E_BTREE_MSG		"B-tree layer"
#define    H5E_SYM_MSG		        "Symbol table layer"
#define    H5E_HEAP_MSG		"Heap layer"
#define    H5E_OHDR_MSG		"Object header layer"
#define    H5E_DATATYPE_MSG	        "Datatype interface"
#define    H5E_DATASPACE_MSG	        "Dataspace interface"
#define    H5E_DATASET_MSG	        "Dataset interface"
#define    H5E_STORAGE_MSG	        "Data storage layer"
#define    H5E_PLIST_MSG		"Property list interface"
#define    H5E_ATTR_MSG 		"Attribute layer"
#define    H5E_PLINE_MSG		"Data filters layer"
#define    H5E_EFL_MSG 		"External file list"
#define    H5E_REFERENCE_MSG	        "References layer"
#define    H5E_VFL_MSG		        "Virtual File Layer"
#define    H5E_TBBT_MSG		"Threaded, Balanced, Binary Trees"
#define    H5E_FPHDF5_MSG	        "Flexible Parallel HDF5"
#define    H5E_TST_MSG		        "Ternary Search Trees"
#define    H5E_RS_MSG		        "Reference Counted Strings"

/* HDF5 error class: minor errors */
#define    H5E_NONE_MINOR 	"No error"

    /* Argument errors */
#define    H5E_UNINITIALIZED_MSG "Information is uninitialized"
#define    H5E_UNSUPPORTED_MSG 	"Feature is unsupported"
#define    H5E_BADTYPE_MSG 	"Inappropriate type"
#define    H5E_BADRANGE_MSG 	"Out of range"
#define    H5E_BADVALUE_MSG 	"Bad value"

    /* Resource errors */
#define    H5E_NOSPACE_MSG 	"No space available for allocation"
#define    H5E_CANTCOPY_MSG 	"Unable to copy object"
#define    H5E_CANTFREE_MSG 	"Unable to free object"
#define    H5E_ALREADYEXISTS_MSG "Object already exists"
#define    H5E_CANTLOCK_MSG 	"Unable to lock object"
#define    H5E_CANTUNLOCK_MSG 	"Unable to unlock object"
#define    H5E_CANTGC_MSG 	"Unable to garbage collect"

    /* File accessability errors */
#define    H5E_FILEEXISTS_MSG 	"File already exists"
#define    H5E_FILEOPEN_MSG 	"File already open"
#define    H5E_CANTCREATE_MSG 	"Unable to create file"
#define    H5E_CANTOPENFILE_MSG 	"Unable to open file"
#define    H5E_CANTCLOSEFILE_MSG 	"Unable to close file"
#define    H5E_NOTHDF5_MSG 	"Not an HDF5 file"
#define    H5E_BADFILE_MSG 	"Bad file ID accessed"
#define    H5E_TRUNCATED_MSG 	"File has been truncated"
#define    H5E_MOUNT_MSG		"File mount error"

    /* Generic low-level file I/O errors */
#define    H5E_SEEKERROR_MSG	"Seek failed"
#define    H5E_READERROR_MSG 	"Read failed"
#define    H5E_WRITEERROR_MSG 	"Write failed"
#define    H5E_CLOSEERROR_MSG 	"Close failed"
#define    H5E_OVERFLOW_MSG 	"Address overflowed"
#define    H5E_FCNTL_MSG         "File control (fcntl) failed"

    /* Function entry/exit interface errors */
#define    H5E_CANTINIT_MSG 	"Unable to initialize object"
#define    H5E_ALREADYINIT_MSG 	"Object already initialized"
#define    H5E_CANTRELEASE_MSG 	"Unable to release object"

    /* Object atom related errors */
#define    H5E_BADATOM_MSG 	"Unable to find atom information (already closed?)"
#define    H5E_BADGROUP_MSG 	"Unable to find ID group information"
#define    H5E_CANTREGISTER_MSG 	"Unable to register new atom"
#define    H5E_CANTINC_MSG      	"Unable to increment reference count"
#define    H5E_CANTDEC_MSG      	"Unable to decrement reference count"
#define    H5E_NOIDS_MSG      	"Out of IDs for group"

    /* Cache related errors */
#define    H5E_CANTFLUSH_MSG 	"Unable to flush data from cache"
#define    H5E_CANTLOAD_MSG 	"Unable to load meta data into cache"
#define    H5E_PROTECT_MSG 	"Protected meta data error"
#define    H5E_NOTCACHED_MSG 	"Meta data not currently cached"

    /* B-tree related errors */
#define    H5E_NOTFOUND_MSG 	"Object not found"
#define    H5E_EXISTS_MSG 	"Object already exists"
#define    H5E_CANTENCODE_MSG 	"Unable to encode value"
#define    H5E_CANTDECODE_MSG 	"Unable to decode value"
#define    H5E_CANTSPLIT_MSG 	"Unable to split node"
#define    H5E_CANTINSERT_MSG 	"Unable to insert object"
#define    H5E_CANTLIST_MSG 	"Unable to list node"

    /* Object header related errors */
#define    H5E_LINKCOUNT_MSG 	"Bad object header link count"
#define    H5E_VERSION_MSG 	"Wrong version number"
#define    H5E_ALIGNMENT_MSG 	"Alignment error"
#define    H5E_BADMESG_MSG 	"Unrecognized message"
#define    H5E_CANTDELETE_MSG 	"Can't delete message"

    /* Group related errors */
#define    H5E_CANTOPENOBJ_MSG 	"Can't open object"
#define    H5E_COMPLEN_MSG 	"Name component is too long"
#define    H5E_CWG_MSG 		"Problem with current working group"
#define    H5E_LINK_MSG 		"Link count failure"
#define    H5E_SLINK_MSG		"Symbolic link error"

    /* Datatype conversion errors */
#define    H5E_CANTCONVERT_MSG	"Can't convert datatypes"
#define    H5E_BADSIZE_MSG	"Bad size for object"

    /* Dataspace errors */
#define    H5E_CANTCLIP_MSG	"Can't clip hyperslab region"
#define    H5E_CANTCOUNT_MSG	"Can't count elements"
#define    H5E_CANTSELECT_MSG    "Can't select hyperslab"
#define    H5E_CANTNEXT_MSG      "Can't move to next iterator location"
#define    H5E_BADSELECT_MSG     "Invalid selection"
#define    H5E_CANTCOMPARE_MSG   "Can't compare objects"

    /* Property list errors */
#define    H5E_CANTGET_MSG	"Can't get value"
#define    H5E_CANTSET_MSG	"Can't set value"
#define    H5E_DUPCLASS_MSG	"Duplicate class name in parent class"

    /* Parallel MPI errors */
#define    H5E_MPI_MSG		"Some MPI function failed"
#define    H5E_MPIERRSTR_MSG     "MPI Error String"

    /* FPHDF5 errors */
#define    H5E_CANTMAKETREE_MSG  "Can't create a binary tree node"
#define    H5E_CANTRECV_MSG      "Can't receive messages from processes"
#define    H5E_CANTSENDMDATA_MSG "Can't send metadata message"
#define    H5E_CANTCHANGE_MSG    "Can't register change with server"
#define    H5E_CANTALLOC_MSG     "Can't allocate from file"

    /* I/O pipeline errors */
#define    H5E_NOFILTER_MSG      "Requested filter is not available"
#define    H5E_CALLBACK_MSG      "Callback failed"
#define    H5E_CANAPPLY_MSG      "Error from filter \"can apply\" callback"
#define    H5E_SETLOCAL_MSG      "Error from filter \"set local\" callback"
#endif /* TMP */
#endif /* NEW_ERR */

/*
 * HERROR macro, used to facilitate error reporting between a FUNC_ENTER()
 * and a FUNC_LEAVE() within a function body.  The arguments are the major
 * error number, the minor error number, and a description of the error.
 */
#define HERROR(maj, min, str) H5E_push(maj, min, FUNC, __FILE__, __LINE__, str)

/*
 * HCOMMON_ERROR macro, used by HDONE_ERROR and HGOTO_ERROR
 * (Shouldn't need to be used outside this header file)
 */
#define HCOMMON_ERROR(maj, min, str)  				              \
   HERROR (maj, min, str);						      \
   if (H5_IS_API(FUNC) && H5E_auto_g)  					      \
       (void)((H5E_auto_g)(H5E_auto_data_g))

/*
 * HDONE_ERROR macro, used to facilitate error reporting between a
 * FUNC_ENTER() and a FUNC_LEAVE() within a function body, but _AFTER_ the
 * "done:" label.  The arguments are
 * the major error number, the minor error number, a return value, and a
 * description of the error.
 */
#define HDONE_ERROR(maj, min, ret_val, str) {				      \
   HCOMMON_ERROR (maj, min, str);					      \
   ret_value = ret_val;                                                       \
}

/*
 * HGOTO_ERROR macro, used to facilitate error reporting between a
 * FUNC_ENTER() and a FUNC_LEAVE() within a function body.  The arguments are
 * the major error number, the minor error number, the return value, and an
 * error string.  The return value is assigned to a variable `ret_value' and
 * control branches to the `done' label.
 */
#define HGOTO_ERROR(maj, min, ret_val, str) {				      \
   HCOMMON_ERROR (maj, min, str);					      \
   HGOTO_DONE (ret_val)						              \
}

/*
 * HGOTO_DONE macro, used to facilitate normal return between a FUNC_ENTER()
 * and a FUNC_LEAVE() within a function body. The argument is the return
 * value which is assigned to the `ret_value' variable.	 Control branches to
 * the `done' label.
 */
#define HGOTO_DONE(ret_val) {ret_value = ret_val; goto done;}

/*
 * The list of error messages in the system is kept as an array of
 * error_code/message pairs, one for major error numbers and another for
 * minor error numbers.
 */
typedef struct H5E_major_mesg_t {
    H5E_major_t error_code;
    const char	*str;
} H5E_major_mesg_t;

typedef struct H5E_minor_mesg_t {
    H5E_minor_t error_code;
    const char	*str;
} H5E_minor_mesg_t;

/* An error stack */
typedef struct H5E_t {
    int	nused;			/*num slots currently used in stack  */
    H5E_error_t slot[H5E_NSLOTS];	/*array of error records	     */
} H5E_t;

H5_DLLVAR const hbool_t H5E_clearable_g;/*safe to call H5E_clear() on enter?*/
H5_DLLVAR herr_t (*H5E_auto_g)(void *client_data);
H5_DLLVAR void *H5E_auto_data_g;

H5_DLL hid_t  H5E_register_class(const char *cls_name, const char *lib_name, 
                                const char *version);
H5_DLL hid_t  H5E_unregister_class(H5E_cls_t *cls);
H5_DLL herr_t H5E_push (H5E_major_t maj_num, H5E_minor_t min_num,
			 const char *func_name, const char *file_name,
			 unsigned line, const char *desc);
H5_DLL herr_t H5E_clear (void);
H5_DLL herr_t H5E_walk (H5E_direction_t dir, H5E_walk_t func,
			 void *client_data);

#ifdef H5_HAVE_PARALLEL
/*
 * MPI error handling macros.
 */

extern	char	H5E_mpi_error_str[MPI_MAX_ERROR_STRING];
extern	int	H5E_mpi_error_str_len;

#define	HMPI_ERROR(mpierr){						      \
    MPI_Error_string(mpierr, H5E_mpi_error_str, &H5E_mpi_error_str_len);      \
    HERROR(H5E_INTERNAL, H5E_MPIERRSTR, H5E_mpi_error_str);                   \
}
#define	HMPI_DONE_ERROR(retcode, str, mpierr){				      \
    HMPI_ERROR(mpierr);							      \
    HDONE_ERROR(H5E_INTERNAL, H5E_MPI, retcode, str);			      \
}
#define	HMPI_GOTO_ERROR(retcode, str, mpierr){				      \
    HMPI_ERROR(mpierr);							      \
    HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, retcode, str);			      \
}
#endif

#endif