VirtualBox

source: vbox/trunk/include/iprt/log.h@ 52691

Last change on this file since 52691 was 52691, checked in by vboxsync, 10 years ago

Provide missing Log2Func to Log6Func. Fix already defined Log4Func to
use correct log level for !LOG_USE_C99.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 69.4 KB
Line 
1/** @file
2 * IPRT - Logging.
3 */
4
5/*
6 * Copyright (C) 2006-2012 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef ___iprt_log_h
27#define ___iprt_log_h
28
29#include <iprt/cdefs.h>
30#include <iprt/types.h>
31#include <iprt/stdarg.h>
32
33RT_C_DECLS_BEGIN
34
35/** @defgroup grp_rt_log RTLog - Logging
36 * @ingroup grp_rt
37 * @{
38 */
39
40/**
41 * IPRT Logging Groups.
42 * (Remember to update RT_LOGGROUP_NAMES!)
43 *
44 * @remark It should be pretty obvious, but just to have
45 * mentioned it, the values are sorted alphabetically (using the
46 * english alphabet) except for _DEFAULT which is always first.
47 *
48 * If anyone might be wondering what the alphabet looks like:
49 * a b c d e f g h i j k l m n o p q r s t u v w x y z
50 */
51typedef enum RTLOGGROUP
52{
53 /** Default logging group. */
54 RTLOGGROUP_DEFAULT,
55 RTLOGGROUP_DBG,
56 RTLOGGROUP_DBG_DWARF,
57 RTLOGGROUP_DIR,
58 RTLOGGROUP_FILE,
59 RTLOGGROUP_FS,
60 RTLOGGROUP_LDR,
61 RTLOGGROUP_PATH,
62 RTLOGGROUP_PROCESS,
63 RTLOGGROUP_SYMLINK,
64 RTLOGGROUP_THREAD,
65 RTLOGGROUP_TIME,
66 RTLOGGROUP_TIMER,
67 RTLOGGROUP_ZIP = 31,
68 RTLOGGROUP_FIRST_USER = 32
69} RTLOGGROUP;
70
71/** @def RT_LOGGROUP_NAMES
72 * IPRT Logging group names.
73 *
74 * Must correspond 100% to RTLOGGROUP!
75 * Don't forget commas!
76 *
77 * @remark It should be pretty obvious, but just to have
78 * mentioned it, the values are sorted alphabetically (using the
79 * english alphabet) except for _DEFAULT which is always first.
80 *
81 * If anyone might be wondering what the alphabet looks like:
82 * a b c d e f g h i j k l m n o p q r s t u v w x y z
83 */
84#define RT_LOGGROUP_NAMES \
85 "DEFAULT", \
86 "RT_DBG", \
87 "RT_DBG_DWARF", \
88 "RT_DIR", \
89 "RT_FILE", \
90 "RT_FS", \
91 "RT_LDR", \
92 "RT_PATH", \
93 "RT_PROCESS", \
94 "RT_SYMLINK", \
95 "RT_THREAD", \
96 "RT_TIME", \
97 "RT_TIMER", \
98 "RT_13", \
99 "RT_14", \
100 "RT_15", \
101 "RT_16", \
102 "RT_17", \
103 "RT_18", \
104 "RT_19", \
105 "RT_20", \
106 "RT_21", \
107 "RT_22", \
108 "RT_23", \
109 "RT_24", \
110 "RT_25", \
111 "RT_26", \
112 "RT_27", \
113 "RT_28", \
114 "RT_29", \
115 "RT_30", \
116 "RT_ZIP" \
117
118
119/** @def LOG_GROUP
120 * Active logging group.
121 */
122#ifndef LOG_GROUP
123# define LOG_GROUP RTLOGGROUP_DEFAULT
124#endif
125
126/** @def LOG_INSTANCE
127 * Active logging instance.
128 */
129#ifndef LOG_INSTANCE
130# define LOG_INSTANCE NULL
131#endif
132
133/** @def LOG_REL_INSTANCE
134 * Active release logging instance.
135 */
136#ifndef LOG_REL_INSTANCE
137# define LOG_REL_INSTANCE NULL
138#endif
139
140/** @def LOG_FN_FMT
141 * You can use this to specify you desired way of printing __PRETTY_FUNCTION__
142 * if you dislike the default one.
143 */
144#ifndef LOG_FN_FMT
145# define LOG_FN_FMT "%Rfn"
146#endif
147
148/** Logger structure. */
149#ifdef IN_RC
150typedef struct RTLOGGERRC RTLOGGER;
151#else
152typedef struct RTLOGGER RTLOGGER;
153#endif
154/** Pointer to logger structure. */
155typedef RTLOGGER *PRTLOGGER;
156/** Pointer to const logger structure. */
157typedef const RTLOGGER *PCRTLOGGER;
158
159
160/** Guest context logger structure. */
161typedef struct RTLOGGERRC RTLOGGERRC;
162/** Pointer to guest context logger structure. */
163typedef RTLOGGERRC *PRTLOGGERRC;
164/** Pointer to const guest context logger structure. */
165typedef const RTLOGGERRC *PCRTLOGGERRC;
166
167
168/**
169 * Logger phase.
170 *
171 * Used for signalling the log header/footer callback what to do.
172 */
173typedef enum RTLOGPHASE
174{
175 /** Begin of the logging. */
176 RTLOGPHASE_BEGIN = 0,
177 /** End of the logging. */
178 RTLOGPHASE_END,
179 /** Before rotating the log file. */
180 RTLOGPHASE_PREROTATE,
181 /** After rotating the log file. */
182 RTLOGPHASE_POSTROTATE,
183 /** 32-bit type blow up hack. */
184 RTLOGPHASE_32BIT_HACK = 0x7fffffff
185} RTLOGPHASE;
186
187
188/**
189 * Logger function.
190 *
191 * @param pszFormat Format string.
192 * @param ... Optional arguments as specified in the format string.
193 */
194typedef DECLCALLBACK(void) FNRTLOGGER(const char *pszFormat, ...);
195/** Pointer to logger function. */
196typedef FNRTLOGGER *PFNRTLOGGER;
197
198/**
199 * Flush function.
200 *
201 * @param pLogger Pointer to the logger instance which is to be flushed.
202 */
203typedef DECLCALLBACK(void) FNRTLOGFLUSH(PRTLOGGER pLogger);
204/** Pointer to flush function. */
205typedef FNRTLOGFLUSH *PFNRTLOGFLUSH;
206
207/**
208 * Flush function.
209 *
210 * @param pLogger Pointer to the logger instance which is to be flushed.
211 */
212typedef DECLCALLBACK(void) FNRTLOGFLUSHGC(PRTLOGGERRC pLogger);
213/** Pointer to logger function. */
214typedef RCPTRTYPE(FNRTLOGFLUSHGC *) PFNRTLOGFLUSHGC;
215
216/**
217 * Header/footer message callback.
218 *
219 * @param pLogger Pointer to the logger instance.
220 * @param pszFormat Format string.
221 * @param ... Optional arguments specified in the format string.
222 */
223typedef DECLCALLBACK(void) FNRTLOGPHASEMSG(PRTLOGGER pLogger, const char *pszFormat, ...);
224/** Pointer to header/footer message callback function. */
225typedef FNRTLOGPHASEMSG *PFNRTLOGPHASEMSG;
226
227/**
228 * Log file header/footer callback.
229 *
230 * @param pLogger Pointer to the logger instance.
231 * @param enmLogPhase Indicates at what time the callback is invoked.
232 * @param pfnLogPhaseMsg Callback for writing the header/footer (RTLogPrintf
233 * and others are out of bounds).
234 */
235typedef DECLCALLBACK(void) FNRTLOGPHASE(PRTLOGGER pLogger, RTLOGPHASE enmLogPhase, PFNRTLOGPHASEMSG pfnLogPhaseMsg);
236/** Pointer to log header/footer callback function. */
237typedef FNRTLOGPHASE *PFNRTLOGPHASE;
238
239/**
240 * Custom log prefix callback.
241 *
242 *
243 * @returns The number of chars written.
244 *
245 * @param pLogger Pointer to the logger instance.
246 * @param pchBuf Output buffer pointer.
247 * No need to terminate the output.
248 * @param cchBuf The size of the output buffer.
249 * @param pvUser The user argument.
250 */
251typedef DECLCALLBACK(size_t) FNRTLOGPREFIX(PRTLOGGER pLogger, char *pchBuf, size_t cchBuf, void *pvUser);
252/** Pointer to prefix callback function. */
253typedef FNRTLOGPREFIX *PFNRTLOGPREFIX;
254
255
256
257/**
258 * Logger instance structure for GC.
259 */
260struct RTLOGGERRC
261{
262 /** Pointer to temporary scratch buffer.
263 * This is used to format the log messages. */
264 char achScratch[32768];
265 /** Current scratch buffer position. */
266 uint32_t offScratch;
267 /** This is set if a prefix is pending. */
268 bool fPendingPrefix;
269 bool afAlignment[3];
270 /** Pointer to the logger function.
271 * This is actually pointer to a wrapper which will push a pointer to the
272 * instance pointer onto the stack before jumping to the real logger function.
273 * A very unfortunate hack to work around the missing variadic macro support in C++. */
274 RCPTRTYPE(PFNRTLOGGER) pfnLogger;
275 /** Pointer to the flush function. */
276 PFNRTLOGFLUSHGC pfnFlush;
277 /** Magic number (RTLOGGERRC_MAGIC). */
278 uint32_t u32Magic;
279 /** Logger instance flags - RTLOGFLAGS. */
280 uint32_t fFlags;
281 /** Number of groups in the afGroups member. */
282 uint32_t cGroups;
283 /** Group flags array - RTLOGGRPFLAGS.
284 * This member have variable length and may extend way beyond
285 * the declared size of 1 entry. */
286 uint32_t afGroups[1];
287};
288
289/** RTLOGGERRC::u32Magic value. (John Rogers Searle) */
290#define RTLOGGERRC_MAGIC 0x19320731
291
292
293
294#ifndef IN_RC
295
296/** Pointer to internal logger bits. */
297typedef struct RTLOGGERINTERNAL *PRTLOGGERINTERNAL;
298
299/**
300 * Logger instance structure.
301 */
302struct RTLOGGER
303{
304 /** Pointer to temporary scratch buffer.
305 * This is used to format the log messages. */
306 char achScratch[49152];
307 /** Current scratch buffer position. */
308 uint32_t offScratch;
309 /** Magic number. */
310 uint32_t u32Magic;
311 /** Logger instance flags - RTLOGFLAGS. */
312 uint32_t fFlags;
313 /** Destination flags - RTLOGDEST. */
314 uint32_t fDestFlags;
315 /** Pointer to the internal bits of the logger.
316 * (The memory is allocated in the same block as RTLOGGER.) */
317 PRTLOGGERINTERNAL pInt;
318 /** Pointer to the logger function (used in non-C99 mode only).
319 *
320 * This is actually pointer to a wrapper which will push a pointer to the
321 * instance pointer onto the stack before jumping to the real logger function.
322 * A very unfortunate hack to work around the missing variadic macro
323 * support in older C++/C standards. (The memory is allocated using
324 * RTMemExecAlloc(), except for agnostic R0 code.) */
325 PFNRTLOGGER pfnLogger;
326 /** Number of groups in the afGroups and papszGroups members. */
327 uint32_t cGroups;
328 /** Group flags array - RTLOGGRPFLAGS.
329 * This member have variable length and may extend way beyond
330 * the declared size of 1 entry. */
331 uint32_t afGroups[1];
332};
333
334/** RTLOGGER::u32Magic value. (Avram Noam Chomsky) */
335# define RTLOGGER_MAGIC UINT32_C(0x19281207)
336
337#endif /* !IN_RC */
338
339
340/**
341 * Logger flags.
342 */
343typedef enum RTLOGFLAGS
344{
345 /** The logger instance is disabled for normal output. */
346 RTLOGFLAGS_DISABLED = 0x00000001,
347 /** The logger instance is using buffered output. */
348 RTLOGFLAGS_BUFFERED = 0x00000002,
349 /** The logger instance expands LF to CR/LF. */
350 RTLOGFLAGS_USECRLF = 0x00000010,
351 /** Append to the log destination where applicable. */
352 RTLOGFLAGS_APPEND = 0x00000020,
353 /** Show relative timestamps with PREFIX_TSC and PREFIX_TS */
354 RTLOGFLAGS_REL_TS = 0x00000040,
355 /** Show decimal timestamps with PREFIX_TSC and PREFIX_TS */
356 RTLOGFLAGS_DECIMAL_TS = 0x00000080,
357 /** Open the file in write through mode. */
358 RTLOGFLAGS_WRITE_THROUGH = 0x00000100,
359 /** Flush the file to disk when flushing the buffer. */
360 RTLOGFLAGS_FLUSH = 0x00000200,
361 /** Restrict the number of log entries per group. */
362 RTLOGFLAGS_RESTRICT_GROUPS = 0x00000400,
363 /** New lines should be prefixed with the write and read lock counts. */
364 RTLOGFLAGS_PREFIX_LOCK_COUNTS = 0x00008000,
365 /** New lines should be prefixed with the CPU id (ApicID on intel/amd). */
366 RTLOGFLAGS_PREFIX_CPUID = 0x00010000,
367 /** New lines should be prefixed with the native process id. */
368 RTLOGFLAGS_PREFIX_PID = 0x00020000,
369 /** New lines should be prefixed with group flag number causing the output. */
370 RTLOGFLAGS_PREFIX_FLAG_NO = 0x00040000,
371 /** New lines should be prefixed with group flag name causing the output. */
372 RTLOGFLAGS_PREFIX_FLAG = 0x00080000,
373 /** New lines should be prefixed with group number. */
374 RTLOGFLAGS_PREFIX_GROUP_NO = 0x00100000,
375 /** New lines should be prefixed with group name. */
376 RTLOGFLAGS_PREFIX_GROUP = 0x00200000,
377 /** New lines should be prefixed with the native thread id. */
378 RTLOGFLAGS_PREFIX_TID = 0x00400000,
379 /** New lines should be prefixed with thread name. */
380 RTLOGFLAGS_PREFIX_THREAD = 0x00800000,
381 /** New lines should be prefixed with data from a custom callback. */
382 RTLOGFLAGS_PREFIX_CUSTOM = 0x01000000,
383 /** New lines should be prefixed with formatted timestamp since program start. */
384 RTLOGFLAGS_PREFIX_TIME_PROG = 0x04000000,
385 /** New lines should be prefixed with formatted timestamp (UCT). */
386 RTLOGFLAGS_PREFIX_TIME = 0x08000000,
387 /** New lines should be prefixed with milliseconds since program start. */
388 RTLOGFLAGS_PREFIX_MS_PROG = 0x10000000,
389 /** New lines should be prefixed with timestamp. */
390 RTLOGFLAGS_PREFIX_TSC = 0x20000000,
391 /** New lines should be prefixed with timestamp. */
392 RTLOGFLAGS_PREFIX_TS = 0x40000000,
393 /** The prefix mask. */
394 RTLOGFLAGS_PREFIX_MASK = 0x7dff8000
395} RTLOGFLAGS;
396
397/**
398 * Logger per group flags.
399 */
400typedef enum RTLOGGRPFLAGS
401{
402 /** Enabled. */
403 RTLOGGRPFLAGS_ENABLED = 0x00000001,
404 /** Level 1 logging. */
405 RTLOGGRPFLAGS_LEVEL_1 = 0x00000002,
406 /** Level 2 logging. */
407 RTLOGGRPFLAGS_LEVEL_2 = 0x00000004,
408 /** Level 3 logging. */
409 RTLOGGRPFLAGS_LEVEL_3 = 0x00000008,
410 /** Level 4 logging. */
411 RTLOGGRPFLAGS_LEVEL_4 = 0x00000010,
412 /** Level 5 logging. */
413 RTLOGGRPFLAGS_LEVEL_5 = 0x00000020,
414 /** Level 6 logging. */
415 RTLOGGRPFLAGS_LEVEL_6 = 0x00000040,
416 /** Flow logging. */
417 RTLOGGRPFLAGS_FLOW = 0x00000080,
418 /** Restrict the number of log entries. */
419 RTLOGGRPFLAGS_RESTRICT = 0x00000100,
420
421 /** Lelik logging. */
422 RTLOGGRPFLAGS_LELIK = 0x00010000,
423 /** Michael logging. */
424 RTLOGGRPFLAGS_MICHAEL = 0x00020000,
425 /** sunlover logging. */
426 RTLOGGRPFLAGS_SUNLOVER = 0x00040000,
427 /** Achim logging. */
428 RTLOGGRPFLAGS_ACHIM = 0x00080000,
429 /** Sander logging. */
430 RTLOGGRPFLAGS_SANDER = 0x00100000,
431 /** Klaus logging. */
432 RTLOGGRPFLAGS_KLAUS = 0x00200000,
433 /** Frank logging. */
434 RTLOGGRPFLAGS_FRANK = 0x00400000,
435 /** bird logging. */
436 RTLOGGRPFLAGS_BIRD = 0x00800000,
437 /** aleksey logging. */
438 RTLOGGRPFLAGS_ALEKSEY = 0x01000000,
439 /** dj logging. */
440 RTLOGGRPFLAGS_DJ = 0x02000000,
441 /** NoName logging. */
442 RTLOGGRPFLAGS_NONAME = 0x04000000
443} RTLOGGRPFLAGS;
444
445/**
446 * Logger destination type.
447 */
448typedef enum RTLOGDEST
449{
450 /** Log to file. */
451 RTLOGDEST_FILE = 0x00000001,
452 /** Log to stdout. */
453 RTLOGDEST_STDOUT = 0x00000002,
454 /** Log to stderr. */
455 RTLOGDEST_STDERR = 0x00000004,
456 /** Log to debugger (win32 only). */
457 RTLOGDEST_DEBUGGER = 0x00000008,
458 /** Log to com port. */
459 RTLOGDEST_COM = 0x00000010,
460 /** Just a dummy flag to be used when no other flag applies. */
461 RTLOGDEST_DUMMY = 0x20000000,
462 /** Log to a user defined output stream. */
463 RTLOGDEST_USER = 0x40000000
464} RTLOGDEST;
465
466
467RTDECL(void) RTLogPrintfEx(void *pvInstance, unsigned fFlags, unsigned iGroup, const char *pszFormat, ...);
468
469
470#ifdef DOXYGEN_RUNNING
471# define LOG_DISABLED
472# define LOG_ENABLED
473# define LOG_ENABLE_FLOW
474#endif
475
476/** @def LOG_DISABLED
477 * Use this compile time define to disable all logging macros. It can
478 * be overridden for each of the logging macros by the LOG_ENABLE*
479 * compile time defines.
480 */
481
482/** @def LOG_ENABLED
483 * Use this compile time define to enable logging when not in debug mode
484 * or LOG_DISABLED is set.
485 * This will enabled Log() only.
486 */
487
488/** @def LOG_ENABLE_FLOW
489 * Use this compile time define to enable flow logging when not in
490 * debug mode or LOG_DISABLED is defined.
491 * This will enable LogFlow() only.
492 */
493
494/*
495 * Determine whether logging is enabled and forcefully normalize the indicators.
496 */
497#if (defined(DEBUG) || defined(LOG_ENABLED)) && !defined(LOG_DISABLED)
498# undef LOG_DISABLED
499# undef LOG_ENABLED
500# define LOG_ENABLED
501#else
502# undef LOG_ENABLED
503# undef LOG_DISABLED
504# define LOG_DISABLED
505#endif
506
507
508/** @def LOG_USE_C99
509 * Governs the use of variadic macros.
510 */
511#ifndef LOG_USE_C99
512# if defined(RT_ARCH_AMD64) || defined(RT_OS_DARWIN) || defined(RT_ARCH_SPARC) || defined(RT_ARCH_SPARC64)
513# define LOG_USE_C99
514# endif
515#endif
516
517
518/** @def LogIt
519 * Write to specific logger if group enabled.
520 */
521#ifdef LOG_ENABLED
522# if defined(LOG_USE_C99)
523# define _LogRemoveParentheseis(...) __VA_ARGS__
524# define _LogIt(a_pvInst, a_fFlags, a_iGroup, ...) RTLogLoggerEx((PRTLOGGER)a_pvInst, a_fFlags, a_iGroup, __VA_ARGS__)
525# define LogIt(a_pvInst, a_fFlags, a_iGroup, fmtargs) _LogIt(a_pvInst, a_fFlags, a_iGroup, _LogRemoveParentheseis fmtargs)
526# define _LogItAlways(a_pvInst, a_fFlags, a_iGroup, ...) RTLogLoggerEx((PRTLOGGER)a_pvInst, a_fFlags, ~0U, __VA_ARGS__)
527# define LogItAlways(a_pvInst, a_fFlags, a_iGroup, fmtargs) _LogItAlways(a_pvInst, a_fFlags, a_iGroup, _LogRemoveParentheseis fmtargs)
528 /** @todo invent a flag or something for skipping the group check so we can pass iGroup. LogItAlways. */
529# else
530# define LogIt(a_pvInst, a_fFlags, a_iGroup, fmtargs) \
531 do \
532 { \
533 register PRTLOGGER LogIt_pLogger = (PRTLOGGER)(a_pvInst) ? (PRTLOGGER)(a_pvInst) : RTLogDefaultInstance(); \
534 if ( LogIt_pLogger \
535 && !(LogIt_pLogger->fFlags & RTLOGFLAGS_DISABLED)) \
536 { \
537 register unsigned LogIt_fFlags = LogIt_pLogger->afGroups[(unsigned)(a_iGroup) < LogIt_pLogger->cGroups ? (unsigned)(a_iGroup) : 0]; \
538 if ((LogIt_fFlags & ((a_fFlags) | RTLOGGRPFLAGS_ENABLED)) == ((a_fFlags) | RTLOGGRPFLAGS_ENABLED)) \
539 LogIt_pLogger->pfnLogger fmtargs; \
540 } \
541 } while (0)
542# define LogItAlways(a_pvInst, a_fFlags, a_iGroup, fmtargs) \
543 do \
544 { \
545 register PRTLOGGER LogIt_pLogger = (PRTLOGGER)(a_pvInst) ? (PRTLOGGER)(a_pvInst) : RTLogDefaultInstance(); \
546 if ( LogIt_pLogger \
547 && !(LogIt_pLogger->fFlags & RTLOGFLAGS_DISABLED)) \
548 LogIt_pLogger->pfnLogger fmtargs; \
549 } while (0)
550# endif
551#else
552# define LogIt(a_pvInst, a_fFlags, a_iGroup, fmtargs) do { } while (0)
553# define LogItAlways(a_pvInst, a_fFlags, a_iGroup, fmtargs) do { } while (0)
554# if defined(LOG_USE_C99)
555# define _LogRemoveParentheseis(...) __VA_ARGS__
556# define _LogIt(a_pvInst, a_fFlags, a_iGroup, ...) do { } while (0)
557# define _LogItAlways(a_pvInst, a_fFlags, a_iGroup, ...) do { } while (0)
558# endif
559#endif
560
561
562/** @def Log
563 * Level 1 logging that works regardless of the group settings.
564 */
565#define LogAlways(a) LogItAlways(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_1, LOG_GROUP, a)
566
567/** @def Log
568 * Level 1 logging.
569 */
570#define Log(a) LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_1, LOG_GROUP, a)
571
572/** @def Log2
573 * Level 2 logging.
574 */
575#define Log2(a) LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_2, LOG_GROUP, a)
576
577/** @def Log3
578 * Level 3 logging.
579 */
580#define Log3(a) LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_3, LOG_GROUP, a)
581
582/** @def Log4
583 * Level 4 logging.
584 */
585#define Log4(a) LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_4, LOG_GROUP, a)
586
587/** @def Log5
588 * Level 5 logging.
589 */
590#define Log5(a) LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_5, LOG_GROUP, a)
591
592/** @def Log6
593 * Level 6 logging.
594 */
595#define Log6(a) LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_6, LOG_GROUP, a)
596
597/** @def LogFlow
598 * Logging of execution flow.
599 */
600#define LogFlow(a) LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_FLOW, LOG_GROUP, a)
601
602/** @def LogLelik
603 * lelik logging.
604 */
605#define LogLelik(a) LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_LELIK, LOG_GROUP, a)
606
607
608/** @def LogMichael
609 * michael logging.
610 */
611#define LogMichael(a) LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_MICHAEL, LOG_GROUP, a)
612
613/** @def LogSunlover
614 * sunlover logging.
615 */
616#define LogSunlover(a) LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_SUNLOVER, LOG_GROUP, a)
617
618/** @def LogAchim
619 * Achim logging.
620 */
621#define LogAchim(a) LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_ACHIM, LOG_GROUP, a)
622
623/** @def LogSander
624 * Sander logging.
625 */
626#define LogSander(a) LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_SANDER, LOG_GROUP, a)
627
628/** @def LogKlaus
629 * klaus logging.
630 */
631#define LogKlaus(a) LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_KLAUS, LOG_GROUP, a)
632
633/** @def LogFrank
634 * frank logging.
635 */
636#define LogFrank(a) LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_FRANK, LOG_GROUP, a)
637
638/** @def LogBird
639 * bird logging.
640 */
641#define LogBird(a) LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_BIRD, LOG_GROUP, a)
642
643/** @def LogAleksey
644 * aleksey logging.
645 */
646#define LogAleksey(a) LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_ALEKSEY, LOG_GROUP, a)
647
648/** @def LogDJ
649 * dj logging.
650 */
651#define LogDJ(a) LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_DJ, LOG_GROUP, a)
652
653/** @def LogNoName
654 * NoName logging.
655 */
656#define LogNoName(a) LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_NONAME, LOG_GROUP, a)
657
658/** @def LogWarning
659 * The same as Log(), but prepents a <tt>"WARNING! "</tt> string to the message.
660 *
661 * @param a Custom log message in format <tt>("string\n" [, args])</tt>.
662 */
663#if defined(LOG_USE_C99)
664# define LogWarning(a) \
665 _LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_1, LOG_GROUP, "WARNING! %M", _LogRemoveParentheseis a )
666#else
667# define LogWarning(a) \
668 do { Log(("WARNING! ")); Log(a); } while (0)
669#endif
670
671/** @def LogTrace
672 * Macro to trace the execution flow: logs the file name, line number and
673 * function name. Can be easily searched for in log files using the
674 * ">>>>>" pattern (prepended to the beginning of each line).
675 */
676#define LogTrace() \
677 LogFlow((">>>>> %s (%d): " LOG_FN_FMT "\n", __FILE__, __LINE__, __PRETTY_FUNCTION__))
678
679/** @def LogTraceMsg
680 * The same as LogTrace but logs a custom log message right after the trace line.
681 *
682 * @param a Custom log message in format <tt>("string\n" [, args])</tt>.
683 */
684#ifdef LOG_USE_C99
685# define LogTraceMsg(a) \
686 _LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_FLOW, LOG_GROUP, ">>>>> %s (%d): " LOG_FN_FMT ": %M", __FILE__, __LINE__, __PRETTY_FUNCTION__, _LogRemoveParentheseis a )
687#else
688# define LogTraceMsg(a) \
689 do { LogFlow((">>>>> %s (%d): " LOG_FN_FMT ": ", __FILE__, __LINE__, __PRETTY_FUNCTION__)); LogFlow(a); } while (0)
690#endif
691
692/** @def LogFunc
693 * Level 1 logging inside C/C++ functions.
694 *
695 * Prepends the given log message with the function name followed by a
696 * semicolon and space.
697 *
698 * @param a Log message in format <tt>("string\n" [, args])</tt>.
699 */
700#ifdef LOG_USE_C99
701# define LogFunc(a) \
702 _LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_1, LOG_GROUP, LOG_FN_FMT ": %M", __PRETTY_FUNCTION__, _LogRemoveParentheseis a )
703#else
704# define LogFunc(a) \
705 do { Log((LOG_FN_FMT ": ", __PRETTY_FUNCTION__)); Log(a); } while (0)
706#endif
707
708/** @def Log2Func
709 * Level 2 logging inside C/C++ functions.
710 *
711 * Prepends the given log message with the function name followed by a
712 * semicolon and space.
713 *
714 * @param a Log message in format <tt>("string\n" [, args])</tt>.
715 */
716#ifdef LOG_USE_C99
717# define Log2Func(a) \
718 _LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_2, LOG_GROUP, LOG_FN_FMT ": %M", __PRETTY_FUNCTION__, _LogRemoveParentheseis a )
719#else
720# define Log2Func(a) \
721 do { Log2((LOG_FN_FMT ": ", __PRETTY_FUNCTION__)); Log2(a); } while (0)
722#endif
723
724/** @def Log3Func
725 * Level 3 logging inside C/C++ functions.
726 *
727 * Prepends the given log message with the function name followed by a
728 * semicolon and space.
729 *
730 * @param a Log message in format <tt>("string\n" [, args])</tt>.
731 */
732#ifdef LOG_USE_C99
733# define Log3Func(a) \
734 _LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_3, LOG_GROUP, LOG_FN_FMT ": %M", __PRETTY_FUNCTION__, _LogRemoveParentheseis a )
735#else
736# define Log3Func(a) \
737 do { Log3((LOG_FN_FMT ": ", __PRETTY_FUNCTION__)); Log3(a); } while (0)
738#endif
739
740/** @def Log4Func
741 * Level 4 logging inside C/C++ functions.
742 *
743 * Prepends the given log message with the function name followed by a
744 * semicolon and space.
745 *
746 * @param a Log message in format <tt>("string\n" [, args])</tt>.
747 */
748#ifdef LOG_USE_C99
749# define Log4Func(a) \
750 _LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_4, LOG_GROUP, LOG_FN_FMT ": %M", __PRETTY_FUNCTION__, _LogRemoveParentheseis a )
751#else
752# define Log4Func(a) \
753 do { Log4((LOG_FN_FMT ": ", __PRETTY_FUNCTION__)); Log4(a); } while (0)
754#endif
755
756/** @def Log5Func
757 * Level 5 logging inside C/C++ functions.
758 *
759 * Prepends the given log message with the function name followed by a
760 * semicolon and space.
761 *
762 * @param a Log message in format <tt>("string\n" [, args])</tt>.
763 */
764#ifdef LOG_USE_C99
765# define Log5Func(a) \
766 _LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_5, LOG_GROUP, LOG_FN_FMT ": %M", __PRETTY_FUNCTION__, _LogRemoveParentheseis a )
767#else
768# define Log5Func(a) \
769 do { Log5((LOG_FN_FMT ": ", __PRETTY_FUNCTION__)); Log5(a); } while (0)
770#endif
771
772/** @def Log6Func
773 * Level 6 logging inside C/C++ functions.
774 *
775 * Prepends the given log message with the function name followed by a
776 * semicolon and space.
777 *
778 * @param a Log message in format <tt>("string\n" [, args])</tt>.
779 */
780#ifdef LOG_USE_C99
781# define Log6Func(a) \
782 _LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_6, LOG_GROUP, LOG_FN_FMT ": %M", __PRETTY_FUNCTION__, _LogRemoveParentheseis a )
783#else
784# define Log6Func(a) \
785 do { Log6((LOG_FN_FMT ": ", __PRETTY_FUNCTION__)); Log6(a); } while (0)
786#endif
787
788/** @def LogThisFunc
789 * The same as LogFunc but for class functions (methods): the resulting log
790 * line is additionally prepended with a hex value of |this| pointer.
791 *
792 * @param a Log message in format <tt>("string\n" [, args])</tt>.
793 */
794#ifdef LOG_USE_C99
795# define LogThisFunc(a) \
796 _LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_1, LOG_GROUP, "{%p} " LOG_FN_FMT ": %M", this, __PRETTY_FUNCTION__, _LogRemoveParentheseis a )
797#else
798# define LogThisFunc(a) \
799 do { Log(("{%p} " LOG_FN_FMT ": ", this, __PRETTY_FUNCTION__)); Log(a); } while (0)
800#endif
801
802/** @def LogFlowFunc
803 * Macro to log the execution flow inside C/C++ functions.
804 *
805 * Prepends the given log message with the function name followed by
806 * a semicolon and space.
807 *
808 * @param a Log message in format <tt>("string\n" [, args])</tt>.
809 */
810#ifdef LOG_USE_C99
811# define LogFlowFunc(a) \
812 _LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_FLOW, LOG_GROUP, LOG_FN_FMT ": %M", __PRETTY_FUNCTION__, _LogRemoveParentheseis a )
813#else
814# define LogFlowFunc(a) \
815 do { LogFlow((LOG_FN_FMT ": ", __PRETTY_FUNCTION__)); LogFlow(a); } while (0)
816#endif
817
818/** @def LogWarningFunc
819 * The same as LogWarning(), but prepents the log message with the function name.
820 *
821 * @param a Log message in format <tt>("string\n" [, args])</tt>.
822 */
823#ifdef LOG_USE_C99
824# define LogWarningFunc(a) \
825 _LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_1, LOG_GROUP, LOG_FN_FMT ": WARNING! %M", __PRETTY_FUNCTION__, _LogRemoveParentheseis a )
826#else
827# define LogWarningFunc(a) \
828 do { Log((LOG_FN_FMT ": WARNING! ", __PRETTY_FUNCTION__)); Log(a); } while (0)
829#endif
830
831/** @def LogFlowThisFunc
832 * The same as LogFlowFunc but for class functions (methods): the resulting log
833 * line is additionally prepended with a hex value of |this| pointer.
834 *
835 * @param a Log message in format <tt>("string\n" [, args])</tt>.
836 */
837#ifdef LOG_USE_C99
838# define LogFlowThisFunc(a) \
839 _LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_FLOW, LOG_GROUP, "{%p} " LOG_FN_FMT ": %M", this, __PRETTY_FUNCTION__, _LogRemoveParentheseis a )
840#else
841# define LogFlowThisFunc(a) \
842 do { LogFlow(("{%p} " LOG_FN_FMT ": ", this, __PRETTY_FUNCTION__)); LogFlow(a); } while (0)
843#endif
844
845/** @def LogWarningThisFunc
846 * The same as LogWarningFunc() but for class functions (methods): the resulting
847 * log line is additionally prepended with a hex value of |this| pointer.
848 *
849 * @param a Log message in format <tt>("string\n" [, args])</tt>.
850 */
851#ifdef LOG_USE_C99
852# define LogWarningThisFunc(a) \
853 _LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_1, LOG_GROUP, "{%p} " LOG_FN_FMT ": WARNING! %M", this, __PRETTY_FUNCTION__, _LogRemoveParentheseis a )
854#else
855# define LogWarningThisFunc(a) \
856 do { Log(("{%p} " LOG_FN_FMT ": WARNING! ", this, __PRETTY_FUNCTION__)); Log(a); } while (0)
857#endif
858
859/** Shortcut to |LogFlowFunc ("ENTER\n")|, marks the beginnig of the function. */
860#define LogFlowFuncEnter() LogFlowFunc(("ENTER\n"))
861
862/** Shortcut to |LogFlowFunc ("LEAVE\n")|, marks the end of the function. */
863#define LogFlowFuncLeave() LogFlowFunc(("LEAVE\n"))
864
865/** Shortcut to |LogFlowFunc ("LEAVE: %Rrc\n")|, marks the end of the function. */
866#define LogFlowFuncLeaveRC(rc) LogFlowFunc(("LEAVE: %Rrc\n", (rc)))
867
868/** Shortcut to |LogFlowThisFunc ("ENTER\n")|, marks the beginnig of the function. */
869#define LogFlowThisFuncEnter() LogFlowThisFunc(("ENTER\n"))
870
871/** Shortcut to |LogFlowThisFunc ("LEAVE\n")|, marks the end of the function. */
872#define LogFlowThisFuncLeave() LogFlowThisFunc(("LEAVE\n"))
873
874/** @def LogObjRefCnt
875 * Helper macro to print the current reference count of the given COM object
876 * to the log file.
877 *
878 * @param pObj Pointer to the object in question (must be a pointer to an
879 * IUnknown subclass or simply define COM-style AddRef() and
880 * Release() methods)
881 *
882 * @note Use it only for temporary debugging. It leaves dummy code even if
883 * logging is disabled.
884 */
885#define LogObjRefCnt(pObj) \
886 do { \
887 int refc = (pObj)->AddRef(); \
888 LogFlow((#pObj "{%p}.refCnt=%d\n", (pObj), refc - 1)); \
889 (pObj)->Release(); \
890 } while (0)
891
892
893/** @def LogIsItEnabled
894 * Checks whether the specified logging group is enabled or not.
895 */
896#ifdef LOG_ENABLED
897# define LogIsItEnabled(a_pvInst, a_fFlags, a_iGroup) \
898 LogIsItEnabledInternal((a_pvInst), (unsigned)(a_iGroup), (unsigned)(a_fFlags))
899#else
900# define LogIsItEnabled(a_pvInst, a_fFlags, a_iGroup) (false)
901#endif
902
903/** @def LogIsEnabled
904 * Checks whether level 1 logging is enabled.
905 */
906#define LogIsEnabled() LogIsItEnabled(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_1, LOG_GROUP)
907
908/** @def LogIs2Enabled
909 * Checks whether level 2 logging is enabled.
910 */
911#define LogIs2Enabled() LogIsItEnabled(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_2, LOG_GROUP)
912
913/** @def LogIs3Enabled
914 * Checks whether level 3 logging is enabled.
915 */
916#define LogIs3Enabled() LogIsItEnabled(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_3, LOG_GROUP)
917
918/** @def LogIs4Enabled
919 * Checks whether level 4 logging is enabled.
920 */
921#define LogIs4Enabled() LogIsItEnabled(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_4, LOG_GROUP)
922
923/** @def LogIs5Enabled
924 * Checks whether level 5 logging is enabled.
925 */
926#define LogIs5Enabled() LogIsItEnabled(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_5, LOG_GROUP)
927
928/** @def LogIs6Enabled
929 * Checks whether level 6 logging is enabled.
930 */
931#define LogIs6Enabled() LogIsItEnabled(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_6, LOG_GROUP)
932
933/** @def LogIsFlowEnabled
934 * Checks whether execution flow logging is enabled.
935 */
936#define LogIsFlowEnabled() LogIsItEnabled(LOG_INSTANCE, RTLOGGRPFLAGS_FLOW, LOG_GROUP)
937
938
939/** @name Passing Function Call Position When Logging.
940 *
941 * This is a little bit ugly as we have to omit the comma before the
942 * position parameters so that we don't inccur any overhead in non-logging
943 * builds (!defined(LOG_ENABLED).
944 *
945 * @{ */
946/** Source position for passing to a function call. */
947#ifdef LOG_ENABLED
948# define RTLOG_COMMA_SRC_POS , __FILE__, __LINE__, __PRETTY_FUNCTION__
949#else
950# define RTLOG_COMMA_SRC_POS RT_NOTHING
951#endif
952/** Source position declaration. */
953#ifdef LOG_ENABLED
954# define RTLOG_COMMA_SRC_POS_DECL , const char *pszFile, unsigned iLine, const char *pszFunction
955#else
956# define RTLOG_COMMA_SRC_POS_DECL RT_NOTHING
957#endif
958/** Source position arguments. */
959#ifdef LOG_ENABLED
960# define RTLOG_COMMA_SRC_POS_ARGS , pszFile, iLine, pszFunction
961#else
962# define RTLOG_COMMA_SRC_POS_ARGS RT_NOTHING
963#endif
964/** Applies NOREF() to the source position arguments. */
965#ifdef LOG_ENABLED
966# define RTLOG_SRC_POS_NOREF() do { NOREF(pszFile); NOREF(iLine); NOREF(pszFunction); } while (0)
967#else
968# define RTLOG_SRC_POS_NOREF() do { } while (0)
969#endif
970/** @} */
971
972
973
974/** @name Release Logging
975 * @{
976 */
977
978#ifdef DOXYGEN_RUNNING
979# define RTLOG_REL_DISABLED
980# define RTLOG_REL_ENABLED
981#endif
982
983/** @def RTLOG_REL_DISABLED
984 * Use this compile time define to disable all release logging
985 * macros.
986 */
987
988/** @def RTLOG_REL_ENABLED
989 * Use this compile time define to override RTLOG_REL_DISABLE.
990 */
991
992/*
993 * Determine whether release logging is enabled and forcefully normalize the indicators.
994 */
995#if !defined(RTLOG_REL_DISABLED) || defined(RTLOG_REL_ENABLED)
996# undef RTLOG_REL_DISABLED
997# undef RTLOG_REL_ENABLED
998# define RTLOG_REL_ENABLED
999#else
1000# undef RTLOG_REL_ENABLED
1001# undef RTLOG_REL_DISABLED
1002# define RTLOG_REL_DISABLED
1003#endif
1004
1005
1006/** @def LogIt
1007 * Write to specific logger if group enabled.
1008 */
1009#ifdef RTLOG_REL_ENABLED
1010# if defined(LOG_USE_C99)
1011# define _LogRelRemoveParentheseis(...) __VA_ARGS__
1012# define _LogRelIt(a_pvInst, a_fFlags, a_iGroup, ...) \
1013 do \
1014 { \
1015 PRTLOGGER LogRelIt_pLogger = (PRTLOGGER)(a_pvInst) ? (PRTLOGGER)(a_pvInst) : RTLogRelDefaultInstance(); \
1016 if ( LogRelIt_pLogger \
1017 && !(LogRelIt_pLogger->fFlags & RTLOGFLAGS_DISABLED)) \
1018 RTLogLoggerEx(LogRelIt_pLogger, a_fFlags, a_iGroup, __VA_ARGS__); \
1019 _LogIt(LOG_INSTANCE, a_fFlags, a_iGroup, __VA_ARGS__); \
1020 } while (0)
1021# define LogRelIt(a_pvInst, a_fFlags, a_iGroup, fmtargs) _LogRelIt(a_pvInst, a_fFlags, a_iGroup, _LogRelRemoveParentheseis fmtargs)
1022# else
1023# define LogRelIt(a_pvInst, a_fFlags, a_iGroup, fmtargs) \
1024 do \
1025 { \
1026 PRTLOGGER LogRelIt_pLogger = (PRTLOGGER)(a_pvInst) ? (PRTLOGGER)(a_pvInst) : RTLogRelDefaultInstance(); \
1027 if ( LogRelIt_pLogger \
1028 && !(LogRelIt_pLogger->fFlags & RTLOGFLAGS_DISABLED)) \
1029 { \
1030 unsigned LogIt_fFlags = LogRelIt_pLogger->afGroups[(unsigned)(a_iGroup) < LogRelIt_pLogger->cGroups ? (unsigned)(a_iGroup) : 0]; \
1031 if ((LogIt_fFlags & ((a_fFlags) | RTLOGGRPFLAGS_ENABLED)) == ((a_fFlags) | RTLOGGRPFLAGS_ENABLED)) \
1032 LogRelIt_pLogger->pfnLogger fmtargs; \
1033 } \
1034 LogIt(LOG_INSTANCE, a_fFlags, a_iGroup, fmtargs); \
1035 } while (0)
1036# endif
1037#else /* !RTLOG_REL_ENABLED */
1038# define LogRelIt(a_pvInst, a_fFlags, a_iGroup, fmtargs) do { } while (0)
1039# if defined(LOG_USE_C99)
1040# define _LogRelRemoveParentheseis(...) __VA_ARGS__
1041# define _LogRelIt(a_pvInst, a_fFlags, a_iGroup, ...) do { } while (0)
1042# endif
1043#endif /* !RTLOG_REL_ENABLED */
1044
1045
1046/** @def LogRel
1047 * Level 1 logging.
1048 */
1049#define LogRel(a) LogRelIt(LOG_REL_INSTANCE, RTLOGGRPFLAGS_LEVEL_1, LOG_GROUP, a)
1050
1051/** @def LogRel2
1052 * Level 2 logging.
1053 */
1054#define LogRel2(a) LogRelIt(LOG_REL_INSTANCE, RTLOGGRPFLAGS_LEVEL_2, LOG_GROUP, a)
1055
1056/** @def LogRel3
1057 * Level 3 logging.
1058 */
1059#define LogRel3(a) LogRelIt(LOG_REL_INSTANCE, RTLOGGRPFLAGS_LEVEL_3, LOG_GROUP, a)
1060
1061/** @def LogRel4
1062 * Level 4 logging.
1063 */
1064#define LogRel4(a) LogRelIt(LOG_REL_INSTANCE, RTLOGGRPFLAGS_LEVEL_4, LOG_GROUP, a)
1065
1066/** @def LogRel5
1067 * Level 5 logging.
1068 */
1069#define LogRel5(a) LogRelIt(LOG_REL_INSTANCE, RTLOGGRPFLAGS_LEVEL_5, LOG_GROUP, a)
1070
1071/** @def LogRel6
1072 * Level 6 logging.
1073 */
1074#define LogRel6(a) LogRelIt(LOG_REL_INSTANCE, RTLOGGRPFLAGS_LEVEL_6, LOG_GROUP, a)
1075
1076/** @def LogRelFlow
1077 * Logging of execution flow.
1078 */
1079#define LogRelFlow(a) LogRelIt(LOG_REL_INSTANCE, RTLOGGRPFLAGS_FLOW, LOG_GROUP, a)
1080
1081/** @def LogRelFunc
1082 * Release logging. Prepends the given log message with the function name
1083 * followed by a semicolon and space.
1084 */
1085#ifdef LOG_USE_C99
1086# define LogRelFunc(a) \
1087 _LogRelIt(LOG_REL_INSTANCE, RTLOGGRPFLAGS_LEVEL_1, LOG_GROUP, LOG_FN_FMT ": %M", __PRETTY_FUNCTION__, _LogRemoveParentheseis a )
1088# define LogFunc(a) \
1089 _LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_1, LOG_GROUP, LOG_FN_FMT ": %M", __PRETTY_FUNCTION__, _LogRemoveParentheseis a )
1090#else
1091# define LogRelFunc(a) \
1092 do { LogRel((LOG_FN_FMT ": ", __PRETTY_FUNCTION__)); LogRel(a); } while (0)
1093#endif
1094
1095/** @def LogRelThisFunc
1096 * The same as LogRelFunc but for class functions (methods): the resulting log
1097 * line is additionally prepended with a hex value of |this| pointer.
1098 */
1099#ifdef LOG_USE_C99
1100# define LogRelThisFunc(a) \
1101 _LogRelIt(LOG_REL_INSTANCE, RTLOGGRPFLAGS_LEVEL_1, LOG_GROUP, "{%p} " LOG_FN_FMT ": %M", this, __PRETTY_FUNCTION__, _LogRemoveParentheseis a )
1102#else
1103# define LogRelThisFunc(a) \
1104 do { LogRel(("{%p} " LOG_FN_FMT ": ", this, __PRETTY_FUNCTION__)); LogRel(a); } while (0)
1105#endif
1106
1107/** @def LogRelFlowFunc
1108 * Release logging. Macro to log the execution flow inside C/C++ functions.
1109 *
1110 * Prepends the given log message with the function name followed by
1111 * a semicolon and space.
1112 *
1113 * @param a Log message in format <tt>("string\n" [, args])</tt>.
1114 */
1115#ifdef LOG_USE_C99
1116# define LogRelFlowFunc(a) \
1117 _LogRelIt(LOG_REL_INSTANCE, RTLOGGRPFLAGS_FLOW, LOG_GROUP, LOG_FN_FMT ": %M", __PRETTY_FUNCTION__, _LogRemoveParentheseis a )
1118#else
1119# define LogRelFlowFunc(a) \
1120 do { LogRelFlow((LOG_FN_FMT ": ", __PRETTY_FUNCTION__)); LogRelFlow(a); } while (0)
1121#endif
1122
1123/** @def LogRelLelik
1124 * lelik logging.
1125 */
1126#define LogRelLelik(a) LogRelIt(LOG_REL_INSTANCE, RTLOGGRPFLAGS_LELIK, LOG_GROUP, a)
1127
1128/** @def LogRelMichael
1129 * michael logging.
1130 */
1131#define LogRelMichael(a) LogRelIt(LOG_REL_INSTANCE, RTLOGGRPFLAGS_MICHAEL, LOG_GROUP, a)
1132
1133/** @def LogRelSunlover
1134 * sunlover logging.
1135 */
1136#define LogRelSunlover(a) LogRelIt(LOG_REL_INSTANCE, RTLOGGRPFLAGS_SUNLOVER, LOG_GROUP, a)
1137
1138/** @def LogRelAchim
1139 * Achim logging.
1140 */
1141#define LogRelAchim(a) LogRelIt(LOG_REL_INSTANCE, RTLOGGRPFLAGS_ACHIM, LOG_GROUP, a)
1142
1143/** @def LogRelSander
1144 * Sander logging.
1145 */
1146#define LogRelSander(a) LogRelIt(LOG_REL_INSTANCE, RTLOGGRPFLAGS_SANDER, LOG_GROUP, a)
1147
1148/** @def LogRelKlaus
1149 * klaus logging.
1150 */
1151#define LogRelKlaus(a) LogRelIt(LOG_REL_INSTANCE, RTLOGGRPFLAGS_KLAUS, LOG_GROUP, a)
1152
1153/** @def LogRelFrank
1154 * frank logging.
1155 */
1156#define LogRelFrank(a) LogRelIt(LOG_REL_INSTANCE, RTLOGGRPFLAGS_FRANK, LOG_GROUP, a)
1157
1158/** @def LogRelBird
1159 * bird logging.
1160 */
1161#define LogRelBird(a) LogRelIt(LOG_REL_INSTANCE, RTLOGGRPFLAGS_BIRD, LOG_GROUP, a)
1162
1163/** @def LogRelNoName
1164 * NoName logging.
1165 */
1166#define LogRelNoName(a) LogRelIt(LOG_REL_INSTANCE, RTLOGGRPFLAGS_NONAME, LOG_GROUP, a)
1167
1168
1169/** @def LogRelIsItEnabled
1170 * Checks whether the specified logging group is enabled or not.
1171 */
1172#define LogRelIsItEnabled(a_pvInst, a_fFlags, a_iGroup) \
1173 LogRelIsItEnabledInternal((a_pvInst), (unsigned)(a_iGroup), (unsigned)(a_fFlags))
1174
1175/** @def LogRelIsEnabled
1176 * Checks whether level 1 logging is enabled.
1177 */
1178#define LogRelIsEnabled() LogRelIsItEnabled(LOG_REL_INSTANCE, RTLOGGRPFLAGS_LEVEL_1, LOG_GROUP)
1179
1180/** @def LogRelIs2Enabled
1181 * Checks whether level 2 logging is enabled.
1182 */
1183#define LogRelIs2Enabled() LogRelIsItEnabled(LOG_REL_INSTANCE, RTLOGGRPFLAGS_LEVEL_2, LOG_GROUP)
1184
1185/** @def LogRelIs3Enabled
1186 * Checks whether level 3 logging is enabled.
1187 */
1188#define LogRelIs3Enabled() LogRelIsItEnabled(LOG_REL_INSTANCE, RTLOGGRPFLAGS_LEVEL_3, LOG_GROUP)
1189
1190/** @def LogRelIs4Enabled
1191 * Checks whether level 4 logging is enabled.
1192 */
1193#define LogRelIs4Enabled() LogRelIsItEnabled(LOG_REL_INSTANCE, RTLOGGRPFLAGS_LEVEL_4, LOG_GROUP)
1194
1195/** @def LogRelIs5Enabled
1196 * Checks whether level 5 logging is enabled.
1197 */
1198#define LogRelIs5Enabled() LogRelIsItEnabled(LOG_REL_INSTANCE, RTLOGGRPFLAGS_LEVEL_5, LOG_GROUP)
1199
1200/** @def LogRelIs6Enabled
1201 * Checks whether level 6 logging is enabled.
1202 */
1203#define LogRelIs6Enabled() LogRelIsItEnabled(LOG_REL_INSTANCE, RTLOGGRPFLAGS_LEVEL_6, LOG_GROUP)
1204
1205/** @def LogRelIsFlowEnabled
1206 * Checks whether execution flow logging is enabled.
1207 */
1208#define LogRelIsFlowEnabled() LogRelIsItEnabled(LOG_REL_INSTANCE, RTLOGGRPFLAGS_FLOW, LOG_GROUP)
1209
1210
1211#ifndef IN_RC
1212/**
1213 * Sets the default release logger instance.
1214 *
1215 * @returns The old default instance.
1216 * @param pLogger The new default release logger instance.
1217 */
1218RTDECL(PRTLOGGER) RTLogRelSetDefaultInstance(PRTLOGGER pLogger);
1219#endif /* !IN_RC */
1220
1221/**
1222 * Gets the default release logger instance.
1223 *
1224 * @returns Pointer to default release logger instance.
1225 * @returns NULL if no default release logger instance available.
1226 */
1227RTDECL(PRTLOGGER) RTLogRelDefaultInstance(void);
1228
1229/** Internal worker function.
1230 * Don't call directly, use the LogRelIsItEnabled macro!
1231 */
1232DECLINLINE(bool) LogRelIsItEnabledInternal(void *pvInst, unsigned iGroup, unsigned fFlags)
1233{
1234 register PRTLOGGER pLogger = (PRTLOGGER)pvInst ? (PRTLOGGER)pvInst : RTLogRelDefaultInstance();
1235 if ( pLogger
1236 && !(pLogger->fFlags & RTLOGFLAGS_DISABLED))
1237 {
1238 register unsigned fGrpFlags = pLogger->afGroups[(unsigned)iGroup < pLogger->cGroups ? (unsigned)iGroup : 0];
1239 if ((fGrpFlags & (fFlags | RTLOGGRPFLAGS_ENABLED)) == (fFlags | RTLOGGRPFLAGS_ENABLED))
1240 return true;
1241 }
1242 return false;
1243}
1244
1245/**
1246 * Write to a logger instance, defaulting to the release one.
1247 *
1248 * This function will check whether the instance, group and flags makes up a
1249 * logging kind which is currently enabled before writing anything to the log.
1250 *
1251 * @param pLogger Pointer to logger instance.
1252 * @param fFlags The logging flags.
1253 * @param iGroup The group.
1254 * The value ~0U is reserved for compatibility with RTLogLogger[V] and is
1255 * only for internal usage!
1256 * @param pszFormat Format string.
1257 * @param ... Format arguments.
1258 * @remark This is a worker function for LogRelIt.
1259 */
1260RTDECL(void) RTLogRelLogger(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup, const char *pszFormat, ...);
1261
1262/**
1263 * Write to a logger instance, defaulting to the release one.
1264 *
1265 * This function will check whether the instance, group and flags makes up a
1266 * logging kind which is currently enabled before writing anything to the log.
1267 *
1268 * @param pLogger Pointer to logger instance. If NULL the default release instance is attempted.
1269 * @param fFlags The logging flags.
1270 * @param iGroup The group.
1271 * The value ~0U is reserved for compatibility with RTLogLogger[V] and is
1272 * only for internal usage!
1273 * @param pszFormat Format string.
1274 * @param args Format arguments.
1275 */
1276RTDECL(void) RTLogRelLoggerV(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup, const char *pszFormat, va_list args);
1277
1278/**
1279 * printf like function for writing to the default release log.
1280 *
1281 * @param pszFormat Printf like format string.
1282 * @param ... Optional arguments as specified in pszFormat.
1283 *
1284 * @remark The API doesn't support formatting of floating point numbers at the moment.
1285 */
1286RTDECL(void) RTLogRelPrintf(const char *pszFormat, ...);
1287
1288/**
1289 * vprintf like function for writing to the default release log.
1290 *
1291 * @param pszFormat Printf like format string.
1292 * @param args Optional arguments as specified in pszFormat.
1293 *
1294 * @remark The API doesn't support formatting of floating point numbers at the moment.
1295 */
1296RTDECL(void) RTLogRelPrintfV(const char *pszFormat, va_list args);
1297
1298/**
1299 * Changes the buffering setting of the default release logger.
1300 *
1301 * This can be used for optimizing longish logging sequences.
1302 *
1303 * @returns The old state.
1304 * @param fBuffered The new state.
1305 */
1306RTDECL(bool) RTLogRelSetBuffering(bool fBuffered);
1307
1308/** @} */
1309
1310
1311
1312/** @name COM port logging
1313 * {
1314 */
1315
1316#ifdef DOXYGEN_RUNNING
1317# define LOG_TO_COM
1318# define LOG_NO_COM
1319#endif
1320
1321/** @def LOG_TO_COM
1322 * Redirects the normal logging macros to the serial versions.
1323 */
1324
1325/** @def LOG_NO_COM
1326 * Disables all LogCom* macros.
1327 */
1328
1329/** @def LogCom
1330 * Generic logging to serial port.
1331 */
1332#if defined(LOG_ENABLED) && !defined(LOG_NO_COM)
1333# define LogCom(a) RTLogComPrintf a
1334#else
1335# define LogCom(a) do { } while (0)
1336#endif
1337
1338/** @def LogComFlow
1339 * Logging to serial port of execution flow.
1340 */
1341#if defined(LOG_ENABLED) && defined(LOG_ENABLE_FLOW) && !defined(LOG_NO_COM)
1342# define LogComFlow(a) RTLogComPrintf a
1343#else
1344# define LogComFlow(a) do { } while (0)
1345#endif
1346
1347#ifdef LOG_TO_COM
1348# undef Log
1349# define Log(a) LogCom(a)
1350# undef LogFlow
1351# define LogFlow(a) LogComFlow(a)
1352#endif
1353
1354/** @} */
1355
1356
1357/** @name Backdoor Logging
1358 * @{
1359 */
1360
1361#ifdef DOXYGEN_RUNNING
1362# define LOG_TO_BACKDOOR
1363# define LOG_NO_BACKDOOR
1364#endif
1365
1366/** @def LOG_TO_BACKDOOR
1367 * Redirects the normal logging macros to the backdoor versions.
1368 */
1369
1370/** @def LOG_NO_BACKDOOR
1371 * Disables all LogBackdoor* macros.
1372 */
1373
1374/** @def LogBackdoor
1375 * Generic logging to the VBox backdoor via port I/O.
1376 */
1377#if defined(LOG_ENABLED) && !defined(LOG_NO_BACKDOOR)
1378# define LogBackdoor(a) RTLogBackdoorPrintf a
1379#else
1380# define LogBackdoor(a) do { } while (0)
1381#endif
1382
1383/** @def LogBackdoorFlow
1384 * Logging of execution flow messages to the backdoor I/O port.
1385 */
1386#if defined(LOG_ENABLED) && !defined(LOG_NO_BACKDOOR)
1387# define LogBackdoorFlow(a) RTLogBackdoorPrintf a
1388#else
1389# define LogBackdoorFlow(a) do { } while (0)
1390#endif
1391
1392/** @def LogRelBackdoor
1393 * Release logging to the VBox backdoor via port I/O.
1394 */
1395#if !defined(LOG_NO_BACKDOOR)
1396# define LogRelBackdoor(a) RTLogBackdoorPrintf a
1397#else
1398# define LogRelBackdoor(a) do { } while (0)
1399#endif
1400
1401#ifdef LOG_TO_BACKDOOR
1402# undef Log
1403# define Log(a) LogBackdoor(a)
1404# undef LogFlow
1405# define LogFlow(a) LogBackdoorFlow(a)
1406# undef LogRel
1407# define LogRel(a) LogRelBackdoor(a)
1408# if defined(LOG_USE_C99)
1409# undef _LogIt
1410# define _LogIt(a_pvInst, a_fFlags, a_iGroup, ...) LogBackdoor((__VA_ARGS__))
1411# endif
1412#endif
1413
1414/** @} */
1415
1416
1417
1418/**
1419 * Gets the default logger instance, creating it if necessary.
1420 *
1421 * @returns Pointer to default logger instance.
1422 * @returns NULL if no default logger instance available.
1423 */
1424RTDECL(PRTLOGGER) RTLogDefaultInstance(void);
1425
1426/**
1427 * Gets the default logger instance.
1428 *
1429 * @returns Pointer to default logger instance.
1430 * @returns NULL if no default logger instance available.
1431 */
1432RTDECL(PRTLOGGER) RTLogGetDefaultInstance(void);
1433
1434#ifndef IN_RC
1435/**
1436 * Sets the default logger instance.
1437 *
1438 * @returns The old default instance.
1439 * @param pLogger The new default logger instance.
1440 */
1441RTDECL(PRTLOGGER) RTLogSetDefaultInstance(PRTLOGGER pLogger);
1442#endif /* !IN_RC */
1443
1444#ifdef IN_RING0
1445/**
1446 * Changes the default logger instance for the current thread.
1447 *
1448 * @returns IPRT status code.
1449 * @param pLogger The logger instance. Pass NULL for deregistration.
1450 * @param uKey Associated key for cleanup purposes. If pLogger is NULL,
1451 * all instances with this key will be deregistered. So in
1452 * order to only deregister the instance associated with the
1453 * current thread use 0.
1454 */
1455RTDECL(int) RTLogSetDefaultInstanceThread(PRTLOGGER pLogger, uintptr_t uKey);
1456#endif /* IN_RING0 */
1457
1458
1459#ifdef LOG_ENABLED
1460/** Internal worker function.
1461 * Don't call directly, use the LogIsItEnabled macro!
1462 */
1463DECLINLINE(bool) LogIsItEnabledInternal(void *pvInst, unsigned iGroup, unsigned fFlags)
1464{
1465 register PRTLOGGER pLogger = (PRTLOGGER)pvInst ? (PRTLOGGER)pvInst : RTLogDefaultInstance();
1466 if ( pLogger
1467 && !(pLogger->fFlags & RTLOGFLAGS_DISABLED))
1468 {
1469 register unsigned fGrpFlags = pLogger->afGroups[(unsigned)iGroup < pLogger->cGroups ? (unsigned)iGroup : 0];
1470 if ((fGrpFlags & (fFlags | RTLOGGRPFLAGS_ENABLED)) == (fFlags | RTLOGGRPFLAGS_ENABLED))
1471 return true;
1472 }
1473 return false;
1474}
1475#endif
1476
1477
1478#ifndef IN_RC
1479/**
1480 * Creates the default logger instance for a iprt users.
1481 *
1482 * Any user of the logging features will need to implement
1483 * this or use the generic dummy.
1484 *
1485 * @returns Pointer to the logger instance.
1486 */
1487RTDECL(PRTLOGGER) RTLogDefaultInit(void);
1488
1489/**
1490 * Create a logger instance.
1491 *
1492 * @returns iprt status code.
1493 *
1494 * @param ppLogger Where to store the logger instance.
1495 * @param fFlags Logger instance flags, a combination of the
1496 * RTLOGFLAGS_* values.
1497 * @param pszGroupSettings The initial group settings.
1498 * @param pszEnvVarBase Base name for the environment variables for
1499 * this instance.
1500 * @param cGroups Number of groups in the array.
1501 * @param papszGroups Pointer to array of groups. This must stick
1502 * around for the life of the logger instance.
1503 * @param fDestFlags The destination flags. RTLOGDEST_FILE is ORed
1504 * if pszFilenameFmt specified.
1505 * @param pszFilenameFmt Log filename format string. Standard
1506 * RTStrFormat().
1507 * @param ... Format arguments.
1508 */
1509RTDECL(int) RTLogCreate(PRTLOGGER *ppLogger, uint32_t fFlags, const char *pszGroupSettings,
1510 const char *pszEnvVarBase, unsigned cGroups, const char * const * papszGroups,
1511 uint32_t fDestFlags, const char *pszFilenameFmt, ...);
1512
1513/**
1514 * Create a logger instance.
1515 *
1516 * @returns iprt status code.
1517 *
1518 * @param ppLogger Where to store the logger instance.
1519 * @param fFlags Logger instance flags, a combination of the
1520 * RTLOGFLAGS_* values.
1521 * @param pszGroupSettings The initial group settings.
1522 * @param pszEnvVarBase Base name for the environment variables for
1523 * this instance.
1524 * @param cGroups Number of groups in the array.
1525 * @param papszGroups Pointer to array of groups. This must stick
1526 * around for the life of the logger instance.
1527 * @param fDestFlags The destination flags. RTLOGDEST_FILE is ORed
1528 * if pszFilenameFmt specified.
1529 * @param pfnPhase Callback function for starting logging and for
1530 * ending or starting a new file for log history
1531 * rotation. NULL is OK.
1532 * @param cHistory Number of old log files to keep when performing
1533 * log history rotation. 0 means no history.
1534 * @param cbHistoryFileMax Maximum size of log file when performing
1535 * history rotation. 0 means no size limit.
1536 * @param cSecsHistoryTimeSlot Maximum time interval per log file when
1537 * performing history rotation, in seconds.
1538 * 0 means time limit.
1539 * @param pszErrorMsg A buffer which is filled with an error message if something fails. May be NULL.
1540 * @param cchErrorMsg The size of the error message buffer.
1541 * @param pszFilenameFmt Log filename format string. Standard RTStrFormat().
1542 * @param ... Format arguments.
1543 */
1544RTDECL(int) RTLogCreateEx(PRTLOGGER *ppLogger, uint32_t fFlags, const char *pszGroupSettings,
1545 const char *pszEnvVarBase, unsigned cGroups, const char * const * papszGroups,
1546 uint32_t fDestFlags, PFNRTLOGPHASE pfnPhase, uint32_t cHistory,
1547 uint64_t cbHistoryFileMax, uint32_t cSecsHistoryTimeSlot,
1548 char *pszErrorMsg, size_t cchErrorMsg, const char *pszFilenameFmt, ...);
1549
1550/**
1551 * Create a logger instance.
1552 *
1553 * @returns iprt status code.
1554 *
1555 * @param ppLogger Where to store the logger instance.
1556 * @param fFlags Logger instance flags, a combination of the
1557 * RTLOGFLAGS_* values.
1558 * @param pszGroupSettings The initial group settings.
1559 * @param pszEnvVarBase Base name for the environment variables for
1560 * this instance.
1561 * @param cGroups Number of groups in the array.
1562 * @param papszGroups Pointer to array of groups. This must stick
1563 * around for the life of the logger instance.
1564 * @param fDestFlags The destination flags. RTLOGDEST_FILE is ORed
1565 * if pszFilenameFmt specified.
1566 * @param pfnPhase Callback function for starting logging and for
1567 * ending or starting a new file for log history
1568 * rotation.
1569 * @param cHistory Number of old log files to keep when performing
1570 * log history rotation. 0 means no history.
1571 * @param cbHistoryFileMax Maximum size of log file when performing
1572 * history rotation. 0 means no size limit.
1573 * @param cSecsHistoryTimeSlot Maximum time interval per log file when
1574 * performing history rotation, in seconds.
1575 * 0 means no time limit.
1576 * @param pszErrorMsg A buffer which is filled with an error message
1577 * if something fails. May be NULL.
1578 * @param cchErrorMsg The size of the error message buffer.
1579 * @param pszFilenameFmt Log filename format string. Standard
1580 * RTStrFormat().
1581 * @param args Format arguments.
1582 */
1583RTDECL(int) RTLogCreateExV(PRTLOGGER *ppLogger, uint32_t fFlags, const char *pszGroupSettings,
1584 const char *pszEnvVarBase, unsigned cGroups, const char * const * papszGroups,
1585 uint32_t fDestFlags, PFNRTLOGPHASE pfnPhase, uint32_t cHistory,
1586 uint64_t cbHistoryFileMax, uint32_t cSecsHistoryTimeSlot,
1587 char *pszErrorMsg, size_t cchErrorMsg, const char *pszFilenameFmt, va_list args);
1588
1589/**
1590 * Create a logger instance for singled threaded ring-0 usage.
1591 *
1592 * @returns iprt status code.
1593 *
1594 * @param pLogger Where to create the logger instance.
1595 * @param cbLogger The amount of memory available for the logger instance.
1596 * @param pLoggerR0Ptr The ring-0 address corresponding to @a pLogger.
1597 * @param pfnLoggerR0Ptr Pointer to logger wrapper function.
1598 * @param pfnFlushR0Ptr Pointer to flush function.
1599 * @param fFlags Logger instance flags, a combination of the RTLOGFLAGS_* values.
1600 * @param fDestFlags The destination flags.
1601 */
1602RTDECL(int) RTLogCreateForR0(PRTLOGGER pLogger, size_t cbLogger,
1603 RTR0PTR pLoggerR0Ptr, RTR0PTR pfnLoggerR0Ptr, RTR0PTR pfnFlushR0Ptr,
1604 uint32_t fFlags, uint32_t fDestFlags);
1605
1606/**
1607 * Calculates the minimum size of a ring-0 logger instance.
1608 *
1609 * @returns The minimum size.
1610 * @param cGroups The number of groups.
1611 * @param fFlags Relevant flags.
1612 */
1613RTDECL(size_t) RTLogCalcSizeForR0(uint32_t cGroups, uint32_t fFlags);
1614
1615/**
1616 * Destroys a logger instance.
1617 *
1618 * The instance is flushed and all output destinations closed (where applicable).
1619 *
1620 * @returns iprt status code.
1621 * @param pLogger The logger instance which close destroyed. NULL is fine.
1622 */
1623RTDECL(int) RTLogDestroy(PRTLOGGER pLogger);
1624
1625/**
1626 * Create a logger instance clone for RC usage.
1627 *
1628 * @returns iprt status code.
1629 *
1630 * @param pLogger The logger instance to be cloned.
1631 * @param pLoggerRC Where to create the RC logger instance.
1632 * @param cbLoggerRC Amount of memory allocated to for the RC logger
1633 * instance clone.
1634 * @param pfnLoggerRCPtr Pointer to logger wrapper function for this
1635 * instance (RC Ptr).
1636 * @param pfnFlushRCPtr Pointer to flush function (RC Ptr).
1637 * @param fFlags Logger instance flags, a combination of the RTLOGFLAGS_* values.
1638 */
1639RTDECL(int) RTLogCloneRC(PRTLOGGER pLogger, PRTLOGGERRC pLoggerRC, size_t cbLoggerRC,
1640 RTRCPTR pfnLoggerRCPtr, RTRCPTR pfnFlushRCPtr, uint32_t fFlags);
1641
1642/**
1643 * Flushes a RC logger instance to a R3 logger.
1644 *
1645 * @returns iprt status code.
1646 * @param pLogger The R3 logger instance to flush pLoggerRC to. If NULL
1647 * the default logger is used.
1648 * @param pLoggerRC The RC logger instance to flush.
1649 */
1650RTDECL(void) RTLogFlushRC(PRTLOGGER pLogger, PRTLOGGERRC pLoggerRC);
1651
1652/**
1653 * Flushes the buffer in one logger instance onto another logger.
1654 *
1655 * @returns iprt status code.
1656 *
1657 * @param pSrcLogger The logger instance to flush.
1658 * @param pDstLogger The logger instance to flush onto.
1659 * If NULL the default logger will be used.
1660 */
1661RTDECL(void) RTLogFlushToLogger(PRTLOGGER pSrcLogger, PRTLOGGER pDstLogger);
1662
1663/**
1664 * Flushes a R0 logger instance to a R3 logger.
1665 *
1666 * @returns iprt status code.
1667 * @param pLogger The R3 logger instance to flush pLoggerR0 to. If NULL
1668 * the default logger is used.
1669 * @param pLoggerR0 The R0 logger instance to flush.
1670 */
1671RTDECL(void) RTLogFlushR0(PRTLOGGER pLogger, PRTLOGGER pLoggerR0);
1672
1673/**
1674 * Sets the custom prefix callback.
1675 *
1676 * @returns IPRT status code.
1677 * @param pLogger The logger instance.
1678 * @param pfnCallback The callback.
1679 * @param pvUser The user argument for the callback.
1680 * */
1681RTDECL(int) RTLogSetCustomPrefixCallback(PRTLOGGER pLogger, PFNRTLOGPREFIX pfnCallback, void *pvUser);
1682
1683/**
1684 * Same as RTLogSetCustomPrefixCallback for loggers created by
1685 * RTLogCreateForR0.
1686 *
1687 * @returns IPRT status code.
1688 * @param pLogger The logger instance.
1689 * @param pLoggerR0Ptr The ring-0 address corresponding to @a pLogger.
1690 * @param pfnCallbackR0Ptr The callback.
1691 * @param pvUserR0Ptr The user argument for the callback.
1692 * */
1693RTDECL(int) RTLogSetCustomPrefixCallbackForR0(PRTLOGGER pLogger, RTR0PTR pLoggerR0Ptr,
1694 RTR0PTR pfnCallbackR0Ptr, RTR0PTR pvUserR0Ptr);
1695
1696/**
1697 * Copies the group settings and flags from logger instance to another.
1698 *
1699 * @returns IPRT status code.
1700 * @param pDstLogger The destination logger instance.
1701 * @param pDstLoggerR0Ptr The ring-0 address corresponding to @a pDstLogger.
1702 * @param pSrcLogger The source logger instance. If NULL the default one is used.
1703 * @param fFlagsOr OR mask for the flags.
1704 * @param fFlagsAnd AND mask for the flags.
1705 */
1706RTDECL(int) RTLogCopyGroupsAndFlagsForR0(PRTLOGGER pDstLogger, RTR0PTR pDstLoggerR0Ptr,
1707 PCRTLOGGER pSrcLogger, uint32_t fFlagsOr, uint32_t fFlagsAnd);
1708
1709/**
1710 * Get the current log group settings as a string.
1711 *
1712 * @returns VINF_SUCCESS or VERR_BUFFER_OVERFLOW.
1713 * @param pLogger Logger instance (NULL for default logger).
1714 * @param pszBuf The output buffer.
1715 * @param cchBuf The size of the output buffer. Must be greater
1716 * than zero.
1717 */
1718RTDECL(int) RTLogGetGroupSettings(PRTLOGGER pLogger, char *pszBuf, size_t cchBuf);
1719
1720/**
1721 * Updates the group settings for the logger instance using the specified
1722 * specification string.
1723 *
1724 * @returns iprt status code.
1725 * Failures can safely be ignored.
1726 * @param pLogger Logger instance (NULL for default logger).
1727 * @param pszValue Value to parse.
1728 */
1729RTDECL(int) RTLogGroupSettings(PRTLOGGER pLogger, const char *pszValue);
1730#endif /* !IN_RC */
1731
1732/**
1733 * Updates the flags for the logger instance using the specified
1734 * specification string.
1735 *
1736 * @returns iprt status code.
1737 * Failures can safely be ignored.
1738 * @param pLogger Logger instance (NULL for default logger).
1739 * @param pszValue Value to parse.
1740 */
1741RTDECL(int) RTLogFlags(PRTLOGGER pLogger, const char *pszValue);
1742
1743/**
1744 * Changes the buffering setting of the specified logger.
1745 *
1746 * This can be used for optimizing longish logging sequences.
1747 *
1748 * @returns The old state.
1749 * @param pLogger The logger instance (NULL is an alias for the
1750 * default logger).
1751 * @param fBuffered The new state.
1752 */
1753RTDECL(bool) RTLogSetBuffering(PRTLOGGER pLogger, bool fBuffered);
1754
1755/**
1756 * Sets the max number of entries per group.
1757 *
1758 * @returns Old restriction.
1759 *
1760 * @param pLogger The logger instance (NULL is an alias for the
1761 * default logger).
1762 * @param cMaxEntriesPerGroup The max number of entries per group.
1763 *
1764 * @remarks Lowering the limit of an active logger may quietly mute groups.
1765 * Raising it may reactive already muted groups.
1766 */
1767RTDECL(uint32_t) RTLogSetGroupLimit(PRTLOGGER pLogger, uint32_t cMaxEntriesPerGroup);
1768
1769#ifndef IN_RC
1770/**
1771 * Get the current log flags as a string.
1772 *
1773 * @returns VINF_SUCCESS or VERR_BUFFER_OVERFLOW.
1774 * @param pLogger Logger instance (NULL for default logger).
1775 * @param pszBuf The output buffer.
1776 * @param cchBuf The size of the output buffer. Must be greater
1777 * than zero.
1778 */
1779RTDECL(int) RTLogGetFlags(PRTLOGGER pLogger, char *pszBuf, size_t cchBuf);
1780
1781/**
1782 * Updates the logger destination using the specified string.
1783 *
1784 * @returns VINF_SUCCESS or VERR_BUFFER_OVERFLOW.
1785 * @param pLogger Logger instance (NULL for default logger).
1786 * @param pszValue The value to parse.
1787 */
1788RTDECL(int) RTLogDestinations(PRTLOGGER pLogger, char const *pszValue);
1789
1790/**
1791 * Get the current log destinations as a string.
1792 *
1793 * @returns VINF_SUCCESS or VERR_BUFFER_OVERFLOW.
1794 * @param pLogger Logger instance (NULL for default logger).
1795 * @param pszBuf The output buffer.
1796 * @param cchBuf The size of the output buffer. Must be greater
1797 * than 0.
1798 */
1799RTDECL(int) RTLogGetDestinations(PRTLOGGER pLogger, char *pszBuf, size_t cchBuf);
1800#endif /* !IN_RC */
1801
1802/**
1803 * Flushes the specified logger.
1804 *
1805 * @param pLogger The logger instance to flush.
1806 * If NULL the default instance is used. The default instance
1807 * will not be initialized by this call.
1808 */
1809RTDECL(void) RTLogFlush(PRTLOGGER pLogger);
1810
1811/**
1812 * Write to a logger instance.
1813 *
1814 * @param pLogger Pointer to logger instance.
1815 * @param pvCallerRet Ignored.
1816 * @param pszFormat Format string.
1817 * @param ... Format arguments.
1818 */
1819RTDECL(void) RTLogLogger(PRTLOGGER pLogger, void *pvCallerRet, const char *pszFormat, ...);
1820
1821/**
1822 * Write to a logger instance.
1823 *
1824 * @param pLogger Pointer to logger instance.
1825 * @param pszFormat Format string.
1826 * @param args Format arguments.
1827 */
1828RTDECL(void) RTLogLoggerV(PRTLOGGER pLogger, const char *pszFormat, va_list args);
1829
1830/**
1831 * Write to a logger instance.
1832 *
1833 * This function will check whether the instance, group and flags makes up a
1834 * logging kind which is currently enabled before writing anything to the log.
1835 *
1836 * @param pLogger Pointer to logger instance. If NULL the default logger instance will be attempted.
1837 * @param fFlags The logging flags.
1838 * @param iGroup The group.
1839 * The value ~0U is reserved for compatibility with RTLogLogger[V] and is
1840 * only for internal usage!
1841 * @param pszFormat Format string.
1842 * @param ... Format arguments.
1843 * @remark This is a worker function of LogIt.
1844 */
1845RTDECL(void) RTLogLoggerEx(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup, const char *pszFormat, ...);
1846
1847/**
1848 * Write to a logger instance.
1849 *
1850 * This function will check whether the instance, group and flags makes up a
1851 * logging kind which is currently enabled before writing anything to the log.
1852 *
1853 * @param pLogger Pointer to logger instance. If NULL the default logger instance will be attempted.
1854 * @param fFlags The logging flags.
1855 * @param iGroup The group.
1856 * The value ~0U is reserved for compatibility with RTLogLogger[V] and is
1857 * only for internal usage!
1858 * @param pszFormat Format string.
1859 * @param args Format arguments.
1860 */
1861RTDECL(void) RTLogLoggerExV(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup, const char *pszFormat, va_list args);
1862
1863/**
1864 * printf like function for writing to the default log.
1865 *
1866 * @param pszFormat Printf like format string.
1867 * @param ... Optional arguments as specified in pszFormat.
1868 *
1869 * @remark The API doesn't support formatting of floating point numbers at the moment.
1870 */
1871RTDECL(void) RTLogPrintf(const char *pszFormat, ...);
1872
1873/**
1874 * vprintf like function for writing to the default log.
1875 *
1876 * @param pszFormat Printf like format string.
1877 * @param args Optional arguments as specified in pszFormat.
1878 *
1879 * @remark The API doesn't support formatting of floating point numbers at the moment.
1880 */
1881RTDECL(void) RTLogPrintfV(const char *pszFormat, va_list args);
1882
1883/**
1884 * Dumper vprintf-like function outputting to a logger.
1885 *
1886 * @param pvUser Pointer to the logger instance to use, NULL for
1887 * default instance.
1888 * @param pszFormat Format string.
1889 * @param va Format arguments.
1890 */
1891RTDECL(void) RTLogDumpPrintfV(void *pvUser, const char *pszFormat, va_list va);
1892
1893
1894#ifndef DECLARED_FNRTSTROUTPUT /* duplicated in iprt/string.h */
1895#define DECLARED_FNRTSTROUTPUT
1896/**
1897 * Output callback.
1898 *
1899 * @returns number of bytes written.
1900 * @param pvArg User argument.
1901 * @param pachChars Pointer to an array of utf-8 characters.
1902 * @param cbChars Number of bytes in the character array pointed to by pachChars.
1903 */
1904typedef DECLCALLBACK(size_t) FNRTSTROUTPUT(void *pvArg, const char *pachChars, size_t cbChars);
1905/** Pointer to callback function. */
1906typedef FNRTSTROUTPUT *PFNRTSTROUTPUT;
1907#endif
1908
1909/**
1910 * Partial vsprintf worker implementation.
1911 *
1912 * @returns number of bytes formatted.
1913 * @param pfnOutput Output worker.
1914 * Called in two ways. Normally with a string an it's length.
1915 * For termination, it's called with NULL for string, 0 for length.
1916 * @param pvArg Argument to output worker.
1917 * @param pszFormat Format string.
1918 * @param args Argument list.
1919 */
1920RTDECL(size_t) RTLogFormatV(PFNRTSTROUTPUT pfnOutput, void *pvArg, const char *pszFormat, va_list args);
1921
1922/**
1923 * Write log buffer to COM port.
1924 *
1925 * @param pach Pointer to the buffer to write.
1926 * @param cb Number of bytes to write.
1927 */
1928RTDECL(void) RTLogWriteCom(const char *pach, size_t cb);
1929
1930/**
1931 * Prints a formatted string to the serial port used for logging.
1932 *
1933 * @returns Number of bytes written.
1934 * @param pszFormat Format string.
1935 * @param ... Optional arguments specified in the format string.
1936 */
1937RTDECL(size_t) RTLogComPrintf(const char *pszFormat, ...);
1938
1939/**
1940 * Prints a formatted string to the serial port used for logging.
1941 *
1942 * @returns Number of bytes written.
1943 * @param pszFormat Format string.
1944 * @param args Optional arguments specified in the format string.
1945 */
1946RTDECL(size_t) RTLogComPrintfV(const char *pszFormat, va_list args);
1947
1948
1949#if 0 /* not implemented yet */
1950
1951/** Indicates that the semaphores shall be used to notify the other
1952 * part about buffer changes. */
1953#define LOGHOOKBUFFER_FLAGS_SEMAPHORED 1
1954
1955/**
1956 * Log Hook Buffer.
1957 * Use to communicate between the logger and a log consumer.
1958 */
1959typedef struct RTLOGHOOKBUFFER
1960{
1961 /** Write pointer. */
1962 volatile void *pvWrite;
1963 /** Read pointer. */
1964 volatile void *pvRead;
1965 /** Buffer start. */
1966 void *pvStart;
1967 /** Buffer end (exclusive). */
1968 void *pvEnd;
1969 /** Signaling semaphore used by the writer to wait on a full buffer.
1970 * Only used when indicated in flags. */
1971 void *pvSemWriter;
1972 /** Signaling semaphore used by the read to wait on an empty buffer.
1973 * Only used when indicated in flags. */
1974 void *pvSemReader;
1975 /** Buffer flags. Current reserved and set to zero. */
1976 volatile unsigned fFlags;
1977} RTLOGHOOKBUFFER;
1978/** Pointer to a log hook buffer. */
1979typedef RTLOGHOOKBUFFER *PRTLOGHOOKBUFFER;
1980
1981
1982/**
1983 * Register a logging hook.
1984 *
1985 * This type of logging hooks are expecting different threads acting
1986 * producer and consumer. They share a circular buffer which have two
1987 * pointers one for each end. When the buffer is full there are two
1988 * alternatives (indicated by a buffer flag), either wait for the
1989 * consumer to get it's job done, or to write a generic message saying
1990 * buffer overflow.
1991 *
1992 * Since the waiting would need a signal semaphore, we'll skip that for now.
1993 *
1994 * @returns iprt status code.
1995 * @param pBuffer Pointer to a logger hook buffer.
1996 */
1997RTDECL(int) RTLogRegisterHook(PRTLOGGER pLogger, PRTLOGHOOKBUFFER pBuffer);
1998
1999/**
2000 * Deregister a logging hook registered with RTLogRegisterHook().
2001 *
2002 * @returns iprt status code.
2003 * @param pBuffer Pointer to a logger hook buffer.
2004 */
2005RTDECL(int) RTLogDeregisterHook(PRTLOGGER pLogger, PRTLOGHOOKBUFFER pBuffer);
2006
2007#endif /* not implemented yet */
2008
2009
2010
2011/**
2012 * Write log buffer to a debugger (RTLOGDEST_DEBUGGER).
2013 *
2014 * @param pach What to write.
2015 * @param cb How much to write.
2016 * @remark When linking statically, this function can be replaced by defining your own.
2017 */
2018RTDECL(void) RTLogWriteDebugger(const char *pach, size_t cb);
2019
2020/**
2021 * Write log buffer to a user defined output stream (RTLOGDEST_USER).
2022 *
2023 * @param pach What to write.
2024 * @param cb How much to write.
2025 * @remark When linking statically, this function can be replaced by defining your own.
2026 */
2027RTDECL(void) RTLogWriteUser(const char *pach, size_t cb);
2028
2029/**
2030 * Write log buffer to stdout (RTLOGDEST_STDOUT).
2031 *
2032 * @param pach What to write.
2033 * @param cb How much to write.
2034 * @remark When linking statically, this function can be replaced by defining your own.
2035 */
2036RTDECL(void) RTLogWriteStdOut(const char *pach, size_t cb);
2037
2038/**
2039 * Write log buffer to stdout (RTLOGDEST_STDERR).
2040 *
2041 * @param pach What to write.
2042 * @param cb How much to write.
2043 * @remark When linking statically, this function can be replaced by defining your own.
2044 */
2045RTDECL(void) RTLogWriteStdErr(const char *pach, size_t cb);
2046
2047#ifdef VBOX
2048
2049/**
2050 * Prints a formatted string to the backdoor port.
2051 *
2052 * @returns Number of bytes written.
2053 * @param pszFormat Format string.
2054 * @param ... Optional arguments specified in the format string.
2055 */
2056RTDECL(size_t) RTLogBackdoorPrintf(const char *pszFormat, ...);
2057
2058/**
2059 * Prints a formatted string to the backdoor port.
2060 *
2061 * @returns Number of bytes written.
2062 * @param pszFormat Format string.
2063 * @param args Optional arguments specified in the format string.
2064 */
2065RTDECL(size_t) RTLogBackdoorPrintfV(const char *pszFormat, va_list args);
2066
2067#endif /* VBOX */
2068
2069RT_C_DECLS_END
2070
2071/** @} */
2072
2073#endif
2074
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette