L4Re Operating System Framework
Interface and Usage Documentation
Loading...
Searching...
No Matches
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(nullptr), _subsys(nullptr)
108 {}
109
110 explicit constexpr
111 Dbg(unsigned long mask) : _m(mask), _component(nullptr), _subsys(nullptr)
112 {}
113
114 explicit constexpr
115 Dbg(unsigned long mask, char const *comp, char const *subs)
116 : _m(mask), _component(comp), _subsys(subs)
117 {}
118
119#else
120
121public:
122 static void set_level(unsigned long) {}
123 bool is_active() const { return false; }
124
125 int printf(char const * /*fmt*/, ...) const
126 __attribute__((format(printf, 2, 3)))
127 { return 0; }
128
129 int cprintf(char const * /*fmt*/, ...) const
130 __attribute__((format(printf, 2, 3)))
131 { return 0; }
132
133 explicit constexpr
134 Dbg() {}
135
136 explicit constexpr
137 Dbg(unsigned long) {}
138
139 explicit constexpr
140 Dbg(unsigned long, char const *, char const *) {}
141
142#endif
143
144};
145
146}}
147
Common L4 ABI Data Types.
Documentation of the L4 Runtime Environment utility functionality in C++.
Definition l4re.dox:21
L4Re C++ Interfaces.
Definition cmd_control:14