]> git.proxmox.com Git - ceph.git/blame - ceph/src/spdk/lib/log/log_flags.c
import 15.2.0 Octopus source
[ceph.git] / ceph / src / spdk / lib / log / log_flags.c
CommitLineData
11fdf7f2
TL
1/*-
2 * BSD LICENSE
3 *
4 * Copyright (c) Intel Corporation.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
16 * distribution.
17 * * Neither the name of Intel Corporation nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34#include "spdk/stdinc.h"
35
36#include "spdk_internal/log.h"
37
9f95a23c 38static TAILQ_HEAD(, spdk_log_flag) g_log_flags = TAILQ_HEAD_INITIALIZER(g_log_flags);
11fdf7f2
TL
39
40enum spdk_log_level g_spdk_log_level = SPDK_LOG_NOTICE;
41enum spdk_log_level g_spdk_log_print_level = SPDK_LOG_NOTICE;
42enum spdk_log_level g_spdk_log_backtrace_level = SPDK_LOG_DISABLED;
43
44SPDK_LOG_REGISTER_COMPONENT("log", SPDK_LOG_LOG)
45
46#define MAX_TMPBUF 1024
47
48void
49spdk_log_set_level(enum spdk_log_level level)
50{
9f95a23c
TL
51 assert(level >= SPDK_LOG_DISABLED);
52 assert(level <= SPDK_LOG_DEBUG);
11fdf7f2
TL
53 g_spdk_log_level = level;
54}
55
56enum spdk_log_level
57spdk_log_get_level(void) {
58 return g_spdk_log_level;
59}
60
61void
62spdk_log_set_print_level(enum spdk_log_level level)
63{
9f95a23c
TL
64 assert(level >= SPDK_LOG_DISABLED);
65 assert(level <= SPDK_LOG_DEBUG);
11fdf7f2
TL
66 g_spdk_log_print_level = level;
67}
68
69enum spdk_log_level
70spdk_log_get_print_level(void) {
71 return g_spdk_log_print_level;
72}
73
74void
75spdk_log_set_backtrace_level(enum spdk_log_level level)
76{
9f95a23c
TL
77 assert(level >= SPDK_LOG_DISABLED);
78 assert(level <= SPDK_LOG_DEBUG);
11fdf7f2
TL
79 g_spdk_log_backtrace_level = level;
80}
81
82enum spdk_log_level
83spdk_log_get_backtrace_level(void) {
84 return g_spdk_log_backtrace_level;
85}
86
9f95a23c
TL
87static struct spdk_log_flag *
88get_log_flag(const char *name)
11fdf7f2 89{
9f95a23c 90 struct spdk_log_flag *flag;
11fdf7f2 91
9f95a23c 92 TAILQ_FOREACH(flag, &g_log_flags, tailq) {
11fdf7f2
TL
93 if (strcasecmp(name, flag->name) == 0) {
94 return flag;
95 }
96 }
97
98 return NULL;
99}
100
101void
9f95a23c 102spdk_log_register_flag(const char *name, struct spdk_log_flag *flag)
11fdf7f2 103{
9f95a23c 104 struct spdk_log_flag *iter;
11fdf7f2
TL
105
106 if (name == NULL || flag == NULL) {
9f95a23c 107 SPDK_ERRLOG("missing spdk_log_flag parameters\n");
11fdf7f2
TL
108 assert(false);
109 return;
110 }
111
9f95a23c
TL
112 if (get_log_flag(name)) {
113 SPDK_ERRLOG("duplicate spdk_log_flag '%s'\n", name);
11fdf7f2
TL
114 assert(false);
115 return;
116 }
117
9f95a23c 118 TAILQ_FOREACH(iter, &g_log_flags, tailq) {
11fdf7f2
TL
119 if (strcasecmp(iter->name, flag->name) > 0) {
120 TAILQ_INSERT_BEFORE(iter, flag, tailq);
121 return;
122 }
123 }
124
9f95a23c 125 TAILQ_INSERT_TAIL(&g_log_flags, flag, tailq);
11fdf7f2
TL
126}
127
128bool
9f95a23c 129spdk_log_get_flag(const char *name)
11fdf7f2 130{
9f95a23c 131 struct spdk_log_flag *flag = get_log_flag(name);
11fdf7f2
TL
132
133 if (flag && flag->enabled) {
134 return true;
135 }
136
137 return false;
138}
139
140static int
9f95a23c 141set_log_flag(const char *name, bool value)
11fdf7f2 142{
9f95a23c 143 struct spdk_log_flag *flag;
11fdf7f2
TL
144
145 if (strcasecmp(name, "all") == 0) {
9f95a23c 146 TAILQ_FOREACH(flag, &g_log_flags, tailq) {
11fdf7f2
TL
147 flag->enabled = value;
148 }
149 return 0;
150 }
151
9f95a23c 152 flag = get_log_flag(name);
11fdf7f2
TL
153 if (flag == NULL) {
154 return -1;
155 }
156
157 flag->enabled = value;
158
159 return 0;
160}
161
162int
9f95a23c 163spdk_log_set_flag(const char *name)
11fdf7f2 164{
9f95a23c 165 return set_log_flag(name, true);
11fdf7f2
TL
166}
167
168int
9f95a23c 169spdk_log_clear_flag(const char *name)
11fdf7f2 170{
9f95a23c 171 return set_log_flag(name, false);
11fdf7f2
TL
172}
173
9f95a23c
TL
174struct spdk_log_flag *
175spdk_log_get_first_flag(void)
11fdf7f2 176{
9f95a23c 177 return TAILQ_FIRST(&g_log_flags);
11fdf7f2
TL
178}
179
9f95a23c
TL
180struct spdk_log_flag *
181spdk_log_get_next_flag(struct spdk_log_flag *flag)
11fdf7f2
TL
182{
183 return TAILQ_NEXT(flag, tailq);
184}
185
186void
9f95a23c 187spdk_log_usage(FILE *f, const char *log_arg)
11fdf7f2
TL
188{
189#ifdef DEBUG
9f95a23c
TL
190 struct spdk_log_flag *flag;
191 fprintf(f, " %s, --logflag <flag> enable debug log flag (all", log_arg);
11fdf7f2 192
9f95a23c 193 TAILQ_FOREACH(flag, &g_log_flags, tailq) {
11fdf7f2
TL
194 fprintf(f, ", %s", flag->name);
195 }
196
197 fprintf(f, ")\n");
198#else
9f95a23c
TL
199 fprintf(f, " %s, --logflag <flag> enable debug log flag (not supported"
200 " - must reconfigure with --enable-debug)\n", log_arg);
11fdf7f2
TL
201#endif
202}