Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright (C) 2017 Intel Corporation.
3 : : * All rights reserved.
4 : : */
5 : :
6 : : #include "spdk/stdinc.h"
7 : :
8 : : #include "spdk/log.h"
9 : :
10 : : static TAILQ_HEAD(, spdk_log_flag) g_log_flags = TAILQ_HEAD_INITIALIZER(g_log_flags);
11 : :
12 : : static struct spdk_log_flag *
13 : 179094508 : get_log_flag(const char *name)
14 : : {
15 : : struct spdk_log_flag *flag;
16 : :
17 [ + + ]: 5484952946 : TAILQ_FOREACH(flag, &g_log_flags, tailq) {
18 [ + + - + : 5484782673 : if (strcasecmp(name, flag->name) == 0) {
+ + ]
19 : 178924265 : return flag;
20 : : }
21 : : }
22 : :
23 : 170247 : return NULL;
24 : : }
25 : :
26 : : void
27 : 170247 : spdk_log_register_flag(const char *name, struct spdk_log_flag *flag)
28 : : {
29 : : struct spdk_log_flag *iter;
30 : :
31 [ + - - + ]: 170247 : if (name == NULL || flag == NULL) {
32 : 0 : SPDK_ERRLOG("missing spdk_log_flag parameters\n");
33 : 0 : assert(false);
34 : : return;
35 : : }
36 : :
37 [ - + ]: 170247 : if (get_log_flag(name)) {
38 : 0 : SPDK_ERRLOG("duplicate spdk_log_flag '%s'\n", name);
39 : 0 : assert(false);
40 : : return;
41 : : }
42 : :
43 [ + + ]: 2626276 : TAILQ_FOREACH(iter, &g_log_flags, tailq) {
44 [ + + - + : 2603526 : if (strcasecmp(iter->name, flag->name) > 0) {
+ + ]
45 : 147497 : TAILQ_INSERT_BEFORE(iter, flag, tailq);
46 : 147497 : return;
47 : : }
48 : : }
49 : :
50 : 22750 : TAILQ_INSERT_TAIL(&g_log_flags, flag, tailq);
51 : : }
52 : :
53 : : bool
54 : 178924265 : spdk_log_get_flag(const char *name)
55 : : {
56 : 178924265 : struct spdk_log_flag *flag = get_log_flag(name);
57 : :
58 [ + - + + : 178924265 : if (flag && flag->enabled) {
+ + ]
59 : 998 : return true;
60 : : }
61 : :
62 : 178923267 : return false;
63 : : }
64 : :
65 : : static int
66 : 257 : log_set_flag(const char *name, bool value)
67 : : {
68 : : struct spdk_log_flag *flag;
69 : 257 : int rc = -EINVAL;
70 : :
71 [ - + + + ]: 257 : if (strcasecmp(name, "all") == 0) {
72 [ + + ]: 150 : TAILQ_FOREACH(flag, &g_log_flags, tailq) {
73 : 140 : flag->enabled = value;
74 : : }
75 : 10 : return 0;
76 : : }
77 : :
78 [ + + ]: 14605 : TAILQ_FOREACH(flag, &g_log_flags, tailq) {
79 [ + + ]: 14358 : if (fnmatch(name, flag->name, FNM_CASEFOLD) == 0) {
80 : 247 : flag->enabled = value;
81 : 247 : rc = 0;
82 : : }
83 : : }
84 : :
85 : 247 : return rc;
86 : : }
87 : :
88 : : int
89 : 251 : spdk_log_set_flag(const char *name)
90 : : {
91 : 251 : return log_set_flag(name, true);
92 : : }
93 : :
94 : : int
95 : 6 : spdk_log_clear_flag(const char *name)
96 : : {
97 : 6 : return log_set_flag(name, false);
98 : : }
99 : :
100 : : struct spdk_log_flag *
101 : 6 : spdk_log_get_first_flag(void)
102 : : {
103 : 6 : return TAILQ_FIRST(&g_log_flags);
104 : : }
105 : :
106 : : struct spdk_log_flag *
107 : 402 : spdk_log_get_next_flag(struct spdk_log_flag *flag)
108 : : {
109 : 402 : return TAILQ_NEXT(flag, tailq);
110 : : }
111 : :
112 : : void
113 : 42 : spdk_log_usage(FILE *f, const char *log_arg)
114 : : {
115 : : struct spdk_log_flag *flag;
116 [ - + - + ]: 42 : fprintf(f, " %s, --logflag <flag> enable log flag (all", log_arg);
117 : :
118 [ + + ]: 1045 : TAILQ_FOREACH(flag, &g_log_flags, tailq) {
119 [ - + - + ]: 1003 : fprintf(f, ", %s", flag->name);
120 : : }
121 : :
122 [ - + - + ]: 42 : fprintf(f, ")\n");
123 : 42 : }
|