forked from enlightenment/efl
Eina safety: Add internal function to log errors
The main reason is convenience for debugging when using GDB, this will give a simple breakpoint for all safety check failures. Also, this creates a more visible log domain (red).
This commit is contained in:
parent
1f75cfc3cf
commit
5ad9654fbc
|
@ -25,45 +25,33 @@
|
||||||
#include "eina_log.h"
|
#include "eina_log.h"
|
||||||
#include "eina_safety_checks.h"
|
#include "eina_safety_checks.h"
|
||||||
|
|
||||||
/*============================================================================*
|
EAPI Eina_Error EINA_ERROR_SAFETY_FAILED = 0;
|
||||||
* Local *
|
|
||||||
*============================================================================*/
|
|
||||||
|
|
||||||
/*============================================================================*
|
static int EINA_SAFETY_LOG_DOMAIN = 0;
|
||||||
* Global *
|
static int initcnt = 0;
|
||||||
*============================================================================*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Log entry-point called every time an eina safety check fails.
|
||||||
|
*
|
||||||
|
* One purpose of this dedicated function is to provide a convenient breakpoint
|
||||||
|
* for GDB debugging. Also, this gives it a dedicated log domain, rather than
|
||||||
|
* using the default one.
|
||||||
|
*
|
||||||
|
* @since 1.17
|
||||||
* @internal
|
* @internal
|
||||||
* @brief Shut down the safety checks module.
|
|
||||||
*
|
|
||||||
* @return #EINA_TRUE on success, #EINA_FALSE on failure.
|
|
||||||
*
|
|
||||||
* This function shuts down the error module set up by
|
|
||||||
* eina_safety_checks_init(). It is called by eina_shutdown().
|
|
||||||
*
|
|
||||||
* @see eina_shutdown()
|
|
||||||
*/
|
*/
|
||||||
Eina_Bool
|
Eina_Bool
|
||||||
eina_safety_checks_shutdown(void)
|
eina_safety_checks_shutdown(void)
|
||||||
{
|
{
|
||||||
|
if (!initcnt) return EINA_FALSE;
|
||||||
|
if (!(--initcnt))
|
||||||
|
{
|
||||||
|
eina_log_domain_unregister(EINA_SAFETY_LOG_DOMAIN);
|
||||||
|
EINA_SAFETY_LOG_DOMAIN = 0;
|
||||||
|
}
|
||||||
return EINA_TRUE;
|
return EINA_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*============================================================================*
|
|
||||||
* API *
|
|
||||||
*============================================================================*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @cond LOCAL
|
|
||||||
*/
|
|
||||||
|
|
||||||
EAPI Eina_Error EINA_ERROR_SAFETY_FAILED = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @endcond
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @internal
|
* @internal
|
||||||
* @brief Initialize the safety checks module.
|
* @brief Initialize the safety checks module.
|
||||||
|
@ -78,9 +66,24 @@ EAPI Eina_Error EINA_ERROR_SAFETY_FAILED = 0;
|
||||||
Eina_Bool
|
Eina_Bool
|
||||||
eina_safety_checks_init(void)
|
eina_safety_checks_init(void)
|
||||||
{
|
{
|
||||||
|
if (!(initcnt++))
|
||||||
|
{
|
||||||
|
EINA_SAFETY_LOG_DOMAIN = eina_log_domain_register("eina_safety", EINA_COLOR_RED);
|
||||||
|
}
|
||||||
return EINA_TRUE;
|
return EINA_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
EAPI void
|
||||||
* @}
|
_eina_safety_error(const char *file, const char *func, int line, const char *str)
|
||||||
*/
|
{
|
||||||
|
if (EINA_SAFETY_LOG_DOMAIN)
|
||||||
|
{
|
||||||
|
eina_log_print(EINA_SAFETY_LOG_DOMAIN, EINA_LOG_LEVEL_ERR,
|
||||||
|
file, func, line, "%s", str);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
eina_log_print(EINA_LOG_DOMAIN_DEFAULT, EINA_LOG_LEVEL_ERR,
|
||||||
|
file, func, line, "%s", str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -93,12 +93,29 @@ EAPI extern Eina_Error EINA_ERROR_SAFETY_FAILED;
|
||||||
|
|
||||||
#include "eina_log.h"
|
#include "eina_log.h"
|
||||||
|
|
||||||
|
# ifdef EFL_BETA_API_SUPPORT
|
||||||
|
/**
|
||||||
|
* Log entry-point called every time an eina safety check fails.
|
||||||
|
*
|
||||||
|
* One purpose of this dedicated function is to provide a convenient breakpoint
|
||||||
|
* for GDB debugging. Also, this gives it a dedicated log domain, rather than
|
||||||
|
* using the default one.
|
||||||
|
*
|
||||||
|
* @since 1.17
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
EAPI void _eina_safety_error(const char *file, const char *func, int line, const char *str);
|
||||||
|
# define EINA_SAFETY_ERROR(msg) _eina_safety_error(__FILE__, __FUNCTION__, __LINE__, msg)
|
||||||
|
# else
|
||||||
|
# define EINA_SAFETY_ERROR(msg) EINA_LOG_ERR("%s", msg)
|
||||||
|
# endif
|
||||||
|
|
||||||
#define EINA_SAFETY_ON_NULL_RETURN(exp) \
|
#define EINA_SAFETY_ON_NULL_RETURN(exp) \
|
||||||
do \
|
do \
|
||||||
{ \
|
{ \
|
||||||
if (EINA_UNLIKELY((exp) == NULL)) \
|
if (EINA_UNLIKELY((exp) == NULL)) \
|
||||||
{ \
|
{ \
|
||||||
EINA_LOG_ERR("%s", "safety check failed: " # exp " == NULL"); \
|
EINA_SAFETY_ERROR("safety check failed: " # exp " == NULL"); \
|
||||||
return; \
|
return; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
|
@ -109,7 +126,7 @@ EAPI extern Eina_Error EINA_ERROR_SAFETY_FAILED;
|
||||||
{ \
|
{ \
|
||||||
if (EINA_UNLIKELY((exp) == NULL)) \
|
if (EINA_UNLIKELY((exp) == NULL)) \
|
||||||
{ \
|
{ \
|
||||||
EINA_LOG_ERR("%s", "safety check failed: " # exp " == NULL"); \
|
EINA_SAFETY_ERROR("safety check failed: " # exp " == NULL"); \
|
||||||
return (val); \
|
return (val); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
|
@ -120,7 +137,7 @@ EAPI extern Eina_Error EINA_ERROR_SAFETY_FAILED;
|
||||||
{ \
|
{ \
|
||||||
if (EINA_UNLIKELY((exp) == NULL)) \
|
if (EINA_UNLIKELY((exp) == NULL)) \
|
||||||
{ \
|
{ \
|
||||||
EINA_LOG_ERR("%s", "safety check failed: " # exp " == NULL"); \
|
EINA_SAFETY_ERROR("safety check failed: " # exp " == NULL"); \
|
||||||
goto label; \
|
goto label; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
|
@ -131,7 +148,7 @@ EAPI extern Eina_Error EINA_ERROR_SAFETY_FAILED;
|
||||||
{ \
|
{ \
|
||||||
if (EINA_UNLIKELY(exp)) \
|
if (EINA_UNLIKELY(exp)) \
|
||||||
{ \
|
{ \
|
||||||
EINA_LOG_ERR("%s", "safety check failed: " # exp " is true"); \
|
EINA_SAFETY_ERROR("safety check failed: " # exp " is true"); \
|
||||||
return; \
|
return; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
|
@ -142,7 +159,7 @@ EAPI extern Eina_Error EINA_ERROR_SAFETY_FAILED;
|
||||||
{ \
|
{ \
|
||||||
if (EINA_UNLIKELY(exp)) \
|
if (EINA_UNLIKELY(exp)) \
|
||||||
{ \
|
{ \
|
||||||
EINA_LOG_ERR("%s", "safety check failed: " # exp " is true"); \
|
EINA_SAFETY_ERROR("safety check failed: " # exp " is true"); \
|
||||||
return val; \
|
return val; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
|
@ -153,7 +170,7 @@ EAPI extern Eina_Error EINA_ERROR_SAFETY_FAILED;
|
||||||
{ \
|
{ \
|
||||||
if (EINA_UNLIKELY(exp)) \
|
if (EINA_UNLIKELY(exp)) \
|
||||||
{ \
|
{ \
|
||||||
EINA_LOG_ERR("%s", "safety check failed: " # exp " is true"); \
|
EINA_SAFETY_ERROR("safety check failed: " # exp " is true"); \
|
||||||
goto label; \
|
goto label; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
|
@ -164,7 +181,7 @@ EAPI extern Eina_Error EINA_ERROR_SAFETY_FAILED;
|
||||||
{ \
|
{ \
|
||||||
if (EINA_UNLIKELY(!(exp))) \
|
if (EINA_UNLIKELY(!(exp))) \
|
||||||
{ \
|
{ \
|
||||||
EINA_LOG_ERR("%s", "safety check failed: " # exp " is false"); \
|
EINA_SAFETY_ERROR("safety check failed: " # exp " is false"); \
|
||||||
return; \
|
return; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
|
@ -175,7 +192,7 @@ EAPI extern Eina_Error EINA_ERROR_SAFETY_FAILED;
|
||||||
{ \
|
{ \
|
||||||
if (EINA_UNLIKELY(!(exp))) \
|
if (EINA_UNLIKELY(!(exp))) \
|
||||||
{ \
|
{ \
|
||||||
EINA_LOG_ERR("%s", "safety check failed: " # exp " is false"); \
|
EINA_SAFETY_ERROR("safety check failed: " # exp " is false"); \
|
||||||
return val; \
|
return val; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
|
@ -186,7 +203,7 @@ EAPI extern Eina_Error EINA_ERROR_SAFETY_FAILED;
|
||||||
{ \
|
{ \
|
||||||
if (EINA_UNLIKELY(!(exp))) \
|
if (EINA_UNLIKELY(!(exp))) \
|
||||||
{ \
|
{ \
|
||||||
EINA_LOG_ERR("%s", "safety check failed: " # exp " is false"); \
|
EINA_SAFETY_ERROR("safety check failed: " # exp " is false"); \
|
||||||
goto label; \
|
goto label; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
|
|
Loading…
Reference in New Issue