L4Re Operating System Framework
Interface and Usage Documentation
•All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
debug
1// vi:set ft=cpp: -*- Mode: C++ -*-
7/*
8 * (c) 2008-2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
9 * Alexander Warg <warg@os.inf.tu-dresden.de>
10 * economic rights: Technische Universität Dresden (Germany)
11 *
12 * License: see LICENSE.spdx (in this directory or the directories above)
13 */
14#pragma once
15
16#include <l4/sys/types.h>
17
18namespace L4Re { namespace Util {
19class Err
20{
21public:
22 enum Level
23 {
24 Normal = 0,
25 Fatal,
26 };
27
28 static char const *const levels[];
29
30 void tag() const
31 { cprintf("%s: %s", _component, levels[_l]); }
32
33 int printf(char const *fmt, ...) const
34 __attribute__((format(printf,2,3)));
35
36 int cprintf(char const *fmt, ...) const
37 __attribute__((format(printf,2,3)));
38
39 constexpr Err(Level l, char const *component) : _l(l), _component(component)
40 {}
41
42private:
43 Level _l;
44 char const *_component;
45};
46
47
48class Dbg
49{
50private:
51 void tag() const;
52
53#ifndef NDEBUG
54
55 unsigned long _m;
56 char const *const _component;
57 char const *const _subsys;
58
59# ifndef __clang__
60
61 int printf_impl(char const *fmt, ...) const
62 __attribute__((format(printf, 2, 3)));
63
64 int cprintf_impl(char const *fmt, ...) const
65 __attribute__((format(printf, 2, 3)));
66
67# endif
68
69public:
70 static unsigned long level;
71
72 static void set_level(unsigned long l) { level = l; }
73
74 bool is_active() const { return _m & level; }
75
76# ifdef __clang__
77
78 int printf(char const *fmt, ...) const
79 __attribute__((format(printf, 2, 3)));
80
81 int cprintf(char const *fmt, ...) const
82 __attribute__((format(printf, 2, 3)));
83
84# else
85
86 int __attribute__((always_inline, format(printf, 2, 3)))
87 printf(char const *fmt, ...) const
88 {
89 if (!(level & _m))
90 return 0;
91
92 return printf_impl(fmt, __builtin_va_arg_pack());
93 }
94
95 int __attribute__((always_inline, format(printf, 2, 3)))
96 cprintf(char const *fmt, ...) const
97 {
98 if (!(level & _m))
99 return 0;
100
101 return cprintf_impl(fmt, __builtin_va_arg_pack());
102 }
103
104# endif
105
106 explicit constexpr
107 Dbg() : _m(1), _component(0), _subsys(0) { };
108
109 explicit constexpr
110 Dbg(unsigned long mask, char const *comp, char const *subs)
111 : _m(mask), _component(comp), _subsys(subs)
112 {}
113
114#else
115
116public:
117 static void set_level(unsigned long) {}
118 bool is_active() const { return false; }
119
120 int printf(char const * /*fmt*/, ...) const
121 __attribute__((format(printf, 2, 3)))
122 { return 0; }
123
124 int cprintf(char const * /*fmt*/, ...) const
125 __attribute__((format(printf, 2, 3)))
126 { return 0; }
127
128 explicit constexpr
129 Dbg() {}
130
131 explicit constexpr
132 Dbg(unsigned long, char const *, char const *) {}
133
134#endif
135
136};
137
138}}
139
Common L4 ABI Data Types.
L4Re C++ Interfaces.
Definition cmd_control:14