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 : 154603734 : get_log_flag(const char *name)
14 : : {
15 : : struct spdk_log_flag *flag;
16 : :
17 [ + + ]: 4699994686 : TAILQ_FOREACH(flag, &g_log_flags, tailq) {
18 [ + + - + : 4699827586 : if (strcasecmp(name, flag->name) == 0) {
+ + ]
19 : 154436654 : return flag;
20 : : }
21 : : }
22 : :
23 : 167074 : return NULL;
24 : : }
25 : :
26 : : void
27 : 167074 : spdk_log_register_flag(const char *name, struct spdk_log_flag *flag)
28 : : {
29 : : struct spdk_log_flag *iter;
30 : :
31 [ + - - + ]: 167074 : if (name == NULL || flag == NULL) {
32 : 0 : SPDK_ERRLOG("missing spdk_log_flag parameters\n");
33 : 0 : assert(false);
34 : : return;
35 : : }
36 : :
37 [ - + ]: 167074 : 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 [ + + ]: 2567690 : TAILQ_FOREACH(iter, &g_log_flags, tailq) {
44 [ + + - + : 2544678 : if (strcasecmp(iter->name, flag->name) > 0) {
+ + ]
45 : 144062 : TAILQ_INSERT_BEFORE(iter, flag, tailq);
46 : 144062 : return;
47 : : }
48 : : }
49 : :
50 : 23012 : TAILQ_INSERT_TAIL(&g_log_flags, flag, tailq);
51 : : }
52 : :
53 : : bool
54 : 154436654 : spdk_log_get_flag(const char *name)
55 : : {
56 : 154436654 : struct spdk_log_flag *flag = get_log_flag(name);
57 : :
58 [ + - + + : 154436654 : if (flag && flag->enabled) {
+ + ]
59 : 679 : return true;
60 : : }
61 : :
62 : 154435975 : return false;
63 : : }
64 : :
65 : : static int
66 : 271 : log_set_flag(const char *name, bool value)
67 : : {
68 : : struct spdk_log_flag *flag;
69 : 271 : int rc = -EINVAL;
70 : :
71 [ - + + + ]: 271 : if (strcasecmp(name, "all") == 0) {
72 [ + + ]: 120 : TAILQ_FOREACH(flag, &g_log_flags, tailq) {
73 : 112 : flag->enabled = value;
74 : : }
75 : 8 : return 0;
76 : : }
77 : :
78 [ + + ]: 15279 : TAILQ_FOREACH(flag, &g_log_flags, tailq) {
79 [ + + ]: 15016 : if (fnmatch(name, flag->name, FNM_CASEFOLD) == 0) {
80 : 263 : flag->enabled = value;
81 : 263 : rc = 0;
82 : : }
83 : : }
84 : :
85 : 263 : return rc;
86 : : }
87 : :
88 : : int
89 : 263 : spdk_log_set_flag(const char *name)
90 : : {
91 : 263 : 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 : 48 : spdk_log_usage(FILE *f, const char *log_arg)
114 : : {
115 : : struct spdk_log_flag *flag;
116 [ - + - + ]: 48 : fprintf(f, " %s, --logflag <flag> enable log flag (all", log_arg);
117 : :
118 [ + + ]: 1075 : TAILQ_FOREACH(flag, &g_log_flags, tailq) {
119 [ - + - + ]: 1027 : fprintf(f, ", %s", flag->name);
120 : : }
121 : :
122 [ - + - + ]: 48 : fprintf(f, ")\n");
123 : 48 : }
|