log.cpp revision f0dd841cb99154da8ec0a31cae2f89044895a23f
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* $Id$ */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** @file
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Runtime VBox - Logger.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * available from http://www.virtualbox.org. This file is free software;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync *
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * The contents of this file may alternatively be used under the terms
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * of the Common Development and Distribution License Version 1.0
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * VirtualBox OSE distribution, in which case the provisions of the
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * CDDL are applicable instead of those of the GPL.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * You may elect to license modified versions of this file under the
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * terms and conditions of either the GPL or the CDDL or both.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * additional information or have any questions.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*******************************************************************************
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync* Header Files *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync*******************************************************************************/
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/log.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include "internal/iprt.h"
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef IN_RC
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# include <iprt/alloc.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# include <iprt/process.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# include <iprt/semaphore.h>
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync# include <iprt/thread.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# include <iprt/mp.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifdef IN_RING3
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# include <iprt/env.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# include <iprt/file.h>
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync# include <iprt/lockvalidator.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# include <iprt/path.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync#include <iprt/time.h>
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync#include <iprt/asm.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/assert.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/err.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/param.h>
afed5ab737f4aacfae3fe73776f40e989190a7cavboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/stdarg.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/string.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#include <iprt/ctype.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifdef IN_RING3
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# include <iprt/alloca.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# include <stdio.h>
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
0174432b2b1a760b89840ba696f7ba51def65dddvboxsync
2daaccf68be3773aee600c5c3e48bcf5401418a6vboxsync
0174432b2b1a760b89840ba696f7ba51def65dddvboxsync/*******************************************************************************
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync* Structures and Typedefs *
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync*******************************************************************************/
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync/**
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync * Arguments passed to the output function.
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync */
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsynctypedef struct RTLOGOUTPUTPREFIXEDARGS
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync{
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync /** The logger instance. */
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync PRTLOGGER pLogger;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** The flags. (used for prefixing.) */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync unsigned fFlags;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** The group. (used for prefixing.) */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync unsigned iGroup;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync} RTLOGOUTPUTPREFIXEDARGS, *PRTLOGOUTPUTPREFIXEDARGS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/*******************************************************************************
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync* Internal Functions *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync*******************************************************************************/
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef IN_RC
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic unsigned rtlogGroupFlags(const char *psz);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifdef IN_RING0
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic void rtR0LogLoggerExFallback(uint32_t fDestFlags, uint32_t fFlags, const char *pszFormat, va_list va);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic void rtlogFlush(PRTLOGGER pLogger);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(size_t) rtLogOutput(void *pv, const char *pachChars, size_t cbChars);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(size_t) rtLogOutputPrefixed(void *pv, const char *pachChars, size_t cbChars);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync/*******************************************************************************
22e281e75ed636601178296c6daebda8f1d17c59vboxsync* Global Variables *
22e281e75ed636601178296c6daebda8f1d17c59vboxsync*******************************************************************************/
22e281e75ed636601178296c6daebda8f1d17c59vboxsync#ifdef IN_RC
22e281e75ed636601178296c6daebda8f1d17c59vboxsync/** Default logger instance. */
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncextern "C" DECLIMPORT(RTLOGGERRC) g_Logger;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync#else /* !IN_RC */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync/** Default logger instance. */
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncstatic PRTLOGGER g_pLogger;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync#endif /* !IN_RC */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync#ifdef IN_RING3
22e281e75ed636601178296c6daebda8f1d17c59vboxsync/** The RTThreadGetWriteLockCount() change caused by the logger mutex semaphore. */
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncstatic uint32_t volatile g_cLoggerLockCount;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync#endif
22e281e75ed636601178296c6daebda8f1d17c59vboxsync#ifdef IN_RING0
22e281e75ed636601178296c6daebda8f1d17c59vboxsync/** Number of per-thread loggers. */
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncstatic int32_t volatile g_cPerThreadLoggers;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync/** Per-thread loggers.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * This is just a quick TLS hack suitable for debug logging only.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * If we run out of entries, just unload and reload the driver. */
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncstatic struct RTLOGGERPERTHREAD
22e281e75ed636601178296c6daebda8f1d17c59vboxsync{
22e281e75ed636601178296c6daebda8f1d17c59vboxsync /** The thread. */
7b80828e5760a8814fe6cd494d2715a4544fbddcvboxsync RTNATIVETHREAD volatile NativeThread;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync /** The (process / session) key. */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync uintptr_t volatile uKey;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync /** The logger instance.*/
22e281e75ed636601178296c6daebda8f1d17c59vboxsync PRTLOGGER volatile pLogger;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync} g_aPerThreadLoggers[8] =
22e281e75ed636601178296c6daebda8f1d17c59vboxsync{ { NIL_RTNATIVETHREAD, 0, 0},
22e281e75ed636601178296c6daebda8f1d17c59vboxsync { NIL_RTNATIVETHREAD, 0, 0},
22e281e75ed636601178296c6daebda8f1d17c59vboxsync { NIL_RTNATIVETHREAD, 0, 0},
22e281e75ed636601178296c6daebda8f1d17c59vboxsync { NIL_RTNATIVETHREAD, 0, 0},
22e281e75ed636601178296c6daebda8f1d17c59vboxsync { NIL_RTNATIVETHREAD, 0, 0},
22e281e75ed636601178296c6daebda8f1d17c59vboxsync { NIL_RTNATIVETHREAD, 0, 0},
22e281e75ed636601178296c6daebda8f1d17c59vboxsync { NIL_RTNATIVETHREAD, 0, 0},
22e281e75ed636601178296c6daebda8f1d17c59vboxsync { NIL_RTNATIVETHREAD, 0, 0}
22e281e75ed636601178296c6daebda8f1d17c59vboxsync};
22e281e75ed636601178296c6daebda8f1d17c59vboxsync#endif /* IN_RING0 */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync/**
d1cbbd799d8912978f5146960b6780f387bb414bvboxsync * Logger flags instructions.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync */
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncstatic struct
c17f5c90f2cb60b38ecabebce128724c6ff2d036vboxsync{
22e281e75ed636601178296c6daebda8f1d17c59vboxsync const char *pszInstr; /**< The name */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync size_t cchInstr; /**< The size of the name. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t fFlag; /**< The flag value. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync bool fInverted; /**< Inverse meaning? */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncconst s_aLogFlags[] =
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "disabled", sizeof("disabled" ) - 1, RTLOGFLAGS_DISABLED, false },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "enabled", sizeof("enabled" ) - 1, RTLOGFLAGS_DISABLED, true },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "buffered", sizeof("buffered" ) - 1, RTLOGFLAGS_BUFFERED, false },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "unbuffered", sizeof("unbuffered" ) - 1, RTLOGFLAGS_BUFFERED, true },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "usecrlf", sizeof("usecrlf" ) - 1, RTLOGFLAGS_USECRLF, false },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "uself", sizeof("uself" ) - 1, RTLOGFLAGS_USECRLF, true },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "append", sizeof("append" ) - 1, RTLOGFLAGS_APPEND, false },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "overwrite", sizeof("overwrite" ) - 1, RTLOGFLAGS_APPEND, true },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "rel", sizeof("rel" ) - 1, RTLOGFLAGS_REL_TS, false },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "abs", sizeof("abs" ) - 1, RTLOGFLAGS_REL_TS, true },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "dec", sizeof("dec" ) - 1, RTLOGFLAGS_DECIMAL_TS, false },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "hex", sizeof("hex" ) - 1, RTLOGFLAGS_DECIMAL_TS, true },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "lockcnts", sizeof("lockcnts" ) - 1, RTLOGFLAGS_PREFIX_LOCK_COUNTS, false },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "cpuid", sizeof("cpuid" ) - 1, RTLOGFLAGS_PREFIX_CPUID, false },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "pid", sizeof("pid" ) - 1, RTLOGFLAGS_PREFIX_PID, false },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "flagno", sizeof("flagno" ) - 1, RTLOGFLAGS_PREFIX_FLAG_NO, false },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "flag", sizeof("flag" ) - 1, RTLOGFLAGS_PREFIX_FLAG, false },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "groupno", sizeof("groupno" ) - 1, RTLOGFLAGS_PREFIX_GROUP_NO, false },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "group", sizeof("group" ) - 1, RTLOGFLAGS_PREFIX_GROUP, false },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "tid", sizeof("tid" ) - 1, RTLOGFLAGS_PREFIX_TID, false },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "thread", sizeof("thread" ) - 1, RTLOGFLAGS_PREFIX_THREAD, false },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "custom", sizeof("custom" ) - 1, RTLOGFLAGS_PREFIX_CUSTOM, false },
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync { "timeprog", sizeof("timeprog" ) - 1, RTLOGFLAGS_PREFIX_TIME_PROG, false },
a11c569636fa6838bd423f4631a9660a5a84204bvboxsync { "time", sizeof("time" ) - 1, RTLOGFLAGS_PREFIX_TIME, false },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "msprog", sizeof("msprog" ) - 1, RTLOGFLAGS_PREFIX_MS_PROG, false },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "tsc", sizeof("tsc" ) - 1, RTLOGFLAGS_PREFIX_TSC, false }, /* before ts! */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "ts", sizeof("ts" ) - 1, RTLOGFLAGS_PREFIX_TS, false },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync};
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Logger destination instructions.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic struct
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const char *pszInstr; /**< The name. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync size_t cchInstr; /**< The size of the name. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t fFlag; /**< The corresponding destination flag. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync} const s_aLogDst[] =
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
3ecf9412133496b2aeb090cfd33a286404ec59fbvboxsync { "file", sizeof("file" ) - 1, RTLOGDEST_FILE }, /* Must be 1st! */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "dir", sizeof("dir" ) - 1, RTLOGDEST_FILE }, /* Must be 2nd! */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "stdout", sizeof("stdout" ) - 1, RTLOGDEST_STDOUT },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "stderr", sizeof("stderr" ) - 1, RTLOGDEST_STDERR },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "debugger", sizeof("debugger") - 1, RTLOGDEST_DEBUGGER },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "com", sizeof("com" ) - 1, RTLOGDEST_COM },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "user", sizeof("user" ) - 1, RTLOGDEST_USER },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync};
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
750d4d0506a38b2e80c997075d40aad474e675fbvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Locks the logger instance.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @returns See RTSemSpinMutexRequest().
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pLogger The logger instance.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncDECLINLINE(int) rtlogLock(PRTLOGGER pLogger)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef IN_RC
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger->hSpinMtx != NIL_RTSEMSPINMUTEX)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = RTSemSpinMutexRequest(pLogger->hSpinMtx);
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync if (RT_FAILURE(rc))
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync return rc;
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync }
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync#endif
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync return VINF_SUCCESS;
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync}
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync * Unlocks the logger instance.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pLogger The logger instance.
576d4214137bce409cdcf01e8df4a0bca5e0b2d1vboxsync */
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsyncDECLINLINE(void) rtlogUnlock(PRTLOGGER pLogger)
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef IN_RC
72ef2b9fc5ffc01d0dabd5052d6e8baa3a952773vboxsync if (pLogger->hSpinMtx != NIL_RTSEMFASTMUTEX)
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync RTSemSpinMutexRelease(pLogger->hSpinMtx);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef IN_RC
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Create a logger instance, comprehensive version.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync * @returns iprt status code.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param ppLogger Where to store the logger instance.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param fFlags Logger instance flags, a combination of the RTLOGFLAGS_* values.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pszGroupSettings The initial group settings.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pszEnvVarBase Base name for the environment variables for this instance.
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync * @param cGroups Number of groups in the array.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param papszGroups Pointer to array of groups. This must stick around for the life of the
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * logger instance.
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync * @param fDestFlags The destination flags. RTLOGDEST_FILE is ORed if pszFilenameFmt specified.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pszErrorMsg A buffer which is filled with an error message if something fails. May be NULL.
909f4391cc20b4a3a9a2d3f8718084b669663ab2vboxsync * @param cchErrorMsg The size of the error message buffer.
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync * @param pszFilenameFmt Log filename format string. Standard RTStrFormat().
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync * @param ... Format arguments.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync */
8a132edc1577cbe2a19cd778c1b2bea6ae5e8515vboxsyncRTDECL(int) RTLogCreateExV(PRTLOGGER *ppLogger, uint32_t fFlags, const char *pszGroupSettings,
3ecd8008b81f02a04220705ae0033142af363280vboxsync const char *pszEnvVarBase, unsigned cGroups, const char * const * papszGroups,
3ecd8008b81f02a04220705ae0033142af363280vboxsync uint32_t fDestFlags, char *pszErrorMsg, size_t cchErrorMsg, const char *pszFilenameFmt, va_list args)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc;
576d4214137bce409cdcf01e8df4a0bca5e0b2d1vboxsync size_t cb;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PRTLOGGER pLogger;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Validate input.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ( (cGroups && !papszGroups)
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync || !VALID_PTR(ppLogger)
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync )
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertMsgFailed(("Invalid parameters!\n"));
3ecd8008b81f02a04220705ae0033142af363280vboxsync return VERR_INVALID_PARAMETER;
3ecd8008b81f02a04220705ae0033142af363280vboxsync }
22e281e75ed636601178296c6daebda8f1d17c59vboxsync *ppLogger = NULL;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pszErrorMsg)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTStrPrintf(pszErrorMsg, cchErrorMsg, "unknown error");
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Allocate a logger instance.
247b55faa8d054157f2481e68caca36f4dc9542cvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync cb = RT_OFFSETOF(RTLOGGER, afGroups[cGroups + 1]) + RTPATH_MAX;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger = (PRTLOGGER)RTMemAllocZ(cb);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger)
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync {
57399ab65e2825c324fb9dcb4642d4ae2c232509vboxsync uint8_t *pu8Code;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync pLogger->u32Magic = RTLOGGER_MAGIC;
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync pLogger->papszGroups = papszGroups;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->cMaxGroups = cGroups;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->cGroups = cGroups;
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync pLogger->pszFilename = (char *)&pLogger->afGroups[cGroups + 1];
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->File = NIL_RTFILE;
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync pLogger->fFlags = fFlags;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->fDestFlags = fDestFlags;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->fPendingPrefix = true;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pszGroupSettings)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTLogGroupSettings(pLogger, pszGroupSettings);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync * Emit wrapper code.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#if defined(LOG_USE_C99) && defined(RT_WITHOUT_EXEC_ALLOC)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pu8Code = (uint8_t *)RTMemAlloc(64);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
247b55faa8d054157f2481e68caca36f4dc9542cvboxsync pu8Code = (uint8_t *)RTMemExecAlloc(64);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pu8Code)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync pLogger->pfnLogger = *(PFNRTLOGGER*)&pu8Code;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync#if defined(RT_ARCH_AMD64) || (defined(LOG_USE_C99) && defined(RT_WITHOUT_EXEC_ALLOC))
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync /* this wrapper will not be used on AMD64, we will be requiring C99 compilers there. */
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync *pu8Code++ = 0xcc;
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *pu8Code++ = 0x68; /* push imm32 */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *(void **)pu8Code = pLogger;
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync pu8Code += sizeof(void *);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *pu8Code++ = 0xe8; /* call rel32 */
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync *(uint32_t *)pu8Code = (uintptr_t)RTLogLogger - ((uintptr_t)pu8Code + sizeof(uint32_t));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pu8Code += sizeof(uint32_t);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *pu8Code++ = 0x8d; /* lea esp, [esp + 4] */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *pu8Code++ = 0x64;
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync *pu8Code++ = 0x24;
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync *pu8Code++ = 0x04;
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync *pu8Code++ = 0xc3; /* ret near */
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync#endif
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync AssertMsg((uintptr_t)pu8Code - (uintptr_t)pLogger->pfnLogger <= 64,
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync ("Wrapper assembly is too big! %d bytes\n", (uintptr_t)pu8Code - (uintptr_t)pLogger->pfnLogger));
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync#ifdef IN_RING3 /* files and env.vars. are only accessible when in R3 at the present time. */
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync /*
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * Format the filename.
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync */
e50404712a2b5234c42bdf9740bddab5729ba188vboxsync if (pszFilenameFmt)
57399ab65e2825c324fb9dcb4642d4ae2c232509vboxsync {
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync RTStrPrintfV(pLogger->pszFilename, RTPATH_MAX, pszFilenameFmt, args);
57399ab65e2825c324fb9dcb4642d4ae2c232509vboxsync pLogger->fDestFlags |= RTLOGDEST_FILE;
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync }
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync
1843553dbdf4e46417158b4c6348c503adf10740vboxsync /*
1843553dbdf4e46417158b4c6348c503adf10740vboxsync * Parse the environment variables.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync */
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync if (pszEnvVarBase)
1843553dbdf4e46417158b4c6348c503adf10740vboxsync {
806d0b554daa555364af5f87bc96eccbe760db7avboxsync /* make temp copy of environment variable base. */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync size_t cchEnvVarBase = strlen(pszEnvVarBase);
1843553dbdf4e46417158b4c6348c503adf10740vboxsync char *pszEnvVar = (char *)alloca(cchEnvVarBase + 16);
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync memcpy(pszEnvVar, pszEnvVarBase, cchEnvVarBase);
1843553dbdf4e46417158b4c6348c503adf10740vboxsync
1843553dbdf4e46417158b4c6348c503adf10740vboxsync /*
1843553dbdf4e46417158b4c6348c503adf10740vboxsync * Destination.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync strcpy(pszEnvVar + cchEnvVarBase, "_DEST");
1843553dbdf4e46417158b4c6348c503adf10740vboxsync const char *pszVar = RTEnvGet(pszEnvVar);
1843553dbdf4e46417158b4c6348c503adf10740vboxsync if (pszVar)
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync RTLogDestinations(pLogger, pszVar);
1843553dbdf4e46417158b4c6348c503adf10740vboxsync
ebbb1f6c7e8bae363a4efda4b35b58c8467d24bcvboxsync /*
1843553dbdf4e46417158b4c6348c503adf10740vboxsync * The flags.
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync strcpy(pszEnvVar + cchEnvVarBase, "_FLAGS");
1843553dbdf4e46417158b4c6348c503adf10740vboxsync pszVar = RTEnvGet(pszEnvVar);
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync if (pszVar)
1843553dbdf4e46417158b4c6348c503adf10740vboxsync RTLogFlags(pLogger, pszVar);
1843553dbdf4e46417158b4c6348c503adf10740vboxsync
ebbb1f6c7e8bae363a4efda4b35b58c8467d24bcvboxsync /*
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync * The group settings.
1843553dbdf4e46417158b4c6348c503adf10740vboxsync */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync pszEnvVar[cchEnvVarBase] = '\0';
22e281e75ed636601178296c6daebda8f1d17c59vboxsync pszVar = RTEnvGet(pszEnvVar);
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync if (pszVar)
1843553dbdf4e46417158b4c6348c503adf10740vboxsync RTLogGroupSettings(pLogger, pszVar);
806d0b554daa555364af5f87bc96eccbe760db7avboxsync }
1843553dbdf4e46417158b4c6348c503adf10740vboxsync#endif /* IN_RING3 */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync /*
1843553dbdf4e46417158b4c6348c503adf10740vboxsync * Open the destination(s).
1843553dbdf4e46417158b4c6348c503adf10740vboxsync */
1843553dbdf4e46417158b4c6348c503adf10740vboxsync rc = VINF_SUCCESS;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync#ifdef IN_RING3
1843553dbdf4e46417158b4c6348c503adf10740vboxsync if (pLogger->fDestFlags & RTLOGDEST_FILE)
1843553dbdf4e46417158b4c6348c503adf10740vboxsync {
1843553dbdf4e46417158b4c6348c503adf10740vboxsync if (!(pLogger->fFlags & RTLOGFLAGS_APPEND))
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync rc = RTFileOpen(&pLogger->File, pLogger->pszFilename,
1843553dbdf4e46417158b4c6348c503adf10740vboxsync RTFILE_O_WRITE | RTFILE_O_CREATE_REPLACE | RTFILE_O_DENY_WRITE);
ebbb1f6c7e8bae363a4efda4b35b58c8467d24bcvboxsync else
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync {
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync /** @todo RTFILE_O_APPEND. */
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync rc = RTFileOpen(&pLogger->File, pLogger->pszFilename,
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync RTFILE_O_WRITE | RTFILE_O_OPEN_CREATE | RTFILE_O_DENY_WRITE);
533ffcb943c4af2c5fe6385d816d0ba3eda9383bvboxsync if (RT_SUCCESS(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = RTFileSeek(pLogger->File, 0, RTFILE_SEEK_END, NULL);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_FAILURE(rc))
22e281e75ed636601178296c6daebda8f1d17c59vboxsync {
e52f819639386db020b2a635b47a415248c7fbf9vboxsync RTFileClose(pLogger->File);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->File = NIL_RTFILE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync }
22e281e75ed636601178296c6daebda8f1d17c59vboxsync if (RT_FAILURE(rc) && pszErrorMsg)
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync RTStrPrintf(pszErrorMsg, cchErrorMsg, "could not open file '%s'", pLogger->pszFilename);
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync }
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync#endif /* IN_RING3 */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync * Create mutex and check how much it counts when entering the lock
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * so that we can report the values for RTLOGFLAGS_PREFIX_LOCK_COUNTS.
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(rc))
0e77737b0ba913683e614db11463b31ca67aacbevboxsync {
0e77737b0ba913683e614db11463b31ca67aacbevboxsync rc = RTSemSpinMutexCreate(&pLogger->hSpinMtx, RTSEMSPINMUTEX_FLAGS_IRQ_SAFE);
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync if (RT_SUCCESS(rc))
0e77737b0ba913683e614db11463b31ca67aacbevboxsync {
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync#ifdef IN_RING3 /** @todo do counters in ring-0 too? */
0e77737b0ba913683e614db11463b31ca67aacbevboxsync RTTHREAD Thread = RTThreadSelf();
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync if (Thread != NIL_RTTHREAD)
22e281e75ed636601178296c6daebda8f1d17c59vboxsync {
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync int32_t c = RTLockValidatorWriteLockGetCount(Thread);
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync RTSemSpinMutexRequest(pLogger->hSpinMtx);
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync c = RTLockValidatorWriteLockGetCount(Thread) - c;
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync RTSemSpinMutexRelease(pLogger->hSpinMtx);
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync ASMAtomicWriteU32(&g_cLoggerLockCount, c);
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync }
22e281e75ed636601178296c6daebda8f1d17c59vboxsync#endif
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync *ppLogger = pLogger;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync return VINF_SUCCESS;
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync }
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync if (pszErrorMsg)
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync RTStrPrintf(pszErrorMsg, cchErrorMsg, "failed to create sempahore");
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync }
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync#ifdef IN_RING3
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync RTFileClose(pLogger->File);
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync#endif
2d53f6e472561965d363674e17f48d3bdffc24d3vboxsync#if defined(LOG_USE_C99) && defined(RT_WITHOUT_EXEC_ALLOC)
0e77737b0ba913683e614db11463b31ca67aacbevboxsync RTMemFree(*(void **)&pLogger->pfnLogger);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTMemExecFree(*(void **)&pLogger->pfnLogger);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
22e281e75ed636601178296c6daebda8f1d17c59vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifdef RT_OS_LINUX
8e972b677df5ee27b99211fc7e456a5aa50f3e68vboxsync /*
8e972b677df5ee27b99211fc7e456a5aa50f3e68vboxsync * RTMemAlloc() succeeded but RTMemExecAlloc() failed -- most probably an SELinux problem.
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pszErrorMsg)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTStrPrintf(pszErrorMsg, cchErrorMsg, "mmap(PROT_WRITE | PROT_EXEC) failed -- SELinux?");
22e281e75ed636601178296c6daebda8f1d17c59vboxsync#endif /* RT_OS_LINUX */
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync rc = VERR_NO_MEMORY;
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTMemFree(pLogger);
806d0b554daa555364af5f87bc96eccbe760db7avboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync rc = VERR_NO_MEMORY;
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync
806d0b554daa555364af5f87bc96eccbe760db7avboxsync return rc;
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync}
806d0b554daa555364af5f87bc96eccbe760db7avboxsyncRT_EXPORT_SYMBOL(RTLogCreateExV);
806d0b554daa555364af5f87bc96eccbe760db7avboxsync
806d0b554daa555364af5f87bc96eccbe760db7avboxsync
806d0b554daa555364af5f87bc96eccbe760db7avboxsync/**
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * Create a logger instance.
806d0b554daa555364af5f87bc96eccbe760db7avboxsync *
806d0b554daa555364af5f87bc96eccbe760db7avboxsync * @returns iprt status code.
806d0b554daa555364af5f87bc96eccbe760db7avboxsync *
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync * @param ppLogger Where to store the logger instance.
806d0b554daa555364af5f87bc96eccbe760db7avboxsync * @param fFlags Logger instance flags, a combination of the RTLOGFLAGS_* values.
806d0b554daa555364af5f87bc96eccbe760db7avboxsync * @param pszGroupSettings The initial group settings.
d98e61ba075ed7d0b567a5d884bc85d643fe3de7vboxsync * @param pszEnvVarBase Base name for the environment variables for this instance.
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync * @param cGroups Number of groups in the array.
806d0b554daa555364af5f87bc96eccbe760db7avboxsync * @param papszGroups Pointer to array of groups. This must stick around for the life of the
806d0b554daa555364af5f87bc96eccbe760db7avboxsync * logger instance.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param fDestFlags The destination flags. RTLOGDEST_FILE is ORed if pszFilenameFmt specified.
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync * @param pszFilenameFmt Log filename format string. Standard RTStrFormat().
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param ... Format arguments.
806d0b554daa555364af5f87bc96eccbe760db7avboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRTDECL(int) RTLogCreate(PRTLOGGER *ppLogger, uint32_t fFlags, const char *pszGroupSettings,
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync const char *pszEnvVarBase, unsigned cGroups, const char * const * papszGroups,
806d0b554daa555364af5f87bc96eccbe760db7avboxsync uint32_t fDestFlags, const char *pszFilenameFmt, ...)
806d0b554daa555364af5f87bc96eccbe760db7avboxsync{
22e281e75ed636601178296c6daebda8f1d17c59vboxsync va_list args;
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync int rc;
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync
806d0b554daa555364af5f87bc96eccbe760db7avboxsync va_start(args, pszFilenameFmt);
e149c362e69e5f0bbd82da11fd8163b2d29c3a72vboxsync rc = RTLogCreateExV(ppLogger, fFlags, pszGroupSettings, pszEnvVarBase, cGroups, papszGroups, fDestFlags, NULL, 0, pszFilenameFmt, args);
806d0b554daa555364af5f87bc96eccbe760db7avboxsync va_end(args);
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync return rc;
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync}
806d0b554daa555364af5f87bc96eccbe760db7avboxsyncRT_EXPORT_SYMBOL(RTLogCreate);
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync
806d0b554daa555364af5f87bc96eccbe760db7avboxsync
806d0b554daa555364af5f87bc96eccbe760db7avboxsync/**
806d0b554daa555364af5f87bc96eccbe760db7avboxsync * Create a logger instance.
806d0b554daa555364af5f87bc96eccbe760db7avboxsync *
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * @returns iprt status code.
806d0b554daa555364af5f87bc96eccbe760db7avboxsync *
806d0b554daa555364af5f87bc96eccbe760db7avboxsync * @param ppLogger Where to store the logger instance.
806d0b554daa555364af5f87bc96eccbe760db7avboxsync * @param fFlags Logger instance flags, a combination of the RTLOGFLAGS_* values.
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync * @param pszGroupSettings The initial group settings.
806d0b554daa555364af5f87bc96eccbe760db7avboxsync * @param pszEnvVarBase Base name for the environment variables for this instance.
806d0b554daa555364af5f87bc96eccbe760db7avboxsync * @param cGroups Number of groups in the array.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param papszGroups Pointer to array of groups. This must stick around for the life of the
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * logger instance.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param fDestFlags The destination flags. RTLOGDEST_FILE is ORed if pszFilenameFmt specified.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pszErrorMsg A buffer which is filled with an error message if something fails. May be NULL.
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync * @param cchErrorMsg The size of the error message buffer.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pszFilenameFmt Log filename format string. Standard RTStrFormat().
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param ... Format arguments.
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRTDECL(int) RTLogCreateEx(PRTLOGGER *ppLogger, uint32_t fFlags, const char *pszGroupSettings,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const char *pszEnvVarBase, unsigned cGroups, const char * const * papszGroups,
22e281e75ed636601178296c6daebda8f1d17c59vboxsync uint32_t fDestFlags, char *pszErrorMsg, size_t cchErrorMsg, const char *pszFilenameFmt, ...)
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync va_list args;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync va_start(args, pszFilenameFmt);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = RTLogCreateExV(ppLogger, fFlags, pszGroupSettings, pszEnvVarBase, cGroups, papszGroups, fDestFlags, pszErrorMsg, cchErrorMsg, pszFilenameFmt, args);
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync va_end(args);
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync return rc;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync}
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsyncRT_EXPORT_SYMBOL(RTLogCreateEx);
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync/**
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * Destroys a logger instance.
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync *
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync * The instance is flushed and all output destinations closed (where applicable).
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync *
806d0b554daa555364af5f87bc96eccbe760db7avboxsync * @returns iprt status code.
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync * @param pLogger The logger instance which close destroyed. NULL is fine.
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync */
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsyncRTDECL(int) RTLogDestroy(PRTLOGGER pLogger)
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync{
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync int rc;
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync uint32_t iGroup;
03319aeaef07ef63a404237f2cb56199131f4a03vboxsync RTSEMSPINMUTEX hSpinMtx;
1157941288c9533575a655c660af55d13da31eefvboxsync
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync /*
1157941288c9533575a655c660af55d13da31eefvboxsync * Validate input.
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync */
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync if (!pLogger)
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync return VINF_SUCCESS;
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync AssertReturn(VALID_PTR(pLogger), VERR_INVALID_POINTER);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync AssertReturn(pLogger->u32Magic == RTLOGGER_MAGIC, VERR_INVALID_MAGIC);
8e8844a522f5d335f177a0313b03067d79cce201vboxsync
7bae75e0b207aa4d4cad2a951271ad1a0e8ab9fdvboxsync /*
7bae75e0b207aa4d4cad2a951271ad1a0e8ab9fdvboxsync * Acquire logger instance sem and disable all logging. (paranoia)
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync */
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync rc = rtlogLock(pLogger);
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync AssertMsgRCReturn(rc, ("%Rrc\n", rc), rc);
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync pLogger->fFlags |= RTLOGFLAGS_DISABLED;
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync iGroup = pLogger->cGroups;
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync while (iGroup-- > 0)
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync pLogger->afGroups[iGroup] = 0;
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync /*
5e797edc29f96c8367de4fbf5874171c24a89ba7vboxsync * Flush it.
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync */
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync rtlogFlush(pLogger);
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync /*
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * Close output stuffs.
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync */
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync#ifdef IN_RING3
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync if (pLogger->File != NIL_RTFILE)
e149c362e69e5f0bbd82da11fd8163b2d29c3a72vboxsync {
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync int rc2 = RTFileClose(pLogger->File);
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync AssertRC(rc2);
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync if (RT_FAILURE(rc2) && RT_SUCCESS(rc))
57399ab65e2825c324fb9dcb4642d4ae2c232509vboxsync rc = rc2;
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync pLogger->File = NIL_RTFILE;
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync }
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync#endif
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync
22e281e75ed636601178296c6daebda8f1d17c59vboxsync /*
8e8844a522f5d335f177a0313b03067d79cce201vboxsync * Free the mutex, the wrapper and the instance memory.
7bae75e0b207aa4d4cad2a951271ad1a0e8ab9fdvboxsync */
7bae75e0b207aa4d4cad2a951271ad1a0e8ab9fdvboxsync hSpinMtx = pLogger->hSpinMtx;
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync pLogger->hSpinMtx = NIL_RTSEMSPINMUTEX;
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync if (hSpinMtx != NIL_RTSEMSPINMUTEX)
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync {
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync int rc2;
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync RTSemSpinMutexRelease(hSpinMtx);
79b24ef0ab7cd4a03a3571b3954c52ab8b573137vboxsync rc2 = RTSemSpinMutexDestroy(hSpinMtx);
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync AssertRC(rc2);
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync if (RT_FAILURE(rc2) && RT_SUCCESS(rc))
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync rc = rc2;
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync }
7082d29724f6c3788977a51591b0379fd3acbf72vboxsync
7082d29724f6c3788977a51591b0379fd3acbf72vboxsync if (pLogger->pfnLogger)
7082d29724f6c3788977a51591b0379fd3acbf72vboxsync {
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync#if defined(LOG_USE_C99) && defined(RT_WITHOUT_EXEC_ALLOC)
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync RTMemFree(*(void **)&pLogger->pfnLogger);
46b1ac1c3302722f93e787d0f0693965e88f5ceevboxsync#else
22e281e75ed636601178296c6daebda8f1d17c59vboxsync RTMemExecFree(*(void **)&pLogger->pfnLogger);
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync#endif
e4ea543752422f1139923e3e506c625b0a1827c5vboxsync pLogger->pfnLogger = NULL;
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync }
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync RTMemFree(pLogger);
f827fea1108b8f8a1a5f63318f6ec3cf4a9e7010vboxsync
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync return rc;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync}
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsyncRT_EXPORT_SYMBOL(RTLogDestroy);
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync
5cf54b3ffeb7ee90685dcaec329ef71a729f5947vboxsync
806d0b554daa555364af5f87bc96eccbe760db7avboxsync/**
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync * Create a logger instance clone for RC usage.
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync *
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync * @returns iprt status code.
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync *
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync * @param pLogger The logger instance to be cloned.
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync * @param pLoggerRC Where to create the RC logger instance.
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync * @param cbLoggerRC Amount of memory allocated to for the RC logger
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync * instance clone.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * @param pfnLoggerRCPtr Pointer to logger wrapper function for this
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync * instance (RC Ptr).
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync * @param pfnFlushRCPtr Pointer to flush function (RC Ptr).
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync * @param fFlags Logger instance flags, a combination of the RTLOGFLAGS_* values.
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync */
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsyncRTDECL(int) RTLogCloneRC(PRTLOGGER pLogger, PRTLOGGERRC pLoggerRC, size_t cbLoggerRC,
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync RTRCPTR pfnLoggerRCPtr, RTRCPTR pfnFlushRCPtr, uint32_t fFlags)
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync{
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync /*
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync * Validate input.
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync */
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync if ( !pLoggerRC
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync || !pfnFlushRCPtr
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync || !pfnLoggerRCPtr)
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync {
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync AssertMsgFailed(("Invalid parameters!\n"));
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync return VERR_INVALID_PARAMETER;
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync }
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync if (cbLoggerRC < sizeof(*pLoggerRC))
22e281e75ed636601178296c6daebda8f1d17c59vboxsync {
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync AssertMsgFailed(("%d min=%d\n", cbLoggerRC, sizeof(*pLoggerRC)));
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync return VERR_INVALID_PARAMETER;
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync }
e149c362e69e5f0bbd82da11fd8163b2d29c3a72vboxsync
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync /*
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync * Initialize GC instance.
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync */
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync pLoggerRC->offScratch = 0;
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync pLoggerRC->fPendingPrefix = false;
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync pLoggerRC->pfnLogger = pfnLoggerRCPtr;
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync pLoggerRC->pfnFlush = pfnFlushRCPtr;
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync pLoggerRC->u32Magic = RTLOGGERRC_MAGIC;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync pLoggerRC->fFlags = fFlags | RTLOGFLAGS_DISABLED;
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync pLoggerRC->cGroups = 1;
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync pLoggerRC->afGroups[0] = 0;
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync /*
6f0193f5a9287559d34a75f438c2682d8fb08038vboxsync * Resolve defaults.
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync */
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync if (!pLogger)
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync {
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync pLogger = RTLogDefaultInstance();
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync if (!pLogger)
f9147fe1eaa4e35287f8f39282c7f92f0d7de0b7vboxsync return VINF_SUCCESS;
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync }
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync /*
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * Check if there's enough space for the groups.
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync */
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync if (cbLoggerRC < (size_t)RT_OFFSETOF(RTLOGGERRC, afGroups[pLogger->cGroups]))
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync {
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync AssertMsgFailed(("%d req=%d cGroups=%d\n", cbLoggerRC, RT_OFFSETOF(RTLOGGERRC, afGroups[pLogger->cGroups]), pLogger->cGroups));
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync return VERR_INVALID_PARAMETER;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync }
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync memcpy(&pLoggerRC->afGroups[0], &pLogger->afGroups[0], pLogger->cGroups * sizeof(pLoggerRC->afGroups[0]));
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync pLoggerRC->cGroups = pLogger->cGroups;
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync /*
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync * Copy bits from the HC instance.
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync */
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync pLoggerRC->fPendingPrefix = pLogger->fPendingPrefix;
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync pLoggerRC->fFlags |= pLogger->fFlags;
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync /*
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync * Check if we can remove the disabled flag.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync */
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync if ( pLogger->fDestFlags
13ba5527caaa9b8c4fee29f22e374fa67c4c6f72vboxsync && !((pLogger->fFlags | fFlags) & RTLOGFLAGS_DISABLED))
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync pLoggerRC->fFlags &= ~RTLOGFLAGS_DISABLED;
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync return VINF_SUCCESS;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync}
8e8844a522f5d335f177a0313b03067d79cce201vboxsyncRT_EXPORT_SYMBOL(RTLogCloneRC);
8e8844a522f5d335f177a0313b03067d79cce201vboxsync
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync/**
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync * Flushes a RC logger instance to a R3 logger.
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync *
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync *
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync * @returns iprt status code.
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync * @param pLogger The R3 logger instance to flush pLoggerRC to. If NULL
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync * the default logger is used.
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync * @param pLoggerRC The RC logger instance to flush.
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync */
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsyncRTDECL(void) RTLogFlushRC(PRTLOGGER pLogger, PRTLOGGERRC pLoggerRC)
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync{
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync /*
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync * Resolve defaults.
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync if (!pLogger)
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync {
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync pLogger = RTLogDefaultInstance();
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync if (!pLogger)
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync {
22e281e75ed636601178296c6daebda8f1d17c59vboxsync pLoggerRC->offScratch = 0;
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync return;
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync }
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync }
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync /*
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync * Any thing to flush?
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync */
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync if ( pLogger->offScratch
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync || pLoggerRC->offScratch)
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync {
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync /*
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * Acquire logger instance sem.
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync */
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync int rc = rtlogLock(pLogger);
3dde2f85d4cf477621a3128887a2c08a8bca7c01vboxsync if (RT_FAILURE(rc))
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync return;
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync /*
46df4404c8dbbf3672e7aae8cd0b2770356e5b73vboxsync * Write whatever the GC instance contains to the HC one, and then
5db1d52ffbcaa46c3d944c6c2d9c552306817d9avboxsync * flush the HC instance.
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync */
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync if (pLoggerRC->offScratch)
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync {
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync rtLogOutput(pLogger, pLoggerRC->achScratch, pLoggerRC->offScratch);
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync rtLogOutput(pLogger, NULL, 0);
e0b9d3c357adf9b7d05f55540e86f22943fc4b23vboxsync pLoggerRC->offScratch = 0;
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync }
22e281e75ed636601178296c6daebda8f1d17c59vboxsync
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync /*
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync * Release the semaphore.
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync */
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync rtlogUnlock(pLogger);
22e281e75ed636601178296c6daebda8f1d17c59vboxsync }
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync}
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsyncRT_EXPORT_SYMBOL(RTLogFlushRC);
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync#ifdef IN_RING3
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync/**
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync * Create a logger instance for singled threaded ring-0 usage.
e08de24d4792d31b7f2aac29db5cb8840d940009vboxsync *
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync * @returns iprt status code.
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync *
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync * @param pLogger Where to create the logger instance.
22e281e75ed636601178296c6daebda8f1d17c59vboxsync * @param cbLogger The amount of memory available for the logger instance.
6ae4b1c72625a8e5c369effea7f018b578d733c4vboxsync * @param pfnLogger Pointer to logger wrapper function for the clone.
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync * @param pfnFlush Pointer to flush function for the clone.
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync * @param fFlags Logger instance flags for the clone, a combination of the RTLOGFLAGS_* values.
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync * @param fDestFlags The destination flags.
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync */
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsyncRTDECL(int) RTLogCreateForR0(PRTLOGGER pLogger, size_t cbLogger, PFNRTLOGGER pfnLogger, PFNRTLOGFLUSH pfnFlush,
65b61798a61dd4c32cce448db1dac70bba8d5cf5vboxsync uint32_t fFlags, uint32_t fDestFlags)
585f64d6f624f9e683321dabeb21b0eb2e6aa473vboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Validate input.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync AssertPtrReturn(pLogger, VERR_INVALID_PARAMETER);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertReturn(cbLogger >= sizeof(*pLogger), VERR_INVALID_PARAMETER);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertReturn(pfnLogger, VERR_INVALID_PARAMETER);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertReturn(pfnFlush, VERR_INVALID_PARAMETER);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Initialize the ring-0 instance.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->offScratch = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->fPendingPrefix = false;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->pfnLogger = pfnLogger;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->pfnFlush = pfnFlush;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->hSpinMtx = NIL_RTSEMSPINMUTEX; /* Not serialized. */
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pLogger->u32Magic = RTLOGGER_MAGIC;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->fFlags = fFlags;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->fDestFlags = fDestFlags & ~RTLOGDEST_FILE;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->File = NIL_RTFILE;
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync pLogger->pszFilename = NULL;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->papszGroups = NULL;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->cMaxGroups = (uint32_t)((cbLogger - RT_OFFSETOF(RTLOGGER, afGroups[0])) / sizeof(pLogger->afGroups[0]));
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync pLogger->cGroups = 1;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->afGroups[0] = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRT_EXPORT_SYMBOL(RTLogCreateForR0);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* IN_RING3 */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Copies the group settings and flags from logger instance to another.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @returns IPRT status code.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pDstLogger The destination logger instance.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pSrcLogger The source logger instance. If NULL the default one is used.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param fFlagsOr OR mask for the flags.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param fFlagsAnd AND mask for the flags.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRTDECL(int) RTLogCopyGroupsAndFlags(PRTLOGGER pDstLogger, PCRTLOGGER pSrcLogger, unsigned fFlagsOr, unsigned fFlagsAnd)
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync unsigned cGroups;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
5b6e2c9a765c3c72295acc15791af8a700746956vboxsync * Validate input.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtrReturn(pDstLogger, VERR_INVALID_PARAMETER);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertPtrNullReturn(pSrcLogger, VERR_INVALID_PARAMETER);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Resolve defaults.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync if (!pSrcLogger)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pSrcLogger = RTLogDefaultInstance();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!pSrcLogger)
e17bd6c32a8dd64f2d42838f9028216465e2caf0vboxsync {
5ace91141404400247438502a84a418fba00c8cfvboxsync pDstLogger->fFlags |= RTLOGFLAGS_DISABLED;
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync pDstLogger->cGroups = 1;
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync pDstLogger->afGroups[0] = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
5ace91141404400247438502a84a418fba00c8cfvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Copy flags and group settings.
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync */
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pDstLogger->fFlags = (pSrcLogger->fFlags & fFlagsAnd) | fFlagsOr;
e17bd6c32a8dd64f2d42838f9028216465e2caf0vboxsync
e17bd6c32a8dd64f2d42838f9028216465e2caf0vboxsync rc = VINF_SUCCESS;
e17bd6c32a8dd64f2d42838f9028216465e2caf0vboxsync cGroups = pSrcLogger->cGroups;
e17bd6c32a8dd64f2d42838f9028216465e2caf0vboxsync if (cGroups < pDstLogger->cMaxGroups)
08bc90fc2848c80bf8270bedc883745b8398e186vboxsync {
e17bd6c32a8dd64f2d42838f9028216465e2caf0vboxsync AssertMsgFailed(("cMaxGroups=%zd cGroups=%zd (min size %d)\n", pDstLogger->cMaxGroups,
e17bd6c32a8dd64f2d42838f9028216465e2caf0vboxsync pSrcLogger->cGroups, RT_OFFSETOF(RTLOGGER, afGroups[pSrcLogger->cGroups])));
e17bd6c32a8dd64f2d42838f9028216465e2caf0vboxsync rc = VERR_INVALID_PARAMETER;
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync cGroups = pDstLogger->cMaxGroups;
e17bd6c32a8dd64f2d42838f9028216465e2caf0vboxsync }
e17bd6c32a8dd64f2d42838f9028216465e2caf0vboxsync memcpy(&pDstLogger->afGroups[0], &pSrcLogger->afGroups[0], cGroups * sizeof(pDstLogger->afGroups[0]));
5ace91141404400247438502a84a418fba00c8cfvboxsync pDstLogger->cGroups = cGroups;
5ace91141404400247438502a84a418fba00c8cfvboxsync
5ace91141404400247438502a84a418fba00c8cfvboxsync return rc;
5ace91141404400247438502a84a418fba00c8cfvboxsync}
5ace91141404400247438502a84a418fba00c8cfvboxsyncRT_EXPORT_SYMBOL(RTLogCopyGroupsAndFlags);
5ace91141404400247438502a84a418fba00c8cfvboxsync
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
49748bb305bd71f672cd083af208f4bb08c5d6abvboxsync * Flushes the buffer in one logger instance onto another logger.
49748bb305bd71f672cd083af208f4bb08c5d6abvboxsync *
49748bb305bd71f672cd083af208f4bb08c5d6abvboxsync * @returns iprt status code.
49748bb305bd71f672cd083af208f4bb08c5d6abvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pSrcLogger The logger instance to flush.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pDstLogger The logger instance to flush onto.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * If NULL the default logger will be used.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRTDECL(void) RTLogFlushToLogger(PRTLOGGER pSrcLogger, PRTLOGGER pDstLogger)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Resolve defaults.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!pDstLogger)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pDstLogger = RTLogDefaultInstance();
b9ca93dd1ad44cb8b27679dc5624be2f7b7f7af5vboxsync if (!pDstLogger)
b9ca93dd1ad44cb8b27679dc5624be2f7b7f7af5vboxsync {
b9ca93dd1ad44cb8b27679dc5624be2f7b7f7af5vboxsync /* flushing to "/dev/null". */
b9ca93dd1ad44cb8b27679dc5624be2f7b7f7af5vboxsync if (pSrcLogger->offScratch)
b9ca93dd1ad44cb8b27679dc5624be2f7b7f7af5vboxsync {
b9ca93dd1ad44cb8b27679dc5624be2f7b7f7af5vboxsync int rc = rtlogLock(pSrcLogger);
7c3417bbf525c03163d54d151a277a981d5d61b6vboxsync if (RT_SUCCESS(rc))
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync {
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync pSrcLogger->offScratch = 0;
8b984478b755f4d3091b977d9beac9fb7434279fvboxsync rtlogLock(pSrcLogger);
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync }
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync }
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync return;
51d4024e2984de499ecd878341898f71f55cf9e0vboxsync }
8b984478b755f4d3091b977d9beac9fb7434279fvboxsync }
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync /*
e9a217d585085a6a6d129d27ca0d96a1b8e6d0eevboxsync * Any thing to flush?
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync if ( pSrcLogger->offScratch
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync || pDstLogger->offScratch)
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Acquire logger semaphores.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = rtlogLock(pDstLogger);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_FAILURE(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = rtlogLock(pSrcLogger);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_SUCCESS(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Write whatever the GC instance contains to the HC one, and then
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * flush the HC instance.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pSrcLogger->offScratch)
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rtLogOutput(pDstLogger, pSrcLogger->achScratch, pSrcLogger->offScratch);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rtLogOutput(pDstLogger, NULL, 0);
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync pSrcLogger->offScratch = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Release the semaphores.
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rtlogUnlock(pSrcLogger);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rtlogUnlock(pDstLogger);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRT_EXPORT_SYMBOL(RTLogFlushToLogger);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync * Sets the custom prefix callback.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @returns IPRT status code.
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync * @param pLogger The logger instance.
1a25adaca81841abf5e6cdfed02eaff64941357dvboxsync * @param pfnCallback The callback.
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync * @param pvUser The user argument for the callback.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRTDECL(int) RTLogSetCustomPrefixCallback(PRTLOGGER pLogger, PFNRTLOGPREFIX pfnCallback, void *pvUser)
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync{
3964eef78ab9593263a3a982e26216d4d166869cvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Resolve defaults.
f02b41a7e54fc4e6b714f4e60260d94614d6e2e7vboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!pLogger)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
5b6e2c9a765c3c72295acc15791af8a700746956vboxsync pLogger = RTLogDefaultInstance();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!pLogger)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertReturn(pLogger->u32Magic == RTLOGGER_MAGIC, VERR_INVALID_MAGIC);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
5b6e2c9a765c3c72295acc15791af8a700746956vboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Do the work.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rtlogLock(pLogger);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->pvPrefixUserArg = pvUser;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->pfnPrefix = pfnCallback;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rtlogUnlock(pLogger);
688b55d5387d8b7c508d30141fe1a96eadecb988vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VINF_SUCCESS;
b3547e42ce5221377866e3fa041b3086b7cc1562vboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRT_EXPORT_SYMBOL(RTLogSetCustomPrefixCallback);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Matches a group name with a pattern mask in an case insensitive manner (ASCII).
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @returns true if matching and *ppachMask set to the end of the pattern.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @returns false if no match.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pszGrp The group name.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param ppachMask Pointer to the pointer to the mask. Only wildcard supported is '*'.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param cchMask The length of the mask, including modifiers. The modifiers is why
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * we update *ppachMask on match.
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic bool rtlogIsGroupMatching(const char *pszGrp, const char **ppachMask, size_t cchMask)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const char *pachMask;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync if (!pszGrp || !*pszGrp)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return false;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pachMask = *ppachMask;
5ace91141404400247438502a84a418fba00c8cfvboxsync for (;;)
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync {
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync if (RT_C_TO_LOWER(*pszGrp) != RT_C_TO_LOWER(*pachMask))
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync {
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync const char *pszTmp;
5ace91141404400247438502a84a418fba00c8cfvboxsync
5ace91141404400247438502a84a418fba00c8cfvboxsync /*
5ace91141404400247438502a84a418fba00c8cfvboxsync * Check for wildcard and do a minimal match if found.
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync */
5ace91141404400247438502a84a418fba00c8cfvboxsync if (*pachMask != '*')
5ace91141404400247438502a84a418fba00c8cfvboxsync return false;
3123bb2477edc752585e4bbd8e4cfedaf87997d1vboxsync
247b55faa8d054157f2481e68caca36f4dc9542cvboxsync /* eat '*'s. */
247b55faa8d054157f2481e68caca36f4dc9542cvboxsync do pachMask++;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync while (--cchMask && *pachMask == '*');
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* is there more to match? */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ( !cchMask
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync || *pachMask == '.'
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync || *pachMask == '=')
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break; /* we're good */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* do extremely minimal matching (fixme) */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pszTmp = strchr(pszGrp, RT_C_TO_LOWER(*pachMask));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!pszTmp)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pszTmp = strchr(pszGrp, RT_C_TO_UPPER(*pachMask));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!pszTmp)
0975ae0a0fb615c945150c48e4a73187c1f4f84dvboxsync return false;
78a205e3fc6719d59e8c561b3d287d3a4f879852vboxsync pszGrp = pszTmp;
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync continue;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
0975ae0a0fb615c945150c48e4a73187c1f4f84dvboxsync
3241f1be564f7351b07ce8a807673fa77a7847bcvboxsync /* done? */
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync if (!*++pszGrp)
3241f1be564f7351b07ce8a807673fa77a7847bcvboxsync {
0975ae0a0fb615c945150c48e4a73187c1f4f84dvboxsync /* trailing wildcard is ok. */
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync do
0975ae0a0fb615c945150c48e4a73187c1f4f84dvboxsync {
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync pachMask++;
78a205e3fc6719d59e8c561b3d287d3a4f879852vboxsync cchMask--;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync } while (cchMask && *pachMask == '*');
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync if ( !cchMask
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync || *pachMask == '.'
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync || *pachMask == '=')
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync break; /* we're good */
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync return false;
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync if (!--cchMask)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return false;
5cf54b3ffeb7ee90685dcaec329ef71a729f5947vboxsync pachMask++;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
688b55d5387d8b7c508d30141fe1a96eadecb988vboxsync
5cf54b3ffeb7ee90685dcaec329ef71a729f5947vboxsync /* match */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *ppachMask = pachMask;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return true;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Updates the group settings for the logger instance using the specified
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * specification string.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @returns iprt status code.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Failures can safely be ignored.
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync * @param pLogger Logger instance.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pszVar Value to parse.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsyncRTDECL(int) RTLogGroupSettings(PRTLOGGER pLogger, const char *pszVar)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Resolve defaults.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync if (!pLogger)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger = RTLogDefaultInstance();
247b55faa8d054157f2481e68caca36f4dc9542cvboxsync if (!pLogger)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Iterate the string.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync while (*pszVar)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Skip prefixes (blanks, ;, + and -).
0975ae0a0fb615c945150c48e4a73187c1f4f84dvboxsync */
3241f1be564f7351b07ce8a807673fa77a7847bcvboxsync bool fEnabled = true;
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync char ch;
3241f1be564f7351b07ce8a807673fa77a7847bcvboxsync const char *pszStart;
0975ae0a0fb615c945150c48e4a73187c1f4f84dvboxsync unsigned i;
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync size_t cch;
0975ae0a0fb615c945150c48e4a73187c1f4f84dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync while ((ch = *pszVar) == '+' || ch == '-' || ch == ' ' || ch == '\t' || ch == '\n' || ch == ';')
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (ch == '+' || ch == '-' || ';')
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync fEnabled = ch != '-';
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pszVar++;
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync }
1a25adaca81841abf5e6cdfed02eaff64941357dvboxsync if (!*pszVar)
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
3e6d3b0af632bdcd931b5149915c7b8be1a732cdvboxsync * Find end.
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync */
a11c569636fa6838bd423f4631a9660a5a84204bvboxsync pszStart = pszVar;
5b6e2c9a765c3c72295acc15791af8a700746956vboxsync while ((ch = *pszVar) != '\0' && ch != '+' && ch != '-' && ch != ' ' && ch != '\t')
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pszVar++;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
5cf54b3ffeb7ee90685dcaec329ef71a729f5947vboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Find the group (ascii case insensitive search).
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Special group 'all'.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync cch = pszVar - pszStart;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ( cch >= 3
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && (pszStart[0] == 'a' || pszStart[0] == 'A')
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && (pszStart[1] == 'l' || pszStart[1] == 'L')
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && (pszStart[2] == 'l' || pszStart[2] == 'L')
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && (cch == 3 || pszStart[3] == '.' || pszStart[3] == '='))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * All.
688b55d5387d8b7c508d30141fe1a96eadecb988vboxsync */
5cf54b3ffeb7ee90685dcaec329ef71a729f5947vboxsync unsigned fFlags = cch == 3
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ? RTLOGGRPFLAGS_ENABLED | RTLOGGRPFLAGS_LEVEL_1
b3547e42ce5221377866e3fa041b3086b7cc1562vboxsync : rtlogGroupFlags(&pszStart[3]);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (i = 0; i < pLogger->cGroups; i++)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (fEnabled)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->afGroups[i] |= fFlags;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->afGroups[i] &= ~fFlags;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Specific group(s).
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (i = 0; i < pLogger->cGroups; i++)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const char *psz2 = (const char*)pszStart;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (rtlogIsGroupMatching(pLogger->papszGroups[i], &psz2, cch))
5b6e2c9a765c3c72295acc15791af8a700746956vboxsync {
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync unsigned fFlags = RTLOGGRPFLAGS_ENABLED | RTLOGGRPFLAGS_LEVEL_1;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (*psz2 == '.' || *psz2 == '=')
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync fFlags = rtlogGroupFlags(psz2);
5ace91141404400247438502a84a418fba00c8cfvboxsync if (fEnabled)
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pLogger->afGroups[i] |= fFlags;
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync else
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync pLogger->afGroups[i] &= ~fFlags;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
14dfd448b0f1b9a46c4a4658a77752cb7561cd47vboxsync } /* for each group */
6778b34cb96bef0fef23ebc461eb6a429d2907c5vboxsync }
6778b34cb96bef0fef23ebc461eb6a429d2907c5vboxsync
6778b34cb96bef0fef23ebc461eb6a429d2907c5vboxsync } /* parse specification */
6778b34cb96bef0fef23ebc461eb6a429d2907c5vboxsync
6778b34cb96bef0fef23ebc461eb6a429d2907c5vboxsync return VINF_SUCCESS;
6778b34cb96bef0fef23ebc461eb6a429d2907c5vboxsync}
6778b34cb96bef0fef23ebc461eb6a429d2907c5vboxsyncRT_EXPORT_SYMBOL(RTLogGroupSettings);
6778b34cb96bef0fef23ebc461eb6a429d2907c5vboxsync
b5b12033c1f7eaf82b038f06e2b9e464b9ddd8d2vboxsync
d4b98dbce4cf7b3694b62d62a47553d399718dccvboxsync/**
d4b98dbce4cf7b3694b62d62a47553d399718dccvboxsync * Interprets the group flags suffix.
d4b98dbce4cf7b3694b62d62a47553d399718dccvboxsync *
d4b98dbce4cf7b3694b62d62a47553d399718dccvboxsync * @returns Flags specified. (0 is possible!)
d4b98dbce4cf7b3694b62d62a47553d399718dccvboxsync * @param psz Start of Suffix. (Either dot or equal sign.)
d4b98dbce4cf7b3694b62d62a47553d399718dccvboxsync */
d4b98dbce4cf7b3694b62d62a47553d399718dccvboxsyncstatic unsigned rtlogGroupFlags(const char *psz)
97b2abd2828499b2f4c2d5721952c9570ced1ebcvboxsync{
97b2abd2828499b2f4c2d5721952c9570ced1ebcvboxsync unsigned fFlags = 0;
fd69ca9bd8b533bfa9ade45c1c2ff3116854e84avboxsync
fd69ca9bd8b533bfa9ade45c1c2ff3116854e84avboxsync /*
fd69ca9bd8b533bfa9ade45c1c2ff3116854e84avboxsync * Litteral flags.
fd69ca9bd8b533bfa9ade45c1c2ff3116854e84avboxsync */
fd69ca9bd8b533bfa9ade45c1c2ff3116854e84avboxsync while (*psz == '.')
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync {
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync static struct
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync {
fd69ca9bd8b533bfa9ade45c1c2ff3116854e84avboxsync const char *pszFlag; /* lowercase!! */
5ace91141404400247438502a84a418fba00c8cfvboxsync unsigned fFlag;
5ace91141404400247438502a84a418fba00c8cfvboxsync } aFlags[] =
5a12b9772d9cf396a0ba7f54db399817ba7a65bavboxsync {
5ace91141404400247438502a84a418fba00c8cfvboxsync { "eo", RTLOGGRPFLAGS_ENABLED },
5a12b9772d9cf396a0ba7f54db399817ba7a65bavboxsync { "enabledonly",RTLOGGRPFLAGS_ENABLED },
5ace91141404400247438502a84a418fba00c8cfvboxsync { "e", RTLOGGRPFLAGS_ENABLED | RTLOGGRPFLAGS_LEVEL_1 },
5ace91141404400247438502a84a418fba00c8cfvboxsync { "enabled", RTLOGGRPFLAGS_ENABLED | RTLOGGRPFLAGS_LEVEL_1 },
5ace91141404400247438502a84a418fba00c8cfvboxsync { "l1", RTLOGGRPFLAGS_LEVEL_1 },
5ace91141404400247438502a84a418fba00c8cfvboxsync { "level1", RTLOGGRPFLAGS_LEVEL_1 },
5ace91141404400247438502a84a418fba00c8cfvboxsync { "l", RTLOGGRPFLAGS_LEVEL_2 },
5ace91141404400247438502a84a418fba00c8cfvboxsync { "l2", RTLOGGRPFLAGS_LEVEL_2 },
5ace91141404400247438502a84a418fba00c8cfvboxsync { "level2", RTLOGGRPFLAGS_LEVEL_2 },
5ace91141404400247438502a84a418fba00c8cfvboxsync { "l3", RTLOGGRPFLAGS_LEVEL_3 },
5ace91141404400247438502a84a418fba00c8cfvboxsync { "level3", RTLOGGRPFLAGS_LEVEL_3 },
5ace91141404400247438502a84a418fba00c8cfvboxsync { "l4", RTLOGGRPFLAGS_LEVEL_4 },
5ace91141404400247438502a84a418fba00c8cfvboxsync { "level4", RTLOGGRPFLAGS_LEVEL_4 },
5a12b9772d9cf396a0ba7f54db399817ba7a65bavboxsync { "l5", RTLOGGRPFLAGS_LEVEL_5 },
5a12b9772d9cf396a0ba7f54db399817ba7a65bavboxsync { "level5", RTLOGGRPFLAGS_LEVEL_5 },
5ace91141404400247438502a84a418fba00c8cfvboxsync { "l6", RTLOGGRPFLAGS_LEVEL_6 },
5ace91141404400247438502a84a418fba00c8cfvboxsync { "level6", RTLOGGRPFLAGS_LEVEL_6 },
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync { "f", RTLOGGRPFLAGS_FLOW },
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync { "flow", RTLOGGRPFLAGS_FLOW },
5ace91141404400247438502a84a418fba00c8cfvboxsync
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync { "lelik", RTLOGGRPFLAGS_LELIK },
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync { "michael", RTLOGGRPFLAGS_MICHAEL },
5ace91141404400247438502a84a418fba00c8cfvboxsync { "dmik", RTLOGGRPFLAGS_DMIK },
5ace91141404400247438502a84a418fba00c8cfvboxsync { "sunlover", RTLOGGRPFLAGS_SUNLOVER },
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync { "achim", RTLOGGRPFLAGS_ACHIM },
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync { "achimha", RTLOGGRPFLAGS_ACHIM },
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync { "s", RTLOGGRPFLAGS_SANDER },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "sander", RTLOGGRPFLAGS_SANDER },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "sandervl", RTLOGGRPFLAGS_SANDER },
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync { "klaus", RTLOGGRPFLAGS_KLAUS },
0f5d1b2abd9e82c7ee46f1327287c44856604bcbvboxsync { "frank", RTLOGGRPFLAGS_FRANK },
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync { "b", RTLOGGRPFLAGS_BIRD },
5ace91141404400247438502a84a418fba00c8cfvboxsync { "bird", RTLOGGRPFLAGS_BIRD },
f8b934f4817639cddebe4d3c2ae25d39a91fe448vboxsync { "aleksey", RTLOGGRPFLAGS_ALEKSEY },
20a793635760c71752932fde640ba328cab84348vboxsync { "dj", RTLOGGRPFLAGS_DJ },
5ace91141404400247438502a84a418fba00c8cfvboxsync { "n", RTLOGGRPFLAGS_NONAME },
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync { "noname", RTLOGGRPFLAGS_NONAME }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync };
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync unsigned i;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync bool fFound = false;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync psz++;
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync for (i = 0; i < RT_ELEMENTS(aFlags) && !fFound; i++)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync const char *psz1 = aFlags[i].pszFlag;
5ace91141404400247438502a84a418fba00c8cfvboxsync const char *psz2 = psz;
5ace91141404400247438502a84a418fba00c8cfvboxsync while (*psz1 == RT_C_TO_LOWER(*psz2))
5ace91141404400247438502a84a418fba00c8cfvboxsync {
5ace91141404400247438502a84a418fba00c8cfvboxsync psz1++;
5ace91141404400247438502a84a418fba00c8cfvboxsync psz2++;
5ace91141404400247438502a84a418fba00c8cfvboxsync if (!*psz1)
5ace91141404400247438502a84a418fba00c8cfvboxsync {
5ace91141404400247438502a84a418fba00c8cfvboxsync if ( (*psz2 >= 'a' && *psz2 <= 'z')
5ace91141404400247438502a84a418fba00c8cfvboxsync || (*psz2 >= 'A' && *psz2 <= 'Z')
5ace91141404400247438502a84a418fba00c8cfvboxsync || (*psz2 >= '0' && *psz2 <= '9') )
5ace91141404400247438502a84a418fba00c8cfvboxsync break;
fcc2858fa3a0ee65ec8426cd4caeeaa7d87bbfa4vboxsync fFlags |= aFlags[i].fFlag;
fcc2858fa3a0ee65ec8426cd4caeeaa7d87bbfa4vboxsync fFound = true;
fcc2858fa3a0ee65ec8426cd4caeeaa7d87bbfa4vboxsync psz = psz2;
5ace91141404400247438502a84a418fba00c8cfvboxsync break;
5ace91141404400247438502a84a418fba00c8cfvboxsync }
5ace91141404400247438502a84a418fba00c8cfvboxsync } /* strincmp */
5ace91141404400247438502a84a418fba00c8cfvboxsync } /* for each flags */
5ace91141404400247438502a84a418fba00c8cfvboxsync }
5ace91141404400247438502a84a418fba00c8cfvboxsync
5ace91141404400247438502a84a418fba00c8cfvboxsync /*
5ace91141404400247438502a84a418fba00c8cfvboxsync * Flag value.
5ace91141404400247438502a84a418fba00c8cfvboxsync */
5ace91141404400247438502a84a418fba00c8cfvboxsync if (*psz == '=')
5ace91141404400247438502a84a418fba00c8cfvboxsync {
5ace91141404400247438502a84a418fba00c8cfvboxsync psz++;
5ace91141404400247438502a84a418fba00c8cfvboxsync if (*psz == '~')
5b6e2c9a765c3c72295acc15791af8a700746956vboxsync fFlags = ~RTStrToInt32(psz + 1);
b5b12033c1f7eaf82b038f06e2b9e464b9ddd8d2vboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync fFlags = RTStrToInt32(psz);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return fFlags;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync * Helper for RTLogGetGroupSettings.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsyncstatic int rtLogGetGroupSettingsAddOne(const char *pszName, uint32_t fGroup, char **ppszBuf, size_t *pcchBuf, bool *pfNotFirst)
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#define APPEND_PSZ(psz,cch) do { memcpy(*ppszBuf, (psz), (cch)); *ppszBuf += (cch); *pcchBuf -= (cch); } while (0)
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync#define APPEND_SZ(sz) APPEND_PSZ(sz, sizeof(sz) - 1)
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync#define APPEND_CH(ch) do { **ppszBuf = (ch); *ppszBuf += 1; *pcchBuf -= 1; } while (0)
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync
28c928d1100d3b6a6d3506224cae25ad04732f73vboxsync /*
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync * Add the name.
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync */
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync size_t cchName = strlen(pszName);
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync if (cchName + 1 + *pfNotFirst > *pcchBuf)
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync return VERR_BUFFER_OVERFLOW;
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync if (*pfNotFirst)
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync APPEND_CH(' ');
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync else
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync *pfNotFirst = true;
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync APPEND_PSZ(pszName, cchName);
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync
28c928d1100d3b6a6d3506224cae25ad04732f73vboxsync /*
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync * Only generate mnemonics for the simple+common bits.
5ace91141404400247438502a84a418fba00c8cfvboxsync */
5ace91141404400247438502a84a418fba00c8cfvboxsync if (fGroup == (RTLOGGRPFLAGS_ENABLED | RTLOGGRPFLAGS_LEVEL_1))
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync /* nothing */;
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync else if ( fGroup == (RTLOGGRPFLAGS_ENABLED | RTLOGGRPFLAGS_LEVEL_1 | RTLOGGRPFLAGS_LEVEL_2 | RTLOGGRPFLAGS_FLOW)
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync && *pcchBuf >= sizeof(".e.l.f"))
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync APPEND_SZ(".e.l.f");
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync else if ( fGroup == (RTLOGGRPFLAGS_ENABLED | RTLOGGRPFLAGS_LEVEL_1 | RTLOGGRPFLAGS_FLOW)
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync && *pcchBuf >= sizeof(".e.f"))
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync APPEND_SZ(".e.f");
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync else if (*pcchBuf >= 1 + 10 + 1)
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync {
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync size_t cch;
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync APPEND_CH('=');
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync cch = RTStrFormatNumber(*ppszBuf, fGroup, 16, 0, 0, RTSTR_F_SPECIAL | RTSTR_F_32BIT);
09e2f92b8f54aa362088e216007b53ecdb42e283vboxsync *ppszBuf += cch;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *pcchBuf -= cch;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
5b6e2c9a765c3c72295acc15791af8a700746956vboxsync return VERR_BUFFER_OVERFLOW;
08bc90fc2848c80bf8270bedc883745b8398e186vboxsync
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync#undef APPEND_PSZ
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync#undef APPEND_SZ
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#undef APPEND_CH
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VINF_SUCCESS;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync}
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync/**
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync * Get the current log group settings as a string.
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync *
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync * @returns VINF_SUCCESS or VERR_BUFFER_OVERFLOW.
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync * @param pLogger Logger instance (NULL for default logger).
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync * @param pszBuf The output buffer.
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync * @param cchBuf The size of the output buffer. Must be greater
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync * than zero.
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync */
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsyncRTDECL(int) RTLogGetGroupSettings(PRTLOGGER pLogger, char *pszBuf, size_t cchBuf)
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync{
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync bool fNotFirst = false;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync int rc = VINF_SUCCESS;
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync uint32_t cGroups;
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync uint32_t fGroup;
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync uint32_t i;
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync Assert(cchBuf);
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync /*
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync * Resolve defaults.
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync */
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync if (!pLogger)
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync {
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync pLogger = RTLogDefaultInstance();
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync if (!pLogger)
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync {
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync *pszBuf = '\0';
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync return VINF_SUCCESS;
0f5b937bdc21496925500f3ce418794a5a9a1351vboxsync }
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync }
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync cGroups = pLogger->cGroups;
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync /*
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync * Check if all are the same.
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync */
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync fGroup = pLogger->afGroups[0];
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync for (i = 1; i < cGroups; i++)
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync if (pLogger->afGroups[i] != fGroup)
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync break;
74735ec6edd6640eebac8885fbb2dadc86b89cf5vboxsync if (i >= cGroups)
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync rc = rtLogGetGroupSettingsAddOne("all", fGroup, &pszBuf, &cchBuf, &fNotFirst);
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync else
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync {
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync /*
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync * Iterate all the groups and print all that are enabled.
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync */
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync for (i = 0; i < cGroups; i++)
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync {
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync fGroup = pLogger->afGroups[i];
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync if (fGroup)
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync {
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync const char *pszName = pLogger->papszGroups[i];
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync if (pszName)
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync {
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync rc = rtLogGetGroupSettingsAddOne(pszName, fGroup, &pszBuf, &cchBuf, &fNotFirst);
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync if (rc)
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync break;
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync }
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync }
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync }
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync }
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync *pszBuf = '\0';
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync return rc;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRT_EXPORT_SYMBOL(RTLogGetGroupSettings);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* !IN_RC */
0f5d1b2abd9e82c7ee46f1327287c44856604bcbvboxsync
bc8991845b5bd7e98758795748d3d76408756793vboxsync
c20b837b2c912dd4dcaaa676e15acd2b230108f0vboxsync/**
0f5d1b2abd9e82c7ee46f1327287c44856604bcbvboxsync * Updates the flags for the logger instance using the specified
0f5d1b2abd9e82c7ee46f1327287c44856604bcbvboxsync * specification string.
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync *
3cbb4f9a6a320e58ed398ef7aaa004cc8727abc5vboxsync * @returns iprt status code.
0f5d1b2abd9e82c7ee46f1327287c44856604bcbvboxsync * Failures can safely be ignored.
0f5d1b2abd9e82c7ee46f1327287c44856604bcbvboxsync * @param pLogger Logger instance (NULL for default logger).
5b6e2c9a765c3c72295acc15791af8a700746956vboxsync * @param pszVar Value to parse.
b5b12033c1f7eaf82b038f06e2b9e464b9ddd8d2vboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRTDECL(int) RTLogFlags(PRTLOGGER pLogger, const char *pszVar)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync /*
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync * Resolve defaults.
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync */
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync if (!pLogger)
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync {
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync pLogger = RTLogDefaultInstance();
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync if (!pLogger)
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync return VINF_SUCCESS;
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync }
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync /*
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync * Iterate the string.
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync */
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync while (*pszVar)
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync {
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync /* check no prefix. */
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync bool fNo = false;
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync char ch;
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync unsigned i;
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync /* skip blanks. */
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync while (RT_C_IS_SPACE(*pszVar))
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync pszVar++;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync if (!*pszVar)
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync return rc;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync while ((ch = *pszVar) != '\0')
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync {
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync if (ch == 'n' && pszVar[1] == 'o')
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync {
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pszVar += 2;
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync fNo = !fNo;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync }
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync else if (ch == '+')
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync {
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pszVar++;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync fNo = true;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync }
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync else if (ch == '-' || ch == '!' || ch == '~')
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync {
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pszVar++;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync fNo = !fNo;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync }
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync else
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync break;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync }
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync
2460483cb9999f0b06ed7e595ffc8259007350b4vboxsync /* instruction. */
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync for (i = 0; i < RT_ELEMENTS(s_aLogFlags); i++)
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync {
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync if (!strncmp(pszVar, s_aLogFlags[i].pszInstr, s_aLogFlags[i].cchInstr))
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync {
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync if (fNo == s_aLogFlags[i].fInverted)
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pLogger->fFlags |= s_aLogFlags[i].fFlag;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync else
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pLogger->fFlags &= ~s_aLogFlags[i].fFlag;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pszVar += s_aLogFlags[i].cchInstr;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync break;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync }
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync }
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync /* unknown instruction? */
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync if (i >= RT_ELEMENTS(s_aLogFlags))
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync {
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync AssertMsgFailed(("Invalid flags! unknown instruction %.20s\n", pszVar));
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pszVar++;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync }
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync /* skip blanks and delimiters. */
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync while (RT_C_IS_SPACE(*pszVar) || *pszVar == ';')
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pszVar++;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync } /* while more environment variable value left */
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync return rc;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync}
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsyncRT_EXPORT_SYMBOL(RTLogFlags);
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync#ifndef IN_RC
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync/**
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync * Get the current log flags as a string.
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync *
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync * @returns VINF_SUCCESS or VERR_BUFFER_OVERFLOW.
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync * @param pLogger Logger instance (NULL for default logger).
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync * @param pszBuf The output buffer.
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync * @param cchBuf The size of the output buffer. Must be greater
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync * than zero.
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync */
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsyncRTDECL(int) RTLogGetFlags(PRTLOGGER pLogger, char *pszBuf, size_t cchBuf)
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync{
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync bool fNotFirst = false;
3ecd8008b81f02a04220705ae0033142af363280vboxsync int rc = VINF_SUCCESS;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync uint32_t fFlags;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync unsigned i;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync Assert(cchBuf);
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync /*
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync * Resolve defaults.
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync */
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync if (!pLogger)
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync {
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pLogger = RTLogDefaultInstance();
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync if (!pLogger)
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync {
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync *pszBuf = '\0';
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync return VINF_SUCCESS;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync }
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync }
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync /*
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync * Add the flags in the list.
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync */
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync fFlags = pLogger->fFlags;
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync for (i = 0; i < RT_ELEMENTS(s_aLogFlags); i++)
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync if ( !s_aLogFlags[i].fInverted
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync ? (s_aLogFlags[i].fFlag & fFlags)
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync : !(s_aLogFlags[i].fFlag & fFlags))
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync {
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync size_t cchInstr = s_aLogFlags[i].cchInstr;
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync if (cchInstr + fNotFirst + 1 > cchBuf)
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync {
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync rc = VERR_BUFFER_OVERFLOW;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync break;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync }
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync if (fNotFirst)
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync {
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync *pszBuf++ = ' ';
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync cchBuf--;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync }
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync memcpy(pszBuf, s_aLogFlags[i].pszInstr, cchInstr);
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pszBuf += cchInstr;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync cchBuf -= cchInstr;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync fNotFirst = true;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync }
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync *pszBuf = '\0';
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync return rc;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync}
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsyncRT_EXPORT_SYMBOL(RTLogGetFlags);
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync/**
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync * Updates the logger desination using the specified string.
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync *
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync * @returns VINF_SUCCESS or VERR_BUFFER_OVERFLOW.
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync * @param pLogger Logger instance (NULL for default logger).
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync * @param pszVar The value to parse.
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync */
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsyncRTDECL(int) RTLogDestinations(PRTLOGGER pLogger, char const *pszVar)
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync{
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync /*
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync * Resolve defaults.
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync */
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync if (!pLogger)
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync {
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pLogger = RTLogDefaultInstance();
3ecd8008b81f02a04220705ae0033142af363280vboxsync if (!pLogger)
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync return VINF_SUCCESS;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync }
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync /*
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync * Do the parsing.
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync */
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync while (*pszVar)
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync {
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync bool fNo;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync unsigned i;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync /* skip blanks. */
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync while (RT_C_IS_SPACE(*pszVar))
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pszVar++;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync if (!*pszVar)
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync break;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync /* check no prefix. */
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync fNo = false;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync if (pszVar[0] == 'n' && pszVar[1] == 'o')
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync {
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync fNo = true;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pszVar += 2;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync }
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync /* instruction. */
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync for (i = 0; i < RT_ELEMENTS(s_aLogDst); i++)
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync {
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync size_t cchInstr = strlen(s_aLogDst[i].pszInstr);
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync if (!strncmp(pszVar, s_aLogDst[i].pszInstr, cchInstr))
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync {
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync if (!fNo)
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pLogger->fDestFlags |= s_aLogDst[i].fFlag;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync else
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pLogger->fDestFlags &= ~s_aLogDst[i].fFlag;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pszVar += cchInstr;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync /* check for value. */
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync while (RT_C_IS_SPACE(*pszVar))
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pszVar++;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync if (*pszVar == '=' || *pszVar == ':')
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync {
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync const char *pszEnd;
2b5a4cf3d77ab62dcbd882115b6d497547b20d29vboxsync
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pszVar++;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pszEnd = strchr(pszVar, ';');
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync if (!pszEnd)
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pszEnd = strchr(pszVar, '\0');
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync#ifndef IN_RING0
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync size_t cch = pszEnd - pszVar;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync /* log file name */
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync if (i == 0 /* file */ && !fNo)
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync {
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync AssertReturn(cch < RTPATH_MAX, VERR_OUT_OF_RANGE);
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync memcpy(pLogger->pszFilename, pszVar, cch);
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pLogger->pszFilename[cch] = '\0';
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync }
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync /* log directory */
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync else if (i == 1 /* dir */ && !fNo)
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync {
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync char szTmp[RTPATH_MAX];
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync const char *pszFile = RTPathFilename(pLogger->pszFilename);
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync size_t cchFile = pszFile ? strlen(pszFile) : 0;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync AssertReturn(cchFile + cch + 1 < RTPATH_MAX, VERR_OUT_OF_RANGE);
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync memcpy(szTmp, cchFile ? pszFile : "", cchFile + 1);
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync memcpy(pLogger->pszFilename, pszVar, cch);
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pLogger->pszFilename[cch] = '\0';
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync RTPathStripTrailingSlash(pLogger->pszFilename);
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync cch = strlen(pLogger->pszFilename);
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pLogger->pszFilename[cch++] = '/';
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync memcpy(&pLogger->pszFilename[cch], szTmp, cchFile);
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pLogger->pszFilename[cch+cchFile] = '\0';
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync }
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync else
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync AssertMsgFailedReturn(("Invalid destination value! %s%s doesn't take a value!\n",
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync fNo ? "no" : "", s_aLogDst[i].pszInstr),
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync VERR_INVALID_PARAMETER);
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync#endif
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync pszVar = pszEnd + (*pszEnd != '\0');
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync }
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync /* assert known instruction */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertMsgReturn(i < RT_ELEMENTS(s_aLogDst),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ("Invalid destination value! unknown instruction %.20s\n", pszVar),
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync VERR_INVALID_PARAMETER);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* skip blanks and delimiters. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync while (RT_C_IS_SPACE(*pszVar) || *pszVar == ';')
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pszVar++;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync } /* while more environment variable value left */
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRT_EXPORT_SYMBOL(RTLogDestinations);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Get the current log destinations as a string.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @returns VINF_SUCCESS or VERR_BUFFER_OVERFLOW.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pLogger Logger instance (NULL for default logger).
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pszBuf The output buffer.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param cchBuf The size of the output buffer. Must be greater
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * than 0.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRTDECL(int) RTLogGetDestinations(PRTLOGGER pLogger, char *pszBuf, size_t cchBuf)
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync bool fNotFirst = false;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t fDestFlags;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync unsigned i;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(cchBuf);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Resolve defaults.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!pLogger)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger = RTLogDefaultInstance();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!pLogger)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *pszBuf = '\0';
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync return VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#define APPEND_PSZ(psz,cch) do { memcpy(pszBuf, (psz), (cch)); pszBuf += (cch); cchBuf -= (cch); } while (0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#define APPEND_SZ(sz) APPEND_PSZ(sz, sizeof(sz) - 1)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#define APPEND_CH(ch) do { *pszBuf++ = (ch); cchBuf--; } while (0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Add the flags in the list.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync fDestFlags = pLogger->fDestFlags;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (i = 2; i < RT_ELEMENTS(s_aLogDst); i++)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (s_aLogDst[i].fFlag & fDestFlags)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync size_t cchInstr = s_aLogDst[i].cchInstr;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (cchInstr + fNotFirst + 1 > cchBuf)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = VERR_BUFFER_OVERFLOW;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync if (fNotFirst)
6b022885f2cb6a55167609edecd89570cd80001dvboxsync APPEND_CH(' ');
b45d66c0e496e2fd861479202f3d43aad592bd14vboxsync fNotFirst = true;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync APPEND_PSZ(s_aLogDst[i].pszInstr, cchInstr);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Add the filename.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync if ( (fDestFlags & RTLOGDEST_FILE)
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync && VALID_PTR(pLogger->pszFilename)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && RT_SUCCESS(rc))
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync {
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync size_t cchFilename = strlen(pLogger->pszFilename);
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync if (cchFilename + sizeof("file=") - 1 + fNotFirst + 1 <= cchBuf)
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync {
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync if (fNotFirst)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync APPEND_SZ(" file=");
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync else
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync APPEND_SZ("file=");
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync APPEND_PSZ(pLogger->pszFilename, cchFilename);
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync }
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync else
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync rc = VERR_BUFFER_OVERFLOW;
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync }
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#undef APPEND_PSZ
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#undef APPEND_SZ
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync#undef APPEND_CH
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync *pszBuf = '\0';
8b03ab0bcd5c238021bc8a43d887dd9d0870c0f5vboxsync return rc;
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync}
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsyncRT_EXPORT_SYMBOL(RTLogGetDestinations);
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync#endif /* !IN_RC */
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync/**
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync * Flushes the specified logger.
8b03ab0bcd5c238021bc8a43d887dd9d0870c0f5vboxsync *
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync * @param pLogger The logger instance to flush.
8b03ab0bcd5c238021bc8a43d887dd9d0870c0f5vboxsync * If NULL the default instance is used. The default instance
8b03ab0bcd5c238021bc8a43d887dd9d0870c0f5vboxsync * will not be initialized by this call.
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync */
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsyncRTDECL(void) RTLogFlush(PRTLOGGER pLogger)
1ce20e84ae29a712029d1e213740388d7e158d5cvboxsync{
8b03ab0bcd5c238021bc8a43d887dd9d0870c0f5vboxsync /*
2885e130ed9e2da2cb7c2cced97ca1b5779d6e71vboxsync * Resolve defaults.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
2885e130ed9e2da2cb7c2cced97ca1b5779d6e71vboxsync if (!pLogger)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifdef IN_RC
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger = &g_Logger;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger = g_pLogger;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!pLogger)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Any thing to flush?
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync if (pLogger->offScratch)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef IN_RC
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Acquire logger instance sem.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc = rtlogLock(pLogger);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_FAILURE(rc))
e85d76a7e5a047db3cdc8576ff5f412c7b73bbabvboxsync return;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
e85d76a7e5a047db3cdc8576ff5f412c7b73bbabvboxsync /*
e85d76a7e5a047db3cdc8576ff5f412c7b73bbabvboxsync * Call worker.
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync */
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync rtlogFlush(pLogger);
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync
e85d76a7e5a047db3cdc8576ff5f412c7b73bbabvboxsync#ifndef IN_RC
e85d76a7e5a047db3cdc8576ff5f412c7b73bbabvboxsync /*
b55721e255f55546462b62c2d09259bb7bf8ef90vboxsync * Release the semaphore.
e85d76a7e5a047db3cdc8576ff5f412c7b73bbabvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rtlogUnlock(pLogger);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRT_EXPORT_SYMBOL(RTLogFlush);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync * Gets the default logger instance, creating it if necessary.
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync *
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync * @returns Pointer to default logger instance.
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync * @returns NULL if no default logger instance available.
8cdd041284cfe47b639146efec02846e20b67a0cvboxsync */
0f59af434918ae6ade24245a5f963e4f2618b89evboxsyncRTDECL(PRTLOGGER) RTLogDefaultInstance(void)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifdef IN_RC
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return &g_Logger;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
10e1bc06b2908a0af56d92ffdbadd25b36a5ef61vboxsync#else /* !IN_RC */
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync# ifdef IN_RING0
5db1d52ffbcaa46c3d944c6c2d9c552306817d9avboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Check per thread loggers first.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (g_cPerThreadLoggers)
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync {
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync const RTNATIVETHREAD Self = RTThreadNativeSelf();
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync int32_t i = RT_ELEMENTS(g_aPerThreadLoggers);
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync while (i-- > 0)
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync if (g_aPerThreadLoggers[i].NativeThread == Self)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return g_aPerThreadLoggers[i].pLogger;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# endif /* IN_RING0 */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * If no per thread logger, use the default one.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!g_pLogger)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync g_pLogger = RTLogDefaultInit();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return g_pLogger;
10e1bc06b2908a0af56d92ffdbadd25b36a5ef61vboxsync#endif /* !IN_RC */
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync}
5db1d52ffbcaa46c3d944c6c2d9c552306817d9avboxsyncRT_EXPORT_SYMBOL(RTLogDefaultInstance);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Gets the default logger instance.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @returns Pointer to default logger instance.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @returns NULL if no default logger instance available.
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync */
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsyncRTDECL(PRTLOGGER) RTLogGetDefaultInstance(void)
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync{
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync#ifdef IN_RC
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return &g_Logger;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync# ifdef IN_RING0
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync /*
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync * Check per thread loggers first.
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync */
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync if (g_cPerThreadLoggers)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const RTNATIVETHREAD Self = RTThreadNativeSelf();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int32_t i = RT_ELEMENTS(g_aPerThreadLoggers);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync while (i-- > 0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (g_aPerThreadLoggers[i].NativeThread == Self)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return g_aPerThreadLoggers[i].pLogger;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# endif /* IN_RING0 */
ec588a4ac8429a8b6c744544818b3ce3b2c75690vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return g_pLogger;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRT_EXPORT_SYMBOL(RTLogGetDefaultInstance);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef IN_RC
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Sets the default logger instance.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @returns iprt status code.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pLogger The new default logger instance.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRTDECL(PRTLOGGER) RTLogSetDefaultInstance(PRTLOGGER pLogger)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return (PRTLOGGER)ASMAtomicXchgPtr((void * volatile *)&g_pLogger, pLogger);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
abe73d9ccf5dd90fb1e3726792c56f2556a3d702vboxsyncRT_EXPORT_SYMBOL(RTLogSetDefaultInstance);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* !IN_RC */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifdef IN_RING0
74991d7531692858fd22acf371a7ee941567977cvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Changes the default logger instance for the current thread.
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync *
6b022885f2cb6a55167609edecd89570cd80001dvboxsync * @returns IPRT status code.
b45d66c0e496e2fd861479202f3d43aad592bd14vboxsync * @param pLogger The logger instance. Pass NULL for deregistration.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param uKey Associated key for cleanup purposes. If pLogger is NULL,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * all instances with this key will be deregistered. So in
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * order to only deregister the instance associated with the
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * current thread use 0.
e50404712a2b5234c42bdf9740bddab5729ba188vboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRTDECL(int) RTLogSetDefaultInstanceThread(PRTLOGGER pLogger, uintptr_t uKey)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTNATIVETHREAD Self = RTThreadNativeSelf();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger)
fa7355597d7eba5b4ca8a23056ebe1b8fb306fdbvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int32_t i;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync unsigned j;
74991d7531692858fd22acf371a7ee941567977cvboxsync
74991d7531692858fd22acf371a7ee941567977cvboxsync AssertReturn(pLogger->u32Magic == RTLOGGER_MAGIC, VERR_INVALID_MAGIC);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
57399ab65e2825c324fb9dcb4642d4ae2c232509vboxsync /*
3a21cbe769e7500039a2d17c794a911f7acb2dadvboxsync * Iterate the table to see if there is already an entry for this thread.
3a21cbe769e7500039a2d17c794a911f7acb2dadvboxsync */
3a21cbe769e7500039a2d17c794a911f7acb2dadvboxsync i = RT_ELEMENTS(g_aPerThreadLoggers);
3a21cbe769e7500039a2d17c794a911f7acb2dadvboxsync while (i-- > 0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (g_aPerThreadLoggers[i].NativeThread == Self)
1a25adaca81841abf5e6cdfed02eaff64941357dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ASMAtomicXchgPtr((void * volatile *)&g_aPerThreadLoggers[i].uKey, (void *)uKey);
3a21cbe769e7500039a2d17c794a911f7acb2dadvboxsync g_aPerThreadLoggers[i].pLogger = pLogger;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VINF_SUCCESS;
6863baa4d9788245537c986d9caf02fb1893d2c6vboxsync }
6863baa4d9788245537c986d9caf02fb1893d2c6vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Allocate a new table entry.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync i = ASMAtomicIncS32(&g_cPerThreadLoggers);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (i > (int32_t)RT_ELEMENTS(g_aPerThreadLoggers))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
74991d7531692858fd22acf371a7ee941567977cvboxsync ASMAtomicDecS32(&g_cPerThreadLoggers);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VERR_BUFFER_OVERFLOW; /* horrible error code! */
74991d7531692858fd22acf371a7ee941567977cvboxsync }
74991d7531692858fd22acf371a7ee941567977cvboxsync
74991d7531692858fd22acf371a7ee941567977cvboxsync for (j = 0; j < 10; j++)
74991d7531692858fd22acf371a7ee941567977cvboxsync {
74991d7531692858fd22acf371a7ee941567977cvboxsync i = RT_ELEMENTS(g_aPerThreadLoggers);
74991d7531692858fd22acf371a7ee941567977cvboxsync while (i-- > 0)
74991d7531692858fd22acf371a7ee941567977cvboxsync {
74991d7531692858fd22acf371a7ee941567977cvboxsync AssertCompile(sizeof(RTNATIVETHREAD) == sizeof(void*));
74991d7531692858fd22acf371a7ee941567977cvboxsync if ( g_aPerThreadLoggers[i].NativeThread == NIL_RTNATIVETHREAD
74991d7531692858fd22acf371a7ee941567977cvboxsync && ASMAtomicCmpXchgPtr((void * volatile *)&g_aPerThreadLoggers[i].NativeThread, (void *)Self, (void *)NIL_RTNATIVETHREAD))
74991d7531692858fd22acf371a7ee941567977cvboxsync {
74991d7531692858fd22acf371a7ee941567977cvboxsync ASMAtomicXchgPtr((void * volatile *)&g_aPerThreadLoggers[i].uKey, (void *)uKey);
74991d7531692858fd22acf371a7ee941567977cvboxsync ASMAtomicXchgPtr((void * volatile *)&g_aPerThreadLoggers[i].pLogger, pLogger);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ASMAtomicDecS32(&g_cPerThreadLoggers);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = VERR_INTERNAL_ERROR;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
0174432b2b1a760b89840ba696f7ba51def65dddvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Search the array for the current thread.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int32_t i = RT_ELEMENTS(g_aPerThreadLoggers);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync while (i-- > 0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ( g_aPerThreadLoggers[i].NativeThread == Self
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync || g_aPerThreadLoggers[i].uKey == uKey)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ASMAtomicXchgPtr((void * volatile *)&g_aPerThreadLoggers[i].uKey, NULL);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ASMAtomicXchgPtr((void * volatile *)&g_aPerThreadLoggers[i].pLogger, NULL);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ASMAtomicXchgPtr((void * volatile *)&g_aPerThreadLoggers[i].NativeThread, (void *)NIL_RTNATIVETHREAD);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ASMAtomicDecS32(&g_cPerThreadLoggers);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = VINF_SUCCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return rc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRT_EXPORT_SYMBOL(RTLogSetDefaultInstanceThread);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
0174432b2b1a760b89840ba696f7ba51def65dddvboxsync
0174432b2b1a760b89840ba696f7ba51def65dddvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Write to a logger instance.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pLogger Pointer to logger instance.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pszFormat Format string.
0174432b2b1a760b89840ba696f7ba51def65dddvboxsync * @param args Format arguments.
0174432b2b1a760b89840ba696f7ba51def65dddvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRTDECL(void) RTLogLoggerV(PRTLOGGER pLogger, const char *pszFormat, va_list args)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTLogLoggerExV(pLogger, 0, ~0U, pszFormat, args);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRT_EXPORT_SYMBOL(RTLogLoggerV);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Write to a logger instance.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * This function will check whether the instance, group and flags makes up a
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * logging kind which is currently enabled before writing anything to the log.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pLogger Pointer to logger instance. If NULL the default logger instance will be attempted.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param fFlags The logging flags.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param iGroup The group.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * The value ~0U is reserved for compatability with RTLogLogger[V] and is
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * only for internal usage!
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pszFormat Format string.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param args Format arguments.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRTDECL(void) RTLogLoggerExV(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup, const char *pszFormat, va_list args)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int rc;
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync
c33db29e7b41467a35675031f5f5233839909083vboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * A NULL logger means default instance.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!pLogger)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger = RTLogDefaultInstance();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!pLogger)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Validate and correct iGroup.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (iGroup != ~0U && iGroup >= pLogger->cGroups)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync iGroup = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * If no output, then just skip it.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ( (pLogger->fFlags & RTLOGFLAGS_DISABLED)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef IN_RC
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync || !pLogger->fDestFlags
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync || !pszFormat || !*pszFormat)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ( iGroup != ~0U
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && (pLogger->afGroups[iGroup] & (fFlags | RTLOGGRPFLAGS_ENABLED)) != (fFlags | RTLOGGRPFLAGS_ENABLED))
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync return;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Acquire logger instance sem.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rc = rtlogLock(pLogger);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (RT_FAILURE(rc))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifdef IN_RING0
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger->fDestFlags & ~RTLOGDEST_FILE)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rtR0LogLoggerExFallback(pLogger->fDestFlags, pLogger->fFlags, pszFormat, args);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Format the message and perhaps flush it.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger->fFlags & (RTLOGFLAGS_PREFIX_MASK | RTLOGFLAGS_USECRLF))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTLOGOUTPUTPREFIXEDARGS OutputArgs;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync OutputArgs.pLogger = pLogger;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync OutputArgs.iGroup = iGroup;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync OutputArgs.fFlags = fFlags;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTLogFormatV(rtLogOutputPrefixed, &OutputArgs, pszFormat, args);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTLogFormatV(rtLogOutput, pLogger, pszFormat, args);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ( !(pLogger->fFlags & RTLOGFLAGS_BUFFERED)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync && pLogger->offScratch)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rtlogFlush(pLogger);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync /*
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync * Release the semaphore.
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync */
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync rtlogUnlock(pLogger);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
10e1bc06b2908a0af56d92ffdbadd25b36a5ef61vboxsyncRT_EXPORT_SYMBOL(RTLogLoggerExV);
8f7bc6ad2b7bbcb4b3b96248cd2478e45f2e3b88vboxsync
5db1d52ffbcaa46c3d944c6c2d9c552306817d9avboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync#ifdef IN_RING0
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * For rtR0LogLoggerExFallbackOutput and rtR0LogLoggerExFallbackFlush.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsynctypedef struct RTR0LOGLOGGERFALLBACK
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** The current scratch buffer offset. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t offScratch;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** The destination flags. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t fDestFlags;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /** The scratch buffer. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync char achScratch[80];
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync} RTR0LOGLOGGERFALLBACK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/** Pointer to RTR0LOGLOGGERFALLBACK which is used by
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * rtR0LogLoggerExFallbackOutput. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsynctypedef RTR0LOGLOGGERFALLBACK *PRTR0LOGLOGGERFALLBACK;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync/**
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync * Flushes the fallback buffer.
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync *
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync * @param pThis The scratch buffer.
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync */
ec588a4ac8429a8b6c744544818b3ce3b2c75690vboxsyncstatic void rtR0LogLoggerExFallbackFlush(PRTR0LOGLOGGERFALLBACK pThis)
75fca099c974cbbd48f132af1378c60232614760vboxsync{
75fca099c974cbbd48f132af1378c60232614760vboxsync if (!pThis->offScratch)
75fca099c974cbbd48f132af1378c60232614760vboxsync return;
57f41f24b7a290eba73c63449f44017d7917561dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pThis->fDestFlags & RTLOGDEST_USER)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTLogWriteUser(pThis->achScratch, pThis->offScratch);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pThis->fDestFlags & RTLOGDEST_DEBUGGER)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTLogWriteDebugger(pThis->achScratch, pThis->offScratch);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pThis->fDestFlags & RTLOGDEST_STDOUT)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTLogWriteStdOut(pThis->achScratch, pThis->offScratch);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pThis->fDestFlags & RTLOGDEST_STDERR)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTLogWriteStdErr(pThis->achScratch, pThis->offScratch);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef LOG_NO_COM
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync if (pThis->fDestFlags & RTLOGDEST_COM)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTLogWriteCom(pThis->achScratch, pThis->offScratch);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* empty the buffer. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pThis->offScratch = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Callback for RTLogFormatV used by rtR0LogLoggerExFallback.
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync * See PFNLOGOUTPUT() for details.
c33db29e7b41467a35675031f5f5233839909083vboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(size_t) rtR0LogLoggerExFallbackOutput(void *pv, const char *pachChars, size_t cbChars)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PRTR0LOGLOGGERFALLBACK pThis = (PRTR0LOGLOGGERFALLBACK)pv;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (cbChars)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync size_t cbRet = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (;;)
a27fbcbb29ffc2196c2ebd0f2dad92f40c7ec65dvboxsync {
a27fbcbb29ffc2196c2ebd0f2dad92f40c7ec65dvboxsync /* how much */
10e1bc06b2908a0af56d92ffdbadd25b36a5ef61vboxsync uint32_t cb = sizeof(pThis->achScratch) - pThis->offScratch - 1; /* minus 1 - for the string terminator. */
315f443a509c31db47b8f5cb94d26e54c3d5c497vboxsync if (cb > cbChars)
5db1d52ffbcaa46c3d944c6c2d9c552306817d9avboxsync cb = (uint32_t)cbChars;
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync /* copy */
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync memcpy(&pThis->achScratch[pThis->offScratch], pachChars, cb);
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync /* advance */
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync pThis->offScratch += cb;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync cbRet += cb;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync cbChars -= cb;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* done? */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (cbChars <= 0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return cbRet;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync pachChars += cb;
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync /* flush */
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync pThis->achScratch[pThis->offScratch] = '\0';
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync rtR0LogLoggerExFallbackFlush(pThis);
ec588a4ac8429a8b6c744544818b3ce3b2c75690vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* won't ever get here! */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
75fca099c974cbbd48f132af1378c60232614760vboxsync else
75fca099c974cbbd48f132af1378c60232614760vboxsync {
75fca099c974cbbd48f132af1378c60232614760vboxsync /*
57f41f24b7a290eba73c63449f44017d7917561dvboxsync * Termination call, flush the log.
a3db4ff1e0aa7f94c9176ef16264df572eec0aebvboxsync */
a3db4ff1e0aa7f94c9176ef16264df572eec0aebvboxsync pThis->achScratch[pThis->offScratch] = '\0';
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rtR0LogLoggerExFallbackFlush(pThis);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return 0;
e16fc293d8bdb6174849b7b4c6f7d9ef5f03ea83vboxsync }
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync}
e16fc293d8bdb6174849b7b4c6f7d9ef5f03ea83vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Ring-0 fallback for cases where we're unable to grab the lock.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * This will happen when we're at a too high IRQL on Windows for instance and
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * needs to be dealt with or we'll drop a lot of log output. This fallback will
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * only output to some of the log destinations as a few of them may be doing
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * dangerouse things. We won't be doing any prefixing here either, at least not
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * for the present, because it's too much hazzle.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param fDestFlags The destination flags.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param fFlags The logger flags.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pszFormat The format string.
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync * @param va The format arguments.
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync */
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsyncstatic void rtR0LogLoggerExFallback(uint32_t fDestFlags, uint32_t fFlags, const char *pszFormat, va_list va)
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync{
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync RTR0LOGLOGGERFALLBACK This;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync This.fDestFlags = fDestFlags;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* fallback indicator. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync This.offScratch = 2;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync This.achScratch[0] = '[';
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync This.achScratch[1] = 'F';
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* selected prefixes */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (fFlags & RTLOGFLAGS_PREFIX_PID)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTPROCESS Process = RTProcSelf();
6b022885f2cb6a55167609edecd89570cd80001dvboxsync This.achScratch[This.offScratch++] = ' ';
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync This.offScratch += RTStrFormatNumber(&This.achScratch[This.offScratch], Process, 16, sizeof(RTPROCESS) * 2, 0, RTSTR_F_ZEROPAD);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (fFlags & RTLOGFLAGS_PREFIX_TID)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTNATIVETHREAD Thread = RTThreadNativeSelf();
09d4e754a010196fe0d9d972b6ccc005ecb8b116vboxsync This.achScratch[This.offScratch++] = ' ';
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync This.offScratch += RTStrFormatNumber(&This.achScratch[This.offScratch], Thread, 16, sizeof(RTNATIVETHREAD) * 2, 0, RTSTR_F_ZEROPAD);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
6ce4679e84cffad4a2867786f94632e1eb935b9dvboxsync This.achScratch[This.offScratch++] = ']';
d6b5539478863f176bfffefc1ada2b9489cfa092vboxsync This.achScratch[This.offScratch++] = ' ';
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTLogFormatV(rtR0LogLoggerExFallbackOutput, &This, pszFormat, va);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* IN_RING0 */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * vprintf like function for writing to the default log.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param pszFormat Printf like format string.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @param args Optional arguments as specified in pszFormat.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * @remark The API doesn't support formatting of floating point numbers at the moment.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRTDECL(void) RTLogPrintfV(const char *pszFormat, va_list args)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTLogLoggerV(NULL, pszFormat, args);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncRT_EXPORT_SYMBOL(RTLogPrintfV);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Writes the buffer to the given log device without checking for buffered
a27fbcbb29ffc2196c2ebd0f2dad92f40c7ec65dvboxsync * data or anything.
a27fbcbb29ffc2196c2ebd0f2dad92f40c7ec65dvboxsync * Used by the RTLogFlush() function.
10e1bc06b2908a0af56d92ffdbadd25b36a5ef61vboxsync *
315f443a509c31db47b8f5cb94d26e54c3d5c497vboxsync * @param pLogger The logger instance to write to. NULL is not allowed!
5db1d52ffbcaa46c3d944c6c2d9c552306817d9avboxsync */
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsyncstatic void rtlogFlush(PRTLOGGER pLogger)
3080f6c0871099df43a4e91b31894d9c2b1369a8vboxsync{
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync if (pLogger->offScratch == 0)
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync return; /* nothing to flush. */
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync#ifndef IN_RC
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger->fDestFlags & RTLOGDEST_USER)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTLogWriteUser(pLogger->achScratch, pLogger->offScratch);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger->fDestFlags & RTLOGDEST_DEBUGGER)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTLogWriteDebugger(pLogger->achScratch, pLogger->offScratch);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# ifdef IN_RING3
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync if (pLogger->fDestFlags & RTLOGDEST_FILE)
9b45880674da6f82ca27cc28b0272de3dd3cc7dfvboxsync RTFileWrite(pLogger->File, pLogger->achScratch, pLogger->offScratch, NULL);
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync# endif
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync if (pLogger->fDestFlags & RTLOGDEST_STDOUT)
ec588a4ac8429a8b6c744544818b3ce3b2c75690vboxsync RTLogWriteStdOut(pLogger->achScratch, pLogger->offScratch);
75fca099c974cbbd48f132af1378c60232614760vboxsync
75fca099c974cbbd48f132af1378c60232614760vboxsync if (pLogger->fDestFlags & RTLOGDEST_STDERR)
75fca099c974cbbd48f132af1378c60232614760vboxsync RTLogWriteStdErr(pLogger->achScratch, pLogger->offScratch);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# if (defined(IN_RING0) || defined(IN_RC)) && !defined(LOG_NO_COM)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger->fDestFlags & RTLOGDEST_COM)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTLogWriteCom(pLogger->achScratch, pLogger->offScratch);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# endif
00599f6d39cc25ca39845c2433cd75de7b9f6971vboxsync#endif /* !IN_RC */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger->pfnFlush)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->pfnFlush(pLogger);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* empty the buffer. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->offScratch = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
6b022885f2cb6a55167609edecd89570cd80001dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Callback for RTLogFormatV which writes to the com port.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * See PFNLOGOUTPUT() for details.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(size_t) rtLogOutput(void *pv, const char *pachChars, size_t cbChars)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PRTLOGGER pLogger = (PRTLOGGER)pv;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (cbChars)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync size_t cbRet = 0;
09d4e754a010196fe0d9d972b6ccc005ecb8b116vboxsync for (;;)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#if defined(DEBUG) && defined(IN_RING3)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* sanity */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger->offScratch >= sizeof(pLogger->achScratch))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync fprintf(stderr, "pLogger->offScratch >= sizeof(pLogger->achScratch) (%#x >= %#x)\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->offScratch, (unsigned)sizeof(pLogger->achScratch));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertBreakpoint(); AssertBreakpoint();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* how much */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync size_t cb = sizeof(pLogger->achScratch) - pLogger->offScratch - 1;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (cb > cbChars)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync cb = cbChars;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* copy */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync memcpy(&pLogger->achScratch[pLogger->offScratch], pachChars, cb);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* advance */
d6b5539478863f176bfffefc1ada2b9489cfa092vboxsync pLogger->offScratch += (uint32_t)cb;
d6b5539478863f176bfffefc1ada2b9489cfa092vboxsync cbRet += cb;
d6b5539478863f176bfffefc1ada2b9489cfa092vboxsync cbChars -= cb;
d6b5539478863f176bfffefc1ada2b9489cfa092vboxsync
d6b5539478863f176bfffefc1ada2b9489cfa092vboxsync /* done? */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (cbChars <= 0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return cbRet;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pachChars += cb;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* flush */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rtlogFlush(pLogger);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* won't ever get here! */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Termination call.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * There's always space for a terminator, and it's not counted.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->achScratch[pLogger->offScratch] = '\0';
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/**
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Callback for RTLogFormatV which writes to the logger instance.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * This version supports prefixes.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * See PFNLOGOUTPUT() for details.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncstatic DECLCALLBACK(size_t) rtLogOutputPrefixed(void *pv, const char *pachChars, size_t cbChars)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PRTLOGOUTPUTPREFIXEDARGS pArgs = (PRTLOGOUTPUTPREFIXEDARGS)pv;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync PRTLOGGER pLogger = pArgs->pLogger;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (cbChars)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync size_t cbRet = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync for (;;)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync size_t cb = sizeof(pLogger->achScratch) - pLogger->offScratch - 1;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync char *psz;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const char *pszNewLine;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Pending prefix?
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger->fPendingPrefix)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->fPendingPrefix = false;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#if defined(DEBUG) && defined(IN_RING3)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* sanity */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger->offScratch >= sizeof(pLogger->achScratch))
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync fprintf(stderr, "pLogger->offScratch >= sizeof(pLogger->achScratch) (%#x >= %#x)\n",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->offScratch, (unsigned)sizeof(pLogger->achScratch));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync AssertBreakpoint(); AssertBreakpoint();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Flush the buffer if there isn't enough room for the maximum prefix config.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Max is 256, add a couple of extra bytes.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (cb < 256 + 16)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rtlogFlush(pLogger);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync cb = sizeof(pLogger->achScratch) - pLogger->offScratch - 1;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Write the prefixes.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * psz is pointing to the current position.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync psz = &pLogger->achScratch[pLogger->offScratch];
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger->fFlags & RTLOGFLAGS_PREFIX_TS)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#if defined(IN_RING3) || defined(IN_RC)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint64_t u64 = RTTimeNanoTS();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint64_t u64 = ~0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int iBase = 16;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync unsigned int fFlags = RTSTR_F_ZEROPAD;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger->fFlags & RTLOGFLAGS_DECIMAL_TS)
9a99bb9ca6c5bc8ef1977e01e13b05e5cc58319bvboxsync {
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync iBase = 10;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync fFlags = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger->fFlags & RTLOGFLAGS_REL_TS)
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync {
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync static volatile uint64_t s_u64LastTs;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync uint64_t u64DiffTs = u64 - s_u64LastTs;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync s_u64LastTs = u64;
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync /* We could have been preempted just before reading of s_u64LastTs by
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * another thread which wrote s_u64LastTs. In that case the difference
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * is negative which we simply ignore. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync u64 = (int64_t)u64DiffTs < 0 ? 0 : u64DiffTs;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* 1E15 nanoseconds = 11 days */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync psz += RTStrFormatNumber(psz, u64, iBase, 16, 0, fFlags); /* +17 */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *psz++ = ' ';
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger->fFlags & RTLOGFLAGS_PREFIX_TSC)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint64_t u64 = ASMReadTSC();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync int iBase = 16;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync unsigned int fFlags = RTSTR_F_ZEROPAD;
9a99bb9ca6c5bc8ef1977e01e13b05e5cc58319bvboxsync if (pLogger->fFlags & RTLOGFLAGS_DECIMAL_TS)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync iBase = 10;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync fFlags = 0;
06de36c1229f14000638fa27993b13c9133e85f5vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger->fFlags & RTLOGFLAGS_REL_TS)
bc8991845b5bd7e98758795748d3d76408756793vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync static volatile uint64_t s_u64LastTsc;
bc8991845b5bd7e98758795748d3d76408756793vboxsync int64_t i64DiffTsc = u64 - s_u64LastTsc;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync s_u64LastTsc = u64;
52694110156cee1511e430c9ae800de121a20050vboxsync /* We could have been preempted just before reading of s_u64LastTsc by
52694110156cee1511e430c9ae800de121a20050vboxsync * another thread which wrote s_u64LastTsc. In that case the difference
52694110156cee1511e430c9ae800de121a20050vboxsync * is negative which we simply ignore. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync u64 = i64DiffTsc < 0 ? 0 : i64DiffTsc;
52694110156cee1511e430c9ae800de121a20050vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* 1E15 ticks at 4GHz = 69 hours */
52694110156cee1511e430c9ae800de121a20050vboxsync psz += RTStrFormatNumber(psz, u64, iBase, 16, 0, fFlags); /* +17 */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *psz++ = ' ';
50df3da42ff6589b0ecc4f50f2288811bc370186vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger->fFlags & RTLOGFLAGS_PREFIX_MS_PROG)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
52694110156cee1511e430c9ae800de121a20050vboxsync#if defined(IN_RING3) || defined(IN_RC)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint64_t u64 = RTTimeProgramMilliTS();
0138777a0eae9d74905d86f792f1f1c497dab65evboxsync#else
0138777a0eae9d74905d86f792f1f1c497dab65evboxsync uint64_t u64 = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* 1E8 milliseconds = 27 hours */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync psz += RTStrFormatNumber(psz, u64, 10, 9, 0, RTSTR_F_ZEROPAD);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *psz++ = ' ';
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger->fFlags & RTLOGFLAGS_PREFIX_TIME)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifdef IN_RING3
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTTIMESPEC TimeSpec;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTTIME Time;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTTimeExplode(&Time, RTTimeNow(&TimeSpec));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync psz += RTStrFormatNumber(psz, Time.u8Hour, 10, 2, 0, RTSTR_F_ZEROPAD);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *psz++ = ':';
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync psz += RTStrFormatNumber(psz, Time.u8Minute, 10, 2, 0, RTSTR_F_ZEROPAD);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *psz++ = ':';
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync psz += RTStrFormatNumber(psz, Time.u8Second, 10, 2, 0, RTSTR_F_ZEROPAD);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *psz++ = '.';
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync psz += RTStrFormatNumber(psz, Time.u32Nanosecond / 1000000, 10, 3, 0, RTSTR_F_ZEROPAD);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *psz++ = ' '; /* +17 (3+1+3+1+3+1+4+1) */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync memset(psz, ' ', 13);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync psz += 13;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
9c425bdea5f0991df62922b1584b805a86f2f898vboxsync }
9c425bdea5f0991df62922b1584b805a86f2f898vboxsync if (pLogger->fFlags & RTLOGFLAGS_PREFIX_TIME_PROG)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#if defined(IN_RING3) || defined(IN_RC)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint64_t u64 = RTTimeProgramMilliTS();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync psz += RTStrFormatNumber(psz, (uint32_t)(u64 / (60 * 60 * 1000)), 10, 2, 0, RTSTR_F_ZEROPAD);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *psz++ = ':';
6b022885f2cb6a55167609edecd89570cd80001dvboxsync uint32_t u32 = (uint32_t)(u64 % (60 * 60 * 1000));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync psz += RTStrFormatNumber(psz, u32 / (60 * 1000), 10, 2, 0, RTSTR_F_ZEROPAD);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *psz++ = ':';
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync u32 %= 60 * 1000;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync psz += RTStrFormatNumber(psz, u32 / 1000, 10, 2, 0, RTSTR_F_ZEROPAD);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *psz++ = '.';
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync psz += RTStrFormatNumber(psz, u32 % 1000, 10, 3, 0, RTSTR_F_ZEROPAD);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *psz++ = ' '; /* +20 (9+1+2+1+2+1+3+1) */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync memset(psz, ' ', 13);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync psz += 13;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# if 0
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger->fFlags & RTLOGFLAGS_PREFIX_DATETIME)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync char szDate[32];
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTTIMESPEC Time;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTTimeSpecToString(RTTimeNow(&Time), szDate, sizeof(szDate));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync size_t cch = strlen(szDate);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync memcpy(psz, szDate, cch);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync psz += cch;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *psz++ = ' '; /* +32 */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger->fFlags & RTLOGFLAGS_PREFIX_PID)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef IN_RC
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTPROCESS Process = RTProcSelf();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTPROCESS Process = NIL_RTPROCESS;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync psz += RTStrFormatNumber(psz, Process, 16, sizeof(RTPROCESS) * 2, 0, RTSTR_F_ZEROPAD);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *psz++ = ' '; /* +9 */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger->fFlags & RTLOGFLAGS_PREFIX_TID)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifndef IN_RC
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTNATIVETHREAD Thread = RTThreadNativeSelf();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync RTNATIVETHREAD Thread = NIL_RTNATIVETHREAD;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
18db01bbe01d709ed64ef78717e98b94b7fee056vboxsync psz += RTStrFormatNumber(psz, Thread, 16, sizeof(RTNATIVETHREAD) * 2, 0, RTSTR_F_ZEROPAD);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *psz++ = ' '; /* +17 */
18db01bbe01d709ed64ef78717e98b94b7fee056vboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger->fFlags & RTLOGFLAGS_PREFIX_THREAD)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#ifdef IN_RING3
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const char *pszName = RTThreadSelfName();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#elif defined IN_RC
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const char *pszName = "EMT-RC";
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
6b022885f2cb6a55167609edecd89570cd80001dvboxsync const char *pszName = "R0";
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
6f516ad9911d9037a18778742caa955fe362f8ffvboxsync size_t cch = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pszName)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync cch = strlen(pszName);
57399ab65e2825c324fb9dcb4642d4ae2c232509vboxsync cch = RT_MIN(cch, 16);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync memcpy(psz, pszName, cch);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync psz += cch;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
6b022885f2cb6a55167609edecd89570cd80001dvboxsync do
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *psz++ = ' ';
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync while (cch++ < 8); /* +17 */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger->fFlags & RTLOGFLAGS_PREFIX_CPUID)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const uint8_t idCpu = ASMGetApicId();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const RTCPUID idCpu = RTMpCpuId();
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync psz += RTStrFormatNumber(psz, idCpu, 16, sizeof(idCpu) * 2, 0, RTSTR_F_ZEROPAD);
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync *psz++ = ' '; /* +17 */
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync }
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync#ifndef IN_RC
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync if ( (pLogger->fFlags & RTLOGFLAGS_PREFIX_CUSTOM)
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync && pLogger->pfnPrefix)
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync {
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync psz += pLogger->pfnPrefix(pLogger, psz, 31, pLogger->pvPrefixUserArg);
fdc5224bd8d9a60af82da5809e3d6729c9bc69cbvboxsync *psz++ = ' '; /* +32 */
d6b5539478863f176bfffefc1ada2b9489cfa092vboxsync }
d6b5539478863f176bfffefc1ada2b9489cfa092vboxsync#endif
d6b5539478863f176bfffefc1ada2b9489cfa092vboxsync if (pLogger->fFlags & RTLOGFLAGS_PREFIX_LOCK_COUNTS)
d6b5539478863f176bfffefc1ada2b9489cfa092vboxsync {
d6b5539478863f176bfffefc1ada2b9489cfa092vboxsync#ifdef IN_RING3 /** @todo implement these counters in ring-0 too? */
d6b5539478863f176bfffefc1ada2b9489cfa092vboxsync RTTHREAD Thread = RTThreadSelf();
d6b5539478863f176bfffefc1ada2b9489cfa092vboxsync if (Thread != NIL_RTTHREAD)
d6b5539478863f176bfffefc1ada2b9489cfa092vboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync uint32_t cReadLocks = RTLockValidatorReadLockGetCount(Thread);
0138777a0eae9d74905d86f792f1f1c497dab65evboxsync uint32_t cWriteLocks = RTLockValidatorWriteLockGetCount(Thread) - g_cLoggerLockCount;
9424be2edf0232241bc75178b401464d4de76cadvboxsync cReadLocks = RT_MIN(0xfff, cReadLocks);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync cWriteLocks = RT_MIN(0xfff, cWriteLocks);
bc8991845b5bd7e98758795748d3d76408756793vboxsync psz += RTStrFormatNumber(psz, cReadLocks, 16, 1, 0, RTSTR_F_ZEROPAD);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *psz++ = '/';
06de36c1229f14000638fa27993b13c9133e85f5vboxsync psz += RTStrFormatNumber(psz, cWriteLocks, 16, 1, 0, RTSTR_F_ZEROPAD);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync else
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync#endif
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync {
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync *psz++ = '?';
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync *psz++ = '/';
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync *psz++ = '?';
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync }
d6b5539478863f176bfffefc1ada2b9489cfa092vboxsync *psz++ = ' '; /* +8 */
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync }
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync if (pLogger->fFlags & RTLOGFLAGS_PREFIX_FLAG_NO)
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync {
d6b5539478863f176bfffefc1ada2b9489cfa092vboxsync psz += RTStrFormatNumber(psz, pArgs->fFlags, 16, 8, 0, RTSTR_F_ZEROPAD);
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync *psz++ = ' '; /* +9 */
d6b5539478863f176bfffefc1ada2b9489cfa092vboxsync }
3e294535852a8ee1dc3658f8a2197e18a8135fd2vboxsync if (pLogger->fFlags & RTLOGFLAGS_PREFIX_FLAG)
52694110156cee1511e430c9ae800de121a20050vboxsync {
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync#ifdef IN_RING3
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync const char *pszGroup = pArgs->iGroup != ~0U ? pLogger->papszGroups[pArgs->iGroup] : NULL;
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync#else
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync const char *pszGroup = NULL;
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync#endif
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync size_t cch = 0;
26824086a3f6b36cd911058f1d9b4c0b944706fbvboxsync if (pszGroup)
d6b5539478863f176bfffefc1ada2b9489cfa092vboxsync {
9a99bb9ca6c5bc8ef1977e01e13b05e5cc58319bvboxsync cch = strlen(pszGroup);
52694110156cee1511e430c9ae800de121a20050vboxsync cch = RT_MIN(cch, 16);
52694110156cee1511e430c9ae800de121a20050vboxsync memcpy(psz, pszGroup, cch);
52694110156cee1511e430c9ae800de121a20050vboxsync psz += cch;
06de36c1229f14000638fa27993b13c9133e85f5vboxsync }
d6b5539478863f176bfffefc1ada2b9489cfa092vboxsync do
9a99bb9ca6c5bc8ef1977e01e13b05e5cc58319bvboxsync *psz++ = ' ';
d6b5539478863f176bfffefc1ada2b9489cfa092vboxsync while (cch++ < 8); /* +17 */
d6b5539478863f176bfffefc1ada2b9489cfa092vboxsync }
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync if (pLogger->fFlags & RTLOGFLAGS_PREFIX_GROUP_NO)
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync {
52694110156cee1511e430c9ae800de121a20050vboxsync if (pArgs->iGroup != ~0U)
9a99bb9ca6c5bc8ef1977e01e13b05e5cc58319bvboxsync {
9a99bb9ca6c5bc8ef1977e01e13b05e5cc58319bvboxsync psz += RTStrFormatNumber(psz, pArgs->iGroup, 16, 3, 0, RTSTR_F_ZEROPAD);
9a99bb9ca6c5bc8ef1977e01e13b05e5cc58319bvboxsync *psz++ = ' ';
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync }
5dda7f07dab8a954e6c4cf2378b15f921e60d9aavboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync memcpy(psz, "-1 ", sizeof("-1 ") - 1);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync psz += sizeof("-1 ") - 1;
3cac8f8c6923a3a89ecfccda5e89ad75f48658e0vboxsync } /* +9 */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (pLogger->fFlags & RTLOGFLAGS_PREFIX_GROUP)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const unsigned fGrp = pLogger->afGroups[pArgs->iGroup != ~0U ? pArgs->iGroup : 0];
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync const char *pszGroup;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync size_t cch;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync switch (pArgs->fFlags & fGrp)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case 0: pszGroup = "--------"; cch = sizeof("--------") - 1; break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case RTLOGGRPFLAGS_ENABLED: pszGroup = "enabled" ; cch = sizeof("enabled" ) - 1; break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case RTLOGGRPFLAGS_LEVEL_1: pszGroup = "level 1" ; cch = sizeof("level 1" ) - 1; break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case RTLOGGRPFLAGS_LEVEL_2: pszGroup = "level 2" ; cch = sizeof("level 2" ) - 1; break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case RTLOGGRPFLAGS_LEVEL_3: pszGroup = "level 3" ; cch = sizeof("level 3" ) - 1; break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case RTLOGGRPFLAGS_LEVEL_4: pszGroup = "level 4" ; cch = sizeof("level 4" ) - 1; break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case RTLOGGRPFLAGS_LEVEL_5: pszGroup = "level 5" ; cch = sizeof("level 5" ) - 1; break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case RTLOGGRPFLAGS_LEVEL_6: pszGroup = "level 6" ; cch = sizeof("level 6" ) - 1; break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case RTLOGGRPFLAGS_FLOW: pszGroup = "flow" ; cch = sizeof("flow" ) - 1; break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* personal groups */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case RTLOGGRPFLAGS_LELIK: pszGroup = "lelik" ; cch = sizeof("lelik" ) - 1; break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case RTLOGGRPFLAGS_MICHAEL: pszGroup = "Michael" ; cch = sizeof("Michael" ) - 1; break;
1a25adaca81841abf5e6cdfed02eaff64941357dvboxsync case RTLOGGRPFLAGS_DMIK: pszGroup = "dmik" ; cch = sizeof("dmik" ) - 1; break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case RTLOGGRPFLAGS_SUNLOVER: pszGroup = "sunlover"; cch = sizeof("sunlover") - 1; break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case RTLOGGRPFLAGS_ACHIM: pszGroup = "Achim" ; cch = sizeof("Achim" ) - 1; break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case RTLOGGRPFLAGS_SANDER: pszGroup = "Sander" ; cch = sizeof("Sander" ) - 1; break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case RTLOGGRPFLAGS_KLAUS: pszGroup = "Klaus" ; cch = sizeof("Klaus" ) - 1; break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case RTLOGGRPFLAGS_FRANK: pszGroup = "Frank" ; cch = sizeof("Frank" ) - 1; break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case RTLOGGRPFLAGS_BIRD: pszGroup = "bird" ; cch = sizeof("bird" ) - 1; break;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync case RTLOGGRPFLAGS_NONAME: pszGroup = "noname" ; cch = sizeof("noname" ) - 1; break;
750d4d0506a38b2e80c997075d40aad474e675fbvboxsync default: pszGroup = "????????"; cch = sizeof("????????") - 1; break;
750d4d0506a38b2e80c997075d40aad474e675fbvboxsync }
c657bea826c7455c93bd45eaebab63a4c7742c42vboxsync if (pszGroup)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync cch = RT_MIN(cch, 16);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync memcpy(psz, pszGroup, cch);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync psz += cch;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync do
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync *psz++ = ' ';
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync while (cch++ < 8); /* +17 */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Done, figure what we've used and advance the buffer and free size.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync cb = psz - &pLogger->achScratch[pLogger->offScratch];
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync Assert(cb <= 198);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->offScratch += (uint32_t)cb;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync cb = sizeof(pLogger->achScratch) - pLogger->offScratch - 1;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else if (cb <= 0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync rtlogFlush(pLogger);
afed5ab737f4aacfae3fe73776f40e989190a7cavboxsync cb = sizeof(pLogger->achScratch) - pLogger->offScratch - 1;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
32f98f3d0fb00168315b4ece1f0808df4cd88248vboxsync#if defined(DEBUG) && defined(IN_RING3)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* sanity */
2c080f6fc6ab70995d6390eeaa199d590c1a34d5vboxsync if (pLogger->offScratch >= sizeof(pLogger->achScratch))
8a132edc1577cbe2a19cd778c1b2bea6ae5e8515vboxsync {
32f98f3d0fb00168315b4ece1f0808df4cd88248vboxsync fprintf(stderr, "pLogger->offScratch >= sizeof(pLogger->achScratch) (%#x >= %#x)\n",
32f98f3d0fb00168315b4ece1f0808df4cd88248vboxsync pLogger->offScratch, (unsigned)sizeof(pLogger->achScratch));
32f98f3d0fb00168315b4ece1f0808df4cd88248vboxsync AssertBreakpoint(); AssertBreakpoint();
32f98f3d0fb00168315b4ece1f0808df4cd88248vboxsync }
32f98f3d0fb00168315b4ece1f0808df4cd88248vboxsync#endif
32f98f3d0fb00168315b4ece1f0808df4cd88248vboxsync
32f98f3d0fb00168315b4ece1f0808df4cd88248vboxsync /* how much */
32f98f3d0fb00168315b4ece1f0808df4cd88248vboxsync if (cb > cbChars)
32f98f3d0fb00168315b4ece1f0808df4cd88248vboxsync cb = cbChars;
32f98f3d0fb00168315b4ece1f0808df4cd88248vboxsync
32f98f3d0fb00168315b4ece1f0808df4cd88248vboxsync /* have newline? */
32f98f3d0fb00168315b4ece1f0808df4cd88248vboxsync pszNewLine = (const char *)memchr(pachChars, '\n', cb);
32f98f3d0fb00168315b4ece1f0808df4cd88248vboxsync if (pszNewLine)
32f98f3d0fb00168315b4ece1f0808df4cd88248vboxsync {
32f98f3d0fb00168315b4ece1f0808df4cd88248vboxsync if (pLogger->fFlags & RTLOGFLAGS_USECRLF)
32f98f3d0fb00168315b4ece1f0808df4cd88248vboxsync cb = pszNewLine - pachChars;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync cb = pszNewLine - pachChars + 1;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->fPendingPrefix = true;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
1a25adaca81841abf5e6cdfed02eaff64941357dvboxsync /* copy */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync memcpy(&pLogger->achScratch[pLogger->offScratch], pachChars, cb);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* advance */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->offScratch += (uint32_t)cb;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync cbRet += cb;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync cbChars -= cb;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ( pszNewLine
32f98f3d0fb00168315b4ece1f0808df4cd88248vboxsync && (pLogger->fFlags & RTLOGFLAGS_USECRLF)
32f98f3d0fb00168315b4ece1f0808df4cd88248vboxsync && pLogger->offScratch + 2 < sizeof(pLogger->achScratch))
32f98f3d0fb00168315b4ece1f0808df4cd88248vboxsync {
32f98f3d0fb00168315b4ece1f0808df4cd88248vboxsync memcpy(&pLogger->achScratch[pLogger->offScratch], "\r\n", 2);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->offScratch += 2;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync cbRet++;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync cbChars--;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync cb++;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->fPendingPrefix = true;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* done? */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (cbChars <= 0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return cbRet;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pachChars += cb;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* won't ever get here! */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync else
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /*
6b022885f2cb6a55167609edecd89570cd80001dvboxsync * Termination call.
6b022885f2cb6a55167609edecd89570cd80001dvboxsync * There's always space for a terminator, and it's not counted.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync pLogger->achScratch[pLogger->offScratch] = '\0';
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync return 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync