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 : 167043579 : get_log_flag(const char *name)
14 : : {
15 : 319 : struct spdk_log_flag *flag;
16 : :
17 [ + + - + : 5097016251 : TAILQ_FOREACH(flag, &g_log_flags, tailq) {
- + - + ]
18 [ + + + + : 5096854518 : if (strcasecmp(name, flag->name) == 0) {
+ + + - +
+ ]
19 : 166881846 : return flag;
20 : : }
21 : 26425070 : }
22 : :
23 : 161733 : return NULL;
24 : 704771 : }
25 : :
26 : : void
27 : 161733 : spdk_log_register_flag(const char *name, struct spdk_log_flag *flag)
28 : : {
29 : 269 : struct spdk_log_flag *iter;
30 : :
31 [ + - - + ]: 161733 : if (name == NULL || flag == NULL) {
32 : 0 : SPDK_ERRLOG("missing spdk_log_flag parameters\n");
33 [ # # ]: 0 : assert(false);
34 : : return;
35 : : }
36 : :
37 [ + + ]: 161733 : 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 [ + + + - : 2487557 : TAILQ_FOREACH(iter, &g_log_flags, tailq) {
+ - + - ]
44 [ + + + + : 2465739 : if (strcasecmp(iter->name, flag->name) > 0) {
+ + + - +
- + - +
+ ]
45 [ + - + - : 139915 : TAILQ_INSERT_BEFORE(iter, flag, tailq);
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - ]
46 : 139915 : return;
47 : : }
48 : 103510 : }
49 : :
50 [ + - + - : 21818 : TAILQ_INSERT_TAIL(&g_log_flags, flag, tailq);
+ - + - +
- + - + -
+ - + - +
- + - +
- ]
51 [ - + ]: 5461 : }
52 : :
53 : : bool
54 : 166881846 : spdk_log_get_flag(const char *name)
55 : : {
56 : 166881846 : struct spdk_log_flag *flag = get_log_flag(name);
57 : :
58 [ + - + + : 166881846 : if (flag && flag->enabled) {
+ + + - +
+ ]
59 : 709 : return true;
60 : : }
61 : :
62 : 166881137 : return false;
63 : 699310 : }
64 : :
65 : : static int
66 : 243 : log_set_flag(const char *name, bool value)
67 : : {
68 : 3 : struct spdk_log_flag *flag;
69 : 243 : int rc = -EINVAL;
70 : :
71 [ + + + + : 243 : if (strcasecmp(name, "all") == 0) {
+ - ]
72 [ + + # # : 120 : TAILQ_FOREACH(flag, &g_log_flags, tailq) {
# # # # ]
73 [ # # # # : 112 : flag->enabled = value;
# # ]
74 : 0 : }
75 : 8 : return 0;
76 : : }
77 : :
78 [ + + + - : 13459 : TAILQ_FOREACH(flag, &g_log_flags, tailq) {
+ - + - ]
79 [ + + + - : 13224 : if (fnmatch(name, flag->name, FNM_CASEFOLD) == 0) {
- + + - -
+ ]
80 [ + - + - : 235 : flag->enabled = value;
+ - ]
81 : 235 : rc = 0;
82 : 3 : }
83 : 3 : }
84 : :
85 : 235 : return rc;
86 : 3 : }
87 : :
88 : : int
89 : 235 : spdk_log_set_flag(const char *name)
90 : : {
91 : 235 : return log_set_flag(name, true);
92 : : }
93 : :
94 : : int
95 : 8 : spdk_log_clear_flag(const char *name)
96 : : {
97 : 8 : 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 : 47 : spdk_log_usage(FILE *f, const char *log_arg)
114 : : {
115 : 3 : struct spdk_log_flag *flag;
116 [ - + - + ]: 47 : fprintf(f, " %s, --logflag <flag> enable log flag (all", log_arg);
117 : :
118 [ + + - + : 1011 : TAILQ_FOREACH(flag, &g_log_flags, tailq) {
- + - + ]
119 [ - + - + ]: 964 : fprintf(f, ", %s", flag->name);
120 : 31 : }
121 : :
122 [ - + - + ]: 47 : fprintf(f, ")\n");
123 : 47 : }
|