xref: /freebsd/sys/contrib/ncsw/inc/error_ext.h (revision 640235e2c2ba32947f7c59d168437ffa1280f1e6)
1 /* Copyright (c) 2008-2011 Freescale Semiconductor, Inc.
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *     * Redistributions of source code must retain the above copyright
7  *       notice, this list of conditions and the following disclaimer.
8  *     * Redistributions in binary form must reproduce the above copyright
9  *       notice, this list of conditions and the following disclaimer in the
10  *       documentation and/or other materials provided with the distribution.
11  *     * Neither the name of Freescale Semiconductor nor the
12  *       names of its contributors may be used to endorse or promote products
13  *       derived from this software without specific prior written permission.
14  *
15  *
16  * ALTERNATIVELY, this software may be distributed under the terms of the
17  * GNU General Public License ("GPL") as published by the Free Software
18  * Foundation, either version 2 of that License or (at your option) any
19  * later version.
20  *
21  * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
22  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24  * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
25  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 /**
34  @File          error_ext.h
35 
36  @Description   Error definitions.
37 *//***************************************************************************/
38 
39 #ifndef __ERROR_EXT_H
40 #define __ERROR_EXT_H
41 
42 #include "std_ext.h"
43 #include "xx_ext.h"
44 #include "core_ext.h"
45 
46 /**************************************************************************//**
47  @Group         gen_id  General Drivers Utilities
48 
49  @Description   External routines.
50 
51  @{
52 *//***************************************************************************/
53 
54 /**************************************************************************//**
55  @Group         gen_error_id  Errors, Events and Debug
56 
57  @Description   External routines.
58 
59  @{
60 *//***************************************************************************/
61 
62 /******************************************************************************
63 The scheme below provides the bits description for error codes:
64 
65  0    1    2    3    4    5    6    7    8    9    10   11   12   13   14   15
66 |       Reserved (should be zero)      |              Module ID               |
67 
68  16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31
69 |                               Error Type                                    |
70 ******************************************************************************/
71 
72 #define ERROR_CODE(_err)            ((((uint32_t)_err) & 0x0000FFFF) | __ERR_MODULE__)
73 
74 #define GET_ERROR_TYPE(_errcode)    ((_errcode) & 0x0000FFFF)
75                                 /**< Extract module code from error code (#t_Error) */
76 
77 #define GET_ERROR_MODULE(_errcode)  ((_errcode) & 0x00FF0000)
78                                 /**< Extract error type (#e_ErrorType) from
79                                      error code (#t_Error) */
80 
81 
82 /**************************************************************************//**
83  @Description    Error Type Enumeration
84 *//***************************************************************************/
85 typedef enum e_ErrorType    /*   Comments / Associated Message Strings                      */
86 {                           /* ------------------------------------------------------------ */
87     E_OK = 0                /*   Never use "RETURN_ERROR" with E_OK; Use "return E_OK;"     */
88 
89     /* Invalid Function Calls */
90     ,E_INVALID_STATE        /**< The operation is not allowed in current module state.      */
91                             /*   String: none.                                              */
92     ,E_INVALID_OPERATION    /**< The operation/command is invalid (unrecognized).           */
93                             /*   String: none.                                              */
94     ,E_NOT_SUPPORTED        /**< The function is not supported or not implemented.          */
95                             /*   String: none.                                              */
96     ,E_NO_DEVICE            /**< The associated device is not initialized.                  */
97                             /*   String: none.                                              */
98 
99     /* Invalid Parameters */
100     ,E_INVALID_HANDLE       /**< Invalid handle of module or object.                        */
101                             /*   String: none, unless the function takes in more than one
102                                  handle (in this case add the handle description)           */
103     ,E_INVALID_ID           /**< Invalid module ID (usually enumeration or index).          */
104                             /*   String: none, unless the function takes in more than one
105                                  ID (in this case add the ID description)                   */
106     ,E_NULL_POINTER         /**< Unexpected NULL pointer.                                   */
107                             /*   String: pointer description.                               */
108     ,E_INVALID_VALUE        /**< Invalid value.                                             */
109                             /*   Use for non-enumeration parameters, and
110                                  only when other error types are not suitable.
111                                  String: parameter description + "(should be <attribute>)",
112                                  e.g: "Maximum Rx buffer length (should be divisible by 8)",
113                                       "Channel number (should be even)".                    */
114     ,E_INVALID_SELECTION    /**< Invalid selection or mode.                                 */
115                             /*   Use for enumeration values, only when other error types
116                                  are not suitable.
117                                  String: parameter description.                             */
118     ,E_INVALID_COMM_MODE    /**< Invalid communication mode.                                */
119                             /*   String: none, unless the function takes in more than one
120                                  communication mode indications (in this case add
121                                  parameter description).                                    */
122     ,E_INVALID_BYTE_ORDER   /**< Invalid byte order.                                        */
123                             /*   String: none, unless the function takes in more than one
124                                  byte order indications (in this case add parameter
125                                  description).                                              */
126     ,E_INVALID_MEMORY_TYPE  /**< Invalid memory type.                                       */
127                             /*   String: none, unless the function takes in more than one
128                                  memory types (in this case add memory description,
129                                  e.g: "Data memory", "Buffer descriptors memory").          */
130     ,E_INVALID_INTR_QUEUE   /**< Invalid interrupt queue.                                   */
131                             /*   String: none, unless the function takes in more than one
132                                  interrupt queues (in this case add queue description,
133                                  e.g: "Rx interrupt queue", "Tx interrupt queue").          */
134     ,E_INVALID_PRIORITY     /**< Invalid priority.                                          */
135                             /*   String: none, unless the function takes in more than one
136                                  priority (in this case add priority description).          */
137     ,E_INVALID_CLOCK        /**< Invalid clock.                                             */
138                             /*   String: none, unless the function takes in more than one
139                                  clocks (in this case add clock description,
140                                  e.g: "Rx clock", "Tx clock").                              */
141     ,E_INVALID_RATE         /**< Invalid rate value.                                        */
142                             /*   String: none, unless the function takes in more than one
143                                  rate values (in this case add rate description).           */
144     ,E_INVALID_ADDRESS      /**< Invalid address.                                           */
145                             /*   String: description of the specific violation.             */
146     ,E_INVALID_BUS          /**< Invalid bus type.                                          */
147                             /*   String: none, unless the function takes in more than one
148                                  bus parameters (in this case add bus description).         */
149     ,E_BUS_CONFLICT         /**< Bus (or memory) type conflicts with another setting.       */
150                             /*   String: description of the conflicting buses/memories.     */
151     ,E_CONFLICT             /**< Some setting conflicts with another setting.               */
152                             /*   String: description of the conflicting settings.           */
153     ,E_NOT_ALIGNED          /**< Non-aligned address.                                       */
154                             /*   String: parameter description + "(should be %d-bytes aligned)",
155                                  e.g: "Rx data buffer (should be 32-bytes aligned)".        */
156     ,E_NOT_IN_RANGE         /**< Parameter value is out of range.                           */
157                             /*   Don't use this error for enumeration parameters.
158                                  String: parameter description + "(should be %d-%d)",
159                                  e.g: "Number of pad characters (should be 0-15)".          */
160 
161     /* Frame/Buffer Errors */
162     ,E_INVALID_FRAME        /**< Invalid frame object (NULL handle or missing buffers).     */
163                             /*   String: none.                                              */
164     ,E_EMPTY_FRAME          /**< Frame object is empty (has no buffers).                    */
165                             /*   String: none.                                              */
166     ,E_EMPTY_BUFFER         /**< Buffer object is empty (no data, or zero data length).     */
167                             /*   String: none.                                              */
168 
169     /* Resource Errors */
170     ,E_NO_MEMORY            /**< External memory allocation failed.                         */
171                             /*   String: description of item for which allocation failed.   */
172     ,E_NOT_FOUND            /**< Requested resource or item was not found.                  */
173                             /*   Use only when the resource/item is uniquely identified.
174                                  String: none, unless the operation is not the main goal
175                                  of the function (in this case add item description).       */
176     ,E_NOT_AVAILABLE        /**< Resource is unavailable.                                   */
177                             /*   String: none, unless the operation is not the main goal
178                                  of the function (in this case add resource description).   */
179     ,E_ALREADY_EXISTS       /**< Requested resource or item already exists.                 */
180                             /*   Use when resource duplication or sharing are not allowed.
181                                  String: none, unless the operation is not the main goal
182                                  of the function (in this case add item description).       */
183     ,E_FULL                 /**< Resource is full.                                          */
184                             /*   String: none, unless the operation is not the main goal
185                                  of the function (in this case add resource description).   */
186     ,E_EMPTY                /**< Resource is empty.                                         */
187                             /*   String: none, unless the operation is not the main goal
188                                  of the function (in this case add resource description).   */
189     ,E_BUSY                 /**< Resource or module is busy.                                */
190                             /*   String: none, unless the operation is not the main goal
191                                  of the function (in this case add resource description).   */
192     ,E_ALREADY_FREE         /**< Specified resource or item is already free or deleted.     */
193                             /*   String: none, unless the operation is not the main goal
194                                  of the function (in this case add item description).       */
195 
196     /* Read/Write Access Errors */
197     ,E_READ_FAILED          /**< Read access failed on memory/device.                       */
198                             /*   String: none, or device name.                              */
199     ,E_WRITE_FAILED         /**< Write access failed on memory/device.                      */
200                             /*   String: none, or device name.                              */
201 
202     /* Send/Receive Failures */
203     ,E_SEND_FAILED          /**< Send operation failed on device.                           */
204                             /*   String: none, or device name.                              */
205     ,E_RECEIVE_FAILED       /**< Receive operation failed on device.                        */
206                             /*   String: none, or device name.                              */
207 
208     /* Operation time-out */
209     ,E_TIMEOUT              /**< The operation timed out.                                   */
210                             /*   String: none.                                              */
211 
212     ,E_DUMMY_LAST           /* NEVER USED */
213 
214 } e_ErrorType;
215 
216 
217 /**************************************************************************//**
218  @Description    Event Type Enumeration
219 *//***************************************************************************/
220 typedef enum e_Event        /*   Comments / Associated Flags and Message Strings            */
221 {                           /* ------------------------------------------------------------ */
222     EV_NO_EVENT = 0         /**< No event; Never used.                                      */
223 
224     ,EV_RX_DISCARD          /**< Received packet discarded (by the driver, and only for
225                                  complete packets);
226                                  Flags: error flags in case of error, zero otherwise.       */
227                             /*   String: reason for discard, e.g: "Error in frame",
228                                  "Disordered frame", "Incomplete frame", "No frame object". */
229     ,EV_RX_ERROR            /**< Receive error (by hardware/firmware);
230                                  Flags: usually status flags from the buffer descriptor.    */
231                             /*   String: none.                                              */
232     ,EV_TX_ERROR            /**< Transmit error (by hardware/firmware);
233                                  Flags: usually status flags from the buffer descriptor.    */
234                             /*   String: none.                                              */
235     ,EV_NO_BUFFERS          /**< System ran out of buffer objects;
236                                  Flags: zero.                                               */
237                             /*   String: none.                                              */
238     ,EV_NO_MB_FRAMES        /**< System ran out of multi-buffer frame objects;
239                                  Flags: zero.                                               */
240                             /*   String: none.                                              */
241     ,EV_NO_SB_FRAMES        /**< System ran out of single-buffer frame objects;
242                                  Flags: zero.                                               */
243                             /*   String: none.                                              */
244     ,EV_TX_QUEUE_FULL       /**< Transmit queue is full;
245                                  Flags: zero.                                               */
246                             /*   String: none.                                              */
247     ,EV_RX_QUEUE_FULL       /**< Receive queue is full;
248                                  Flags: zero.                                               */
249                             /*   String: none.                                              */
250     ,EV_INTR_QUEUE_FULL     /**< Interrupt queue overflow;
251                                  Flags: zero.                                               */
252                             /*   String: none.                                              */
253     ,EV_NO_DATA_BUFFER      /**< Data buffer allocation (from higher layer) failed;
254                                  Flags: zero.                                               */
255                             /*   String: none.                                              */
256     ,EV_OBJ_POOL_EMPTY      /**< Objects pool is empty;
257                                  Flags: zero.                                               */
258                             /*   String: object description (name).                         */
259     ,EV_BUS_ERROR           /**< Illegal access on bus;
260                                  Flags: the address (if available) or bus identifier        */
261                             /*   String: bus/address/module description.                    */
262     ,EV_PTP_TXTS_QUEUE_FULL /**< PTP Tx timestamps queue is full;
263                                  Flags: zero.                                               */
264                             /*   String: none.                                              */
265     ,EV_PTP_RXTS_QUEUE_FULL /**< PTP Rx timestamps queue is full;
266                                  Flags: zero.                                               */
267                             /*   String: none.                                              */
268     ,EV_DUMMY_LAST
269 
270 } e_Event;
271 
272 
273 /**************************************************************************//**
274  @Collection    Debug Levels for Errors and Events
275 
276                 The level description refers to errors only.
277                 For events, classification is done by the user.
278 
279                 The TRACE, INFO and WARNING levels are allowed only when using
280                 the DBG macro, and are not allowed when using the error macros
281                 (RETURN_ERROR or REPORT_ERROR).
282  @{
283 *//***************************************************************************/
284 #define REPORT_LEVEL_CRITICAL   1       /**< Crasher: Incorrect flow, NULL pointers/handles. */
285 #define REPORT_LEVEL_MAJOR      2       /**< Cannot proceed: Invalid operation, parameters or
286                                              configuration. */
287 #define REPORT_LEVEL_MINOR      3       /**< Recoverable problem: a repeating call with the same
288                                              parameters may be successful. */
289 #define REPORT_LEVEL_WARNING    4       /**< Something is not exactly right, yet it is not an error. */
290 #define REPORT_LEVEL_INFO       5       /**< Messages which may be of interest to user/programmer. */
291 #define REPORT_LEVEL_TRACE      6       /**< Program flow messages. */
292 
293 #define EVENT_DISABLED          0xFF    /**< Disabled event (not reported at all) */
294 
295 /* @} */
296 
297 
298 
299 #define NO_MSG      ("")
300 
301 #ifndef DEBUG_GLOBAL_LEVEL
302 #define DEBUG_GLOBAL_LEVEL  REPORT_LEVEL_WARNING
303 #endif /* DEBUG_GLOBAL_LEVEL */
304 
305 #ifndef ERROR_GLOBAL_LEVEL
306 #define ERROR_GLOBAL_LEVEL  DEBUG_GLOBAL_LEVEL
307 #endif /* ERROR_GLOBAL_LEVEL */
308 
309 #ifndef EVENT_GLOBAL_LEVEL
310 #define EVENT_GLOBAL_LEVEL  REPORT_LEVEL_MINOR
311 #endif /* EVENT_GLOBAL_LEVEL */
312 
313 #ifdef EVENT_LOCAL_LEVEL
314 #define EVENT_DYNAMIC_LEVEL EVENT_LOCAL_LEVEL
315 #else
316 #define EVENT_DYNAMIC_LEVEL EVENT_GLOBAL_LEVEL
317 #endif /* EVENT_LOCAL_LEVEL */
318 
319 
320 #ifndef DEBUG_DYNAMIC_LEVEL
321 #define DEBUG_USING_STATIC_LEVEL
322 
323 #ifdef DEBUG_STATIC_LEVEL
324 #define DEBUG_DYNAMIC_LEVEL DEBUG_STATIC_LEVEL
325 #else
326 #define DEBUG_DYNAMIC_LEVEL DEBUG_GLOBAL_LEVEL
327 #endif /* DEBUG_STATIC_LEVEL */
328 
329 #else /* DEBUG_DYNAMIC_LEVEL */
330 #ifdef DEBUG_STATIC_LEVEL
331 #error "Please use either DEBUG_STATIC_LEVEL or DEBUG_DYNAMIC_LEVEL (not both)"
332 #else
333 int DEBUG_DYNAMIC_LEVEL = DEBUG_GLOBAL_LEVEL;
334 #endif /* DEBUG_STATIC_LEVEL */
335 #endif /* !DEBUG_DYNAMIC_LEVEL */
336 
337 
338 #ifndef ERROR_DYNAMIC_LEVEL
339 
340 #ifdef ERROR_STATIC_LEVEL
341 #define ERROR_DYNAMIC_LEVEL ERROR_STATIC_LEVEL
342 #else
343 #define ERROR_DYNAMIC_LEVEL ERROR_GLOBAL_LEVEL
344 #endif /* ERROR_STATIC_LEVEL */
345 
346 #else /* ERROR_DYNAMIC_LEVEL */
347 #ifdef ERROR_STATIC_LEVEL
348 #error "Please use either ERROR_STATIC_LEVEL or ERROR_DYNAMIC_LEVEL (not both)"
349 #else
350 int ERROR_DYNAMIC_LEVEL = ERROR_GLOBAL_LEVEL;
351 #endif /* ERROR_STATIC_LEVEL */
352 #endif /* !ERROR_DYNAMIC_LEVEL */
353 
354 #define PRINT_FORMAT        "[CPU%02d, %s:%d %s]"
355 #define PRINT_FMT_PARAMS    CORE_GetId(), __FILE__, __LINE__, __FUNCTION__
356 #define ERR_STRING(err)     #err
357 
358 #if (!(defined(DEBUG_ERRORS)) || (DEBUG_ERRORS == 0))
359 /* No debug/error/event messages at all */
360 #define DBG(_level, _vmsg)
361 
362 #define REPORT_ERROR(_level, _err, _vmsg)
363 
364 #define RETURN_ERROR(_level, _err, _vmsg) \
365         return ERROR_CODE(_err)
366 
367 #if (REPORT_EVENTS > 0)
368 
369 #define REPORT_EVENT(_ev, _appId, _flg, _vmsg) \
370     do { \
371         if (_ev##_LEVEL <= EVENT_DYNAMIC_LEVEL) { \
372             XX_EventById((uint32_t)(_ev), (t_Handle)(_appId), (uint16_t)(_flg), NO_MSG); \
373         } \
374     } while (0)
375 
376 #else
377 
378 #define REPORT_EVENT(_ev, _appId, _flg, _vmsg)
379 
380 #endif /* (REPORT_EVENTS > 0) */
381 
382 
383 #else /* DEBUG_ERRORS > 0 */
384 
385 extern const char *dbgLevelStrings[];
386 extern const char *errTypeStrings[];
387 extern const char *moduleStrings[];
388 #if (REPORT_EVENTS > 0)
389 extern const char *eventStrings[];
390 #endif /* (REPORT_EVENTS > 0) */
391 
392 
393 #if ((defined(DEBUG_USING_STATIC_LEVEL)) && (DEBUG_DYNAMIC_LEVEL < REPORT_LEVEL_WARNING))
394 /* No need for DBG macro - debug level is higher anyway */
395 #define DBG(_level, _vmsg)
396 #else
397 #define DBG(_level, _vmsg) \
398     do { \
399         if (REPORT_LEVEL_##_level <= DEBUG_DYNAMIC_LEVEL) { \
400             XX_Print("> %s (%s) " PRINT_FORMAT ": ", \
401                      dbgLevelStrings[REPORT_LEVEL_##_level - 1], \
402                      ERR_STRING(__ERR_MODULE__), \
403                      PRINT_FMT_PARAMS); \
404             XX_Print _vmsg; \
405             XX_Print("\r\n"); \
406         } \
407     } while (0)
408 #endif /* (defined(DEBUG_USING_STATIC_LEVEL) && (DEBUG_DYNAMIC_LEVEL < WARNING)) */
409 
410 
411 #define REPORT_ERROR(_level, _err, _vmsg) \
412     do { \
413         if (REPORT_LEVEL_##_level <= ERROR_DYNAMIC_LEVEL) { \
414             XX_Print("! %s %s Error " PRINT_FORMAT ": %s; ", \
415                      dbgLevelStrings[REPORT_LEVEL_##_level - 1], \
416                      ERR_STRING(__ERR_MODULE__), \
417                      PRINT_FMT_PARAMS, \
418                      errTypeStrings[(GET_ERROR_TYPE(_err) - E_OK - 1)]); \
419             XX_Print _vmsg; \
420             XX_Print("\r\n"); \
421         } \
422     } while (0)
423 
424 
425 #define RETURN_ERROR(_level, _err, _vmsg) \
426     do { \
427         REPORT_ERROR(_level, (_err), _vmsg); \
428         return ERROR_CODE(_err); \
429     } while (0)
430 
431 
432 #if (REPORT_EVENTS > 0)
433 
434 #define REPORT_EVENT(_ev, _appId, _flg, _vmsg) \
435     do { \
436         if (_ev##_LEVEL <= EVENT_DYNAMIC_LEVEL) { \
437             XX_Print("~ %s %s Event " PRINT_FORMAT ": %s (flags: 0x%04x); ", \
438                      dbgLevelStrings[_ev##_LEVEL - 1], \
439                      ERR_STRING(__ERR_MODULE__), \
440                      PRINT_FMT_PARAMS, \
441                      eventStrings[((_ev) - EV_NO_EVENT - 1)], \
442                      (uint16_t)(_flg)); \
443             XX_Print _vmsg; \
444             XX_Print("\r\n"); \
445             XX_EventById((uint32_t)(_ev), (t_Handle)(_appId), (uint16_t)(_flg), NO_MSG); \
446         } \
447     } while (0)
448 
449 #else /* not REPORT_EVENTS */
450 
451 #define REPORT_EVENT(_ev, _appId, _flg, _vmsg)
452 
453 #endif /* (REPORT_EVENTS > 0) */
454 
455 #endif /* (DEBUG_ERRORS > 0) */
456 
457 
458 /**************************************************************************//**
459  @Function      ASSERT_COND
460 
461  @Description   Assertion macro.
462 
463  @Param[in]     _cond - The condition being checked, in positive form;
464                         Failure of the condition triggers the assert.
465 *//***************************************************************************/
466 #ifdef DISABLE_ASSERTIONS
467 #define ASSERT_COND(_cond)
468 #else
469 #define ASSERT_COND(_cond) \
470     do { \
471         if (!(_cond)) { \
472             XX_Print("*** ASSERT_COND failed " PRINT_FORMAT "\r\n", \
473                     PRINT_FMT_PARAMS); \
474             XX_Exit(1); \
475         } \
476     } while (0)
477 #endif /* DISABLE_ASSERTIONS */
478 
479 
480 #ifdef DISABLE_INIT_PARAMETERS_CHECK
481 
482 #define CHECK_INIT_PARAMETERS(handle, f_check)
483 #define CHECK_INIT_PARAMETERS_RETURN_VALUE(handle, f_check, retval)
484 
485 #else
486 
487 #define CHECK_INIT_PARAMETERS(handle, f_check) \
488     do { \
489         t_Error err = f_check(handle); \
490         if (err != E_OK) { \
491             RETURN_ERROR(MAJOR, err, NO_MSG); \
492         } \
493     } while (0)
494 
495 #define CHECK_INIT_PARAMETERS_RETURN_VALUE(handle, f_check, retval) \
496     do { \
497         t_Error err = f_check(handle); \
498         if (err != E_OK) { \
499             REPORT_ERROR(MAJOR, err, NO_MSG); \
500             return (retval); \
501         } \
502     } while (0)
503 
504 #endif /* DISABLE_INIT_PARAMETERS_CHECK */
505 
506 #ifdef DISABLE_SANITY_CHECKS
507 
508 #define SANITY_CHECK_RETURN_ERROR(_cond, _err)
509 #define SANITY_CHECK_RETURN_VALUE(_cond, _err, retval)
510 #define SANITY_CHECK_RETURN(_cond, _err)
511 #define SANITY_CHECK_EXIT(_cond, _err)
512 
513 #else /* DISABLE_SANITY_CHECKS */
514 
515 #define SANITY_CHECK_RETURN_ERROR(_cond, _err) \
516     do { \
517         if (!(_cond)) { \
518             RETURN_ERROR(CRITICAL, (_err), NO_MSG); \
519         } \
520     } while (0)
521 
522 #define SANITY_CHECK_RETURN_VALUE(_cond, _err, retval) \
523     do { \
524         if (!(_cond)) { \
525             REPORT_ERROR(CRITICAL, (_err), NO_MSG); \
526             return (retval); \
527         } \
528     } while (0)
529 
530 #define SANITY_CHECK_RETURN(_cond, _err) \
531     do { \
532         if (!(_cond)) { \
533             REPORT_ERROR(CRITICAL, (_err), NO_MSG); \
534             return; \
535         } \
536     } while (0)
537 
538 #define SANITY_CHECK_EXIT(_cond, _err) \
539     do { \
540         if (!(_cond)) { \
541             REPORT_ERROR(CRITICAL, (_err), NO_MSG); \
542             XX_Exit(1); \
543         } \
544     } while (0)
545 
546 #endif /* DISABLE_SANITY_CHECKS */
547 
548 /** @} */ /* end of Debug/error Utils group */
549 
550 /** @} */ /* end of General Utils group */
551 
552 #endif /* __ERROR_EXT_H */
553 
554 
555