@ -485,6 +485,32 @@ long int ast_random(void);
*/
# define ast_random_double() (((double)ast_random()) / RAND_MAX)
/*!
* \ brief DEBUG_CHAOS returns failure randomly
*
* DEBUG_CHAOS_RETURN ( failure ) ; can be used to fake
* failure of functions such as memory allocation ,
* for the purposes of testing failure handling .
*/
# ifdef DEBUG_CHAOS
# ifndef DEBUG_CHAOS_ALLOC_CHANCE
# define DEBUG_CHAOS_ALLOC_CHANCE 100000
# endif
/* Could #define DEBUG_CHAOS_ENABLE ast_fully_booted */
# ifndef DEBUG_CHAOS_ENABLE
# define DEBUG_CHAOS_ENABLE 1
# endif
# define DEBUG_CHAOS_RETURN(CHANCE, FAILURE) \
do { \
if ( ( DEBUG_CHAOS_ENABLE ) & & ( ast_random ( ) % CHANCE = = 0 ) ) { \
return FAILURE ; \
} \
} while ( 0 )
# else
# define DEBUG_CHAOS_RETURN(c,f)
# endif
# ifndef __AST_DEBUG_MALLOC
# define ast_std_malloc malloc
# define ast_std_calloc calloc
@ -537,6 +563,8 @@ void * attribute_malloc _ast_malloc(size_t len, const char *file, int lineno, co
{
void * p ;
DEBUG_CHAOS_RETURN ( DEBUG_CHAOS_ALLOC_CHANCE , NULL ) ;
if ( ! ( p = malloc ( len ) ) ) {
MALLOC_FAILURE_MSG ;
}
@ -561,6 +589,8 @@ void * attribute_malloc _ast_calloc(size_t num, size_t len, const char *file, in
{
void * p ;
DEBUG_CHAOS_RETURN ( DEBUG_CHAOS_ALLOC_CHANCE , NULL ) ;
if ( ! ( p = calloc ( num , len ) ) ) {
MALLOC_FAILURE_MSG ;
}
@ -598,6 +628,8 @@ void * attribute_malloc _ast_realloc(void *p, size_t len, const char *file, int
{
void * newp ;
DEBUG_CHAOS_RETURN ( DEBUG_CHAOS_ALLOC_CHANCE , NULL ) ;
if ( ! ( newp = realloc ( p , len ) ) ) {
MALLOC_FAILURE_MSG ;
}
@ -626,6 +658,8 @@ char * attribute_malloc _ast_strdup(const char *str, const char *file, int linen
{
char * newstr = NULL ;
DEBUG_CHAOS_RETURN ( DEBUG_CHAOS_ALLOC_CHANCE , NULL ) ;
if ( str ) {
if ( ! ( newstr = strdup ( str ) ) ) {
MALLOC_FAILURE_MSG ;
@ -656,6 +690,8 @@ char * attribute_malloc _ast_strndup(const char *str, size_t len, const char *fi
{
char * newstr = NULL ;
DEBUG_CHAOS_RETURN ( DEBUG_CHAOS_ALLOC_CHANCE , NULL ) ;
if ( str ) {
if ( ! ( newstr = strndup ( str , len ) ) ) {
MALLOC_FAILURE_MSG ;
@ -697,6 +733,8 @@ int _ast_vasprintf(char **ret, const char *file, int lineno, const char *func, c
{
int res ;
DEBUG_CHAOS_RETURN ( DEBUG_CHAOS_ALLOC_CHANCE , - 1 ) ;
if ( ( res = vasprintf ( ret , fmt , ap ) ) = = - 1 ) {
MALLOC_FAILURE_MSG ;
}