blob: d41d0373cedde05d548f6f856ef53685107043df [file] [log] [blame] [edit]
/*
*
* Connection Manager
*
* Copyright (C) 2007-2013 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#ifndef __CONNMAN_LOG_H
#define __CONNMAN_LOG_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* SECTION:log
* @title: Logging premitives
* @short_description: Functions for logging error and debug information
*/
void connman_info(const char *format, ...)
__attribute__((format(printf, 1, 2)));
void connman_warn(const char *format, ...)
__attribute__((format(printf, 1, 2)));
void connman_error(const char *format, ...)
__attribute__((format(printf, 1, 2)));
void connman_debug(const char *format, ...)
__attribute__((format(printf, 1, 2)));
#define connman_warn_once(fmt, arg...) do { \
static bool printed; \
if (!printed) { \
connman_warn(fmt, ## arg); \
printed = true; \
} \
} while (0)
struct connman_debug_desc {
const char *name;
const char *file;
#define CONNMAN_DEBUG_FLAG_DEFAULT (0)
#define CONNMAN_DEBUG_FLAG_PRINT (1 << 0)
#define CONNMAN_DEBUG_FLAG_ALIAS (1 << 1)
unsigned int flags;
} __attribute__((aligned(8)));
#define CONNMAN_DEBUG_DEFINE(name) \
static struct connman_debug_desc __debug_alias_ ## name \
__attribute__((used, section("__debug"), aligned(8))) = { \
#name, __FILE__, CONNMAN_DEBUG_FLAG_ALIAS \
};
/**
* DBG:
* @fmt: format string
* @arg...: list of arguments
*
* Simple macro around connman_debug() which also include the function
* name it is called in.
*/
#define DBG(fmt, arg...) do { \
static struct connman_debug_desc __connman_debug_desc \
__attribute__((used, section("__debug"), aligned(8))) = { \
.file = __FILE__, .flags = CONNMAN_DEBUG_FLAG_DEFAULT, \
}; \
if (__connman_debug_desc.flags & CONNMAN_DEBUG_FLAG_PRINT) \
connman_debug("%s:%s() " fmt, \
__FILE__, __FUNCTION__ , ## arg); \
} while (0)
#if !defined(CONNMAN_DEBUG)
#define CONNMAN_DEBUG DEBUG && !NDEBUG
#endif
#if CONNMAN_DEBUG
extern unsigned int trace_depth;
extern char trace_tabbuf[];
extern void connman_create_indent(unsigned int depth, char *buffer);
#define connman_trace(dir, fmt, arg...) \
do { \
connman_create_indent(trace_depth, trace_tabbuf); \
connman_debug("%s" dir " (%d) %s: " fmt, \
trace_tabbuf, \
trace_depth, \
__FUNCTION__, \
## arg); \
} while (0)
#define connman_trace_in(fmt, arg...) \
do { \
connman_trace("-->", fmt, ## arg); \
trace_depth++; \
} while (0)
#define connman_trace_out(fmt, arg...) \
do { \
--trace_depth; \
connman_trace("<--", fmt, ## arg); \
} while (0)
#else
#define connman_trace_in(fmt, arg...)
#define connman_trace_out(fmt, arg...)
#endif
extern void connman_assert_handler(const char *name, const char *predicate, const char *message, const char *file, unsigned int line, void *value, int terminate);
#if !defined(CONNMAN_ASSERT)
#define CONNMAN_ASSERT(name, predicate, message, file, line, value) connman_assert_handler(name, predicate, message, file, line, value, 0)
#endif
#if !defined(CONNMAN_ASSERT_MODULE)
#define CONNMAN_ASSERT_MODULE NULL
#endif
#if CONNMAN_DEBUG
#define connman_assert(predicate) \
do { \
if (!(predicate)) { \
connman_assert_handler(CONNMAN_ASSERT_MODULE, \
#predicate, \
NULL, \
__FILE__, \
__LINE__, \
0, \
1); \
} \
} while (0)
#else
#define connman_assert(predicate)
#endif
#if CONNMAN_DEBUG
#define connman_check_message(predicate, message) \
do { \
if (!(predicate)) { \
CONNMAN_ASSERT(CONNMAN_ASSERT_MODULE, \
#predicate, \
message, \
__FILE__, \
__LINE__, \
0); \
} \
} while (0)
#else
#define connman_check_message(predicate, message)
#endif
#if CONNMAN_DEBUG
#define connman_check(predicate) \
connman_check_message(predicate, NULL)
#else
#define connman_check(predicate)
#endif
#if CONNMAN_DEBUG
#define connman_check_ok_message(error, message) \
do { \
if ((error) != 0) { \
CONNMAN_ASSERT(CONNMAN_ASSERT_MODULE, \
#error " == 0", \
message, \
__FILE__, \
__LINE__, \
(void *)error); \
} \
} while (0)
#else
#define connman_check_ok_message(error, message)
#endif
#if CONNMAN_DEBUG
#define connman_check_ok(error) \
connman_check_ok_message(error, NULL)
#else
#define connman_check_ok(error)
#endif
#if CONNMAN_DEBUG
#define connman_verify_message(predicate, message) \
connman_check_message(predicate, message)
#else
#define connman_verify_message(predicate, message) \
do { \
if (!predicate) { } \
} while (0)
#endif
#define connman_verify(predicate) \
connman_verify_message(predicate, NULL)
#if CONNMAN_DEBUG
#define connman_verify_execute_message(predicate, action, message) \
do { \
if (!(predicate)) { \
CONNMAN_ASSERT(CONNMAN_ASSERT_MODULE, \
#predicate, \
message, \
__FILE__, \
__LINE__, \
0); \
{ \
action; \
} \
} \
} while (0)
#else
#define connman_verify_execute_message(predicate, action, message) \
do { \
if (!(predicate)) { \
{ \
action; \
} \
} \
} while (0)
#endif
#define connman_verify_execute(predicate, action) \
connman_verify_execute_message(predicate, action, NULL)
#if CONNMAN_DEBUG
#define connman_verify_ok_message(error, message) \
connman_check_ok_message(error, message)
#else
#define connman_verify_ok_message(error, message) \
connman_verify_message(error == 0, message)
#endif
#define connman_verify_ok(error) \
connman_verify_ok_message(error, NULL)
#define connman_require_quiet(predicate, label) \
do { \
if (!(predicate)) { \
goto label; \
} \
} while (0)
#if CONNMAN_DEBUG
#define connman_require_message(predicate, label, message) \
do { \
if (!(predicate)) { \
CONNMAN_ASSERT(CONNMAN_ASSERT_MODULE, \
#predicate, \
message, \
__FILE__, \
__LINE__, \
0); \
goto label; \
} \
} while (0)
#else
#define connman_require_message(predicate, label, message) \
connman_require(predicate, label)
#endif
#define connman_require(predicate, label) \
connman_require_message(predicate, label, NULL)
#define connman_require_execute_quiet(predicate, label, action) \
do { \
if (!(predicate)) { \
{ \
action; \
} \
goto label; \
} \
} while (0)
#if CONNMAN_DEBUG
#define connman_require_execute_message(predicate, label, action, message) \
do { \
if (!(predicate)) { \
CONNMAN_ASSERT( \
CONNMAN_ASSERT_MODULE, \
#predicate, \
message, \
__FILE__, \
__LINE__, \
0); \
{ \
action; \
} \
goto label; \
} \
} while (0)
#else
#define connman_require_execute_message(predicate, label, action, message) \
connman_require_execute_message_quiet(predicate, label, action, message)
#endif
#define connman_require_execute(predicate, label, action) \
connman_require_execute_message(predicate, label, action, NULL)
#define connman_require_ok_quiet(error, label) \
connnman_require_quiet(error == 0, label)
#if CONNMAN_DEBUG
#define connman_require_ok_message(error, label, message) \
do { \
if ((error) != 0) { \
CONNMAN_ASSERT(CONNMAN_ASSERT_MODULE, \
#error " == 0 ", \
message, \
__FILE__, \
__LINE__, \
error); \
goto label; \
} \
} while (0)
#else
#define connman_require_ok_message(error, label, message) \
connman_require_ok_quiet(error, label)
#endif
#define connman_require_ok(error, label) \
connman_require_ok_message(error, label, NULL)
#define connman_require_ok_execute_quiet(error, label, action) \
do { \
if ((error) != 0) { \
{ \
action; \
} \
goto label; \
} \
} while (0)
#if CONNMAN_DEBUG
#define connman_require_ok_execute_message(error, label, action, message) \
do { \
if ((error) != 0) { \
CONNMAN_ASSERT(CONNMAN_ASSERT_MODULE, \
#error " == 0 ", \
message, \
__FILE__, \
__LINE__, \
error); \
{ \
action; \
} \
goto label; \
} \
} while (0)
#else
#define connman_require_ok_execute_message(error, label, action, message) \
connman_require_ok_execute_quiet(error, label, action)
#endif
#define connman_require_ok_execute(error, label, action) \
connman_require_ok_execute_message(error, label, action, NULL)
#ifdef __cplusplus
}
#endif
#endif /* __CONNMAN_LOG_H */