cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync/* $Id$ */
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync/** @file
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync * Logging helper
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync */
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync/*
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync * Copyright (C) 2011 Oracle Corporation
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync *
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync * available from http://www.virtualbox.org. This file is free software;
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync * you can redistribute it and/or modify it under the terms of the GNU
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync * General Public License (GPL) as published by the Free Software
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync */
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#ifndef ___VBoxDbgLog_h__
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#define ___VBoxDbgLog_h__
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#ifndef VBOX_DBG_LOG_NAME
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync# error VBOX_DBG_LOG_NAME should be defined!
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#endif
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync/* Uncomment to show file/line info in the log */
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync/*#define VBOX_DBG_LOG_SHOWLINEINFO*/
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#define VBOX_DBG_LOG_PREFIX_FMT VBOX_DBG_LOG_NAME"::"LOG_FN_FMT": "
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#define VBOX_DBG_LOG_PREFIX_PARMS __PRETTY_FUNCTION__
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#ifdef VBOX_DBG_LOG_SHOWLINEINFO
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync# define VBOX_DBG_LOG_SUFFIX_FMT " (%s:%d)\n"
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync# define VBOX_DBG_LOG_SUFFIX_PARMS ,__FILE__, __LINE__
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#else
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync# define VBOX_DBG_LOG_SUFFIX_FMT "\n"
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync# define VBOX_DBG_LOG_SUFFIX_PARMS
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#endif
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#ifdef DEBUG_misha
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync# define BP_WARN() AssertFailed()
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#else
f61a261b5992db888292208635137b8657391212vboxsync# define BP_WARN() do { } while (0)
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#endif
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#define _LOGMSG_EXACT(_logger, _a) \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync do \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync { \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync _logger(_a); \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync } while (0)
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#define _LOGMSG(_logger, _a) \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync do \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync { \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync _logger((VBOX_DBG_LOG_PREFIX_FMT, VBOX_DBG_LOG_PREFIX_PARMS)); \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync _logger(_a); \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync _logger((VBOX_DBG_LOG_SUFFIX_FMT VBOX_DBG_LOG_SUFFIX_PARMS)); \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync } while (0)
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync/* we can not print paged strings to RT logger, do it this way */
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#define _LOGMSG_STR(_logger, _a, _f) do {\
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync int _i = 0; \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync _logger(("\"")); \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync for (;(_a)[_i];++_i) { \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync _logger(("%"_f, (_a)[_i])); \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync }\
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync _logger(("\"\n")); \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync } while (0)
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#define _LOGMSG_USTR(_logger, _a) do {\
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync int _i = 0; \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync _logger(("\"")); \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync for (;_i<(_a)->Length/2;++_i) { \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync _logger(("%c", (_a)->Buffer[_i])); \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync }\
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync _logger(("\"\n")); \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync } while (0)
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#define WARN_NOBP(_a) \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync do \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync { \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync Log((VBOX_DBG_LOG_PREFIX_FMT"WARNING! ", VBOX_DBG_LOG_PREFIX_PARMS)); \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync Log(_a); \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync Log((VBOX_DBG_LOG_SUFFIX_FMT VBOX_DBG_LOG_SUFFIX_PARMS)); \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync } while (0)
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#define WARN(_a) \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync do \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync { \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync WARN_NOBP(_a); \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync BP_WARN(); \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync } while (0)
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#define ASSERT_WARN(_a, _w) do {\
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync if(!(_a)) { \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync WARN(_w); \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync }\
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync } while (0)
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#define LOG(_a) _LOGMSG(Log, _a)
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#define LOGREL(_a) _LOGMSG(LogRel, _a)
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#define LOGF(_a) _LOGMSG(LogFlow, _a)
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#define LOGF_ENTER() LOGF(("ENTER"))
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#define LOGF_LEAVE() LOGF(("LEAVE"))
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#define LOG_EXACT(_a) _LOGMSG_EXACT(Log, _a)
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#define LOGREL_EXACT(_a) _LOGMSG_EXACT(LogRel, _a)
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync/* we can not print paged strings to RT logger, do it this way */
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#define LOG_STRA(_a) do {\
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync _LOGMSG_STR(Log, _a, "c"); \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync } while (0)
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#define LOG_STRW(_a) do {\
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync _LOGMSG_STR(Log, _a, "c"); \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync } while (0)
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#define LOG_USTR(_a) do {\
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync _LOGMSG_USTR(Log, _a); \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync } while (0)
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#define LOGREL_STRA(_a) do {\
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync _LOGMSG_STR(LogRel, _a, "c"); \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync } while (0)
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#define LOGREL_STRW(_a) do {\
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync _LOGMSG_STR(LogRel, _a, "c"); \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync } while (0)
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#define LOGREL_USTR(_a) do {\
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync _LOGMSG_USTR(LogRel, _a); \
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync } while (0)
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync
cd28d44115468d6e014e0f8ec7bed13fc061e210vboxsync#endif /*___VBoxDbgLog_h__*/