Coherent4.2.10/coh.386/lib/assert.c
/* $Header: $ */
#define _DDI_DKI 1
#define _SYSV4 1
/*
* This file contains the definition for the kernel assertion helper function
* __assert_fail (), and a manual page for ASSERT ().
*
* $Log: $
*/
/*
*-IMPORTS:
* <common/ccompat.h>
* __USE_PROTO__
* __ARGS ()
* <sys/cmn_err.h>
* CE_PANIC
* cmn_err ()
*/
#include <common/ccompat.h>
#include <sys/cmn_err.h>
#include <stddef.h>
#include <sys/debug.h>
/*
*-STATUS:
* DDI/DKI.
*
*-NAME:
* ASSERT () Verify assertion.
*
*-SYNOPSIS:
* #include <sys/debug.h>
*
* void ASSERT (int expression);
*
*-ARGUMENTS:
* expression Expression to be evaluated.
*
*-DESCRIPTION:
* ASSERT () is a debugging interface for verifying program invariants
* within code that is compiled with the DEBUG compilation option
* defined. "expression" is a boolean expression that the caller expects
* to evaluate to non-zero (that is, the caller is asserting that the
* expression has a non-zero value). If "expression" evaluates to non-
* zero, the ASSERT () call has no effect. If "expression" evaluates to
* zero, ASSERT () causes the system to panic with a message identifying
* the expression, the name of the source file containing the assertion,
* and the line number within the source file where the assertion is
* made.
*
* When the DEBUG compilation option is not defined, ASSERT () calls are
* not compiled into the code, and therefore have no effect.
*
*-RETURN VALUE:
* If "expression" evaluates to non-zero, ASSERT () returns no value. If
* "expression" evaluates to zero, ASSERT () panics the system.
*
*-LEVEL:
* Base or interrupt.
*
*-NOTES:
* Does not sleep.
*
* Driver-defined basic locks, read/write locks and sleep locks may be
* held across calls to this function.
*
*-SEE ALSO:
* cmn_err ()
*/
/*
*-STATUS:
* Internal helper for ASSERT ().
*
*-NAME:
* __assert_fail () Report an assertion failure.
*
*-ARGUMENTS:
* exp The text of the source code for the expression that ASSERT ()
* evaluated and found to be false.
*
*-DESCRIPTION:
* Like assert () in C programs, the ASSERT () macro within the kernel
* provides a simple debugging mechanism. It is good software engineering
* practice to check even those situations that "cannot happen", at least
* during the development phase(s) of a section of code. The assertion
* mechanisms provide a simple and inexpensive way of performing those
* checks that if they fail indicate some condition that indicates a
* bug in some code. Normally, the debugging statements are compiled to
* check the assertions, but at the developer's option all calls to the
* ASSERT () macro will instead expand to no code.
*
* When the ASSERT () macro detects that an assertion condition did not
* evaluate to a logically true value (which in C is anything non-zero)
* then this helper function is called to halt the kernel with an
* appropriate error message.
*
*-RETURNS:
* Does not return.
*
*-LEVEL:
* Base or Interrupt.
*
*-NOTES:
* This function calls cmn_err () to panic the kernel on the CPU where
* the fault was detected (and to print the assertion failure message).
*/
#if __USE_PROTO__
__NO_RETURN__ (__assert_fail) (__CONST__ char * exp)
#else
void
__assert_fail __ARGS ((exp))
__CONST__ char * exp;
#endif
{
cmn_err (CE_PANIC, "Assertion \"%s\" failed", exp);
}
/*
*-STATUS:
* Internal helper for ASSERT ().
*
*-NAME:
* __assert_fail2 () Verbose form of __assert_fail ()
*
*-ARGUMENTS:
* exp The text of the source code for the expression that ASSERT ()
* evaluated and found to be false.
*
* info Location information that aids in locating the source code
* which failed the assertion. There are various levels of
* detail that may be desired; see <common/xdebug.h> for more on
* selecting the contents of the __FILE_INFO__ macro.
*
* lineno Optional line number in the source file.
*
*-DESCRIPTION:
* Like assert () in C programs, the ASSERT () macro within the kernel
* provides a simple debugging mechanism. It is good software engineering
* practice to check even those situations that "cannot happen", at least
* during the development phase(s) of a section of code. The assertion
* mechanisms provide a simple and inexpensive way of performing those
* checks that if they fail indicate some condition that indicates a
* bug in some code. Normally, the debugging statements are compiled to
* check the assertions, but at the developer's option all calls to the
* ASSERT () macro will instead expand to no code.
*
* When the ASSERT () macro detects that an assertion condition did not
* evaluate to a logically true value (which in C is anything non-zero)
* then this helper function is called to halt the kernel with an
* appropriate error message.
*
*-RETURNS:
* Does not return.
*
*-LEVEL:
* Base or Interrupt.
*
*-NOTES:
* This function calls cmn_err () to panic the kernel on the CPU where
* the fault was detected (and to print the assertion failure message).
*/
#if __USE_PROTO__
__NO_RETURN__ (__assert_fail2) (__CONST__ char * exp, __CONST__ char *
info, int lineno)
#else
void
__assert_fail2 __ARGS ((exp, info, lineno))
__CONST__ char * exp;
__CONST__ char * info;
int lineno;
#endif
{
cmn_err (CE_PANIC,
lineno == 0 ? "Assertion \"%s\" failed in %s" :
"Assertion \"%s\" failed in %s at line %d",
exp, info, lineno);
}