LCOV - code coverage report
Current view: top level - vppinfra - error.h (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 4 5 80.0 %
Date: 2023-10-26 01:39:38 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2015 Cisco and/or its affiliates.
       3             :  * Licensed under the Apache License, Version 2.0 (the "License");
       4             :  * you may not use this file except in compliance with the License.
       5             :  * You may obtain a copy of the License at:
       6             :  *
       7             :  *     http://www.apache.org/licenses/LICENSE-2.0
       8             :  *
       9             :  * Unless required by applicable law or agreed to in writing, software
      10             :  * distributed under the License is distributed on an "AS IS" BASIS,
      11             :  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      12             :  * See the License for the specific language governing permissions and
      13             :  * limitations under the License.
      14             :  */
      15             : /*
      16             :   Copyright (c) 2001, 2002, 2003 Eliot Dresselhaus
      17             : 
      18             :   Permission is hereby granted, free of charge, to any person obtaining
      19             :   a copy of this software and associated documentation files (the
      20             :   "Software"), to deal in the Software without restriction, including
      21             :   without limitation the rights to use, copy, modify, merge, publish,
      22             :   distribute, sublicense, and/or sell copies of the Software, and to
      23             :   permit persons to whom the Software is furnished to do so, subject to
      24             :   the following conditions:
      25             : 
      26             :   The above copyright notice and this permission notice shall be
      27             :   included in all copies or substantial portions of the Software.
      28             : 
      29             :   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
      30             :   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
      31             :   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
      32             :   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
      33             :   LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
      34             :   OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
      35             :   WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
      36             : */
      37             : 
      38             : #ifndef included_error_h
      39             : #define included_error_h
      40             : 
      41             : #include <vppinfra/clib.h>        /* for CLIB_LINUX_KERNEL */
      42             : #include <vppinfra/error_bootstrap.h>
      43             : 
      44             : #ifdef CLIB_UNIX
      45             : #include <errno.h>
      46             : #endif
      47             : 
      48             : #ifdef CLIB_LINUX_KERNEL
      49             : #include <linux/errno.h>
      50             : #endif
      51             : 
      52             : #include <stdarg.h>
      53             : #include <vppinfra/vec.h>
      54             : 
      55             : /* Callback functions for error reporting. */
      56             : typedef void clib_error_handler_func_t (void *arg, u8 * msg, int msg_len);
      57             : void clib_error_register_handler (clib_error_handler_func_t func, void *arg);
      58             : 
      59             : #define clib_warning(format,args...) \
      60             :   _clib_error (CLIB_ERROR_WARNING, clib_error_function, __LINE__, format, ## args)
      61             : 
      62             : #define clib_error(format,args...) \
      63             :   _clib_error (CLIB_ERROR_FATAL, clib_error_function, __LINE__, format, ## args)
      64             : 
      65             : #define clib_unix_error(format,args...) \
      66             :   _clib_error (CLIB_ERROR_FATAL | CLIB_ERROR_ERRNO_VALID, clib_error_function, __LINE__, format, ## args)
      67             : 
      68             : #define clib_unix_warning(format,args...) \
      69             :   _clib_error (CLIB_ERROR_WARNING | CLIB_ERROR_ERRNO_VALID, clib_error_function, __LINE__, format, ## args)
      70             : 
      71             : /* For programming errors and assert. */
      72             : #define clib_panic(format,args...) \
      73             :   _clib_error (CLIB_ERROR_ABORT, (char *) clib_error_function, __LINE__, format, ## args)
      74             : 
      75             : #include <vppinfra/clib_error.h>
      76             : 
      77             : #define clib_error_get_code(err) ((err) ? (err)->code : 0)
      78             : #define clib_error_set_code(err, c)             \
      79             : do {                                            \
      80             :   if (err)                                      \
      81             :     (err)->code = (c);                               \
      82             : } while (0)
      83             : 
      84             : extern void *clib_error_free_vector (clib_error_t * errors);
      85             : 
      86             : #define clib_error_free(e) e = clib_error_free_vector(e)
      87             : 
      88             : extern clib_error_t *_clib_error_return (clib_error_t *errors, any code,
      89             :                                          uword flags, const char *where,
      90             :                                          const char *fmt, ...);
      91             : 
      92             : #define clib_error_return_code(e,code,flags,args...) \
      93             :   _clib_error_return((e),(code),(flags),(char *)clib_error_function,args)
      94             : 
      95             : #define clib_error_create(args...) \
      96             :   clib_error_return_code(0,0,0,args)
      97             : 
      98             : #define clib_error_return(e,args...) \
      99             :   clib_error_return_code(e,0,0,args)
     100             : 
     101             : #define clib_error_return_unix(e,args...) \
     102             :   clib_error_return_code(e,errno,CLIB_ERROR_ERRNO_VALID,args)
     103             : 
     104             : #define clib_error_return_fatal(e,args...) \
     105             :   clib_error_return_code(e,0,CLIB_ERROR_FATAL,args)
     106             : 
     107             : #define clib_error_return_unix_fatal(e,args...) \
     108             :   clib_error_return_code(e,errno,CLIB_ERROR_ERRNO_VALID|CLIB_ERROR_FATAL,args)
     109             : 
     110             : extern clib_error_t *_clib_error_report (clib_error_t * errors);
     111             : 
     112             : #define clib_error_report(e) do { (e) = _clib_error_report (e); } while (0)
     113             : 
     114             : u8 *format_clib_error (u8 * s, va_list * va);
     115             : 
     116             : always_inline word
     117         501 : unix_error_is_fatal (word error)
     118             : {
     119             : #ifdef CLIB_UNIX
     120         501 :   switch (error)
     121             :     {
     122         501 :     case EWOULDBLOCK:
     123             :     case EINTR:
     124         501 :       return 0;
     125             :     }
     126             : #endif
     127           0 :   return 1;
     128             : }
     129             : 
     130             : #define IF_ERROR_IS_FATAL_RETURN_ELSE_FREE(e)                   \
     131             : do {                                                            \
     132             :   if (e)                                                        \
     133             :     {                                                           \
     134             :       if (unix_error_is_fatal (clib_error_get_code (e)))        \
     135             :         return (e);                                             \
     136             :       else                                                      \
     137             :         clib_error_free (e);                                    \
     138             :     }                                                           \
     139             : } while (0)
     140             : 
     141             : #define ERROR_RETURN_IF(x)                              \
     142             : do {                                                    \
     143             :   clib_error_t * _error_return_if = (x);                \
     144             :   if (_error_return_if)                                 \
     145             :     return clib_error_return (_error_return_if, 0);     \
     146             : } while (0)
     147             : 
     148             : #define ERROR_ASSERT(truth)                     \
     149             : ({                                              \
     150             :   clib_error_t * _error_assert = 0;             \
     151             :   if (CLIB_DEBUG > 0 && ! (truth))           \
     152             :     {                                           \
     153             :       _error_assert = clib_error_return_fatal   \
     154             :         (0, "%s:%d (%s) assertion `%s' fails",        \
     155             :          __FILE__,                              \
     156             :          (uword) __LINE__,                      \
     157             :          clib_error_function,                   \
     158             :          # truth);                              \
     159             :     }                                           \
     160             :   _error_assert;                                \
     161             : })
     162             : 
     163             : /* Assert to remain even if CLIB_DEBUG is set to 0. */
     164             : #define CLIB_ERROR_ASSERT(truth)                \
     165             : ({                                              \
     166             :   clib_error_t * _error_assert = 0;             \
     167             :   if (! (truth))                                \
     168             :     {                                           \
     169             :       _error_assert =                           \
     170             :         clib_error_return_fatal                 \
     171             :         (0, "%s:%d (%s) assertion `%s' fails",        \
     172             :          __FILE__,                              \
     173             :          (uword) __LINE__,                      \
     174             :          clib_error_function,                   \
     175             :          # truth);                              \
     176             :     }                                           \
     177             :   _error_assert;                                \
     178             : })
     179             : 
     180             : /*
     181             :  * If we're running under Coverity, don't die on
     182             :  * failed static assertions.
     183             :  */
     184             : #ifdef __COVERITY__
     185             : #ifndef _Static_assert
     186             : #define _Static_assert(x,y)
     187             : #endif
     188             : #endif
     189             : 
     190             : #endif /* included_error_h */
     191             : 
     192             : /*
     193             :  * fd.io coding-style-patch-verification: ON
     194             :  *
     195             :  * Local Variables:
     196             :  * eval: (c-set-style "gnu")
     197             :  * End:
     198             :  */

Generated by: LCOV version 1.14