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_head,
11 : : spdk_log_flag) g_log_flags = TAILQ_HEAD_INITIALIZER(g_log_flags);
12 : :
13 : : static struct spdk_log_flag *
14 : 2093847 : get_log_flag(const char *name)
15 : : {
16 : : struct spdk_log_flag *flag;
17 : :
18 [ + + ]: 44500855 : TAILQ_FOREACH(flag, &g_log_flags, tailq) {
19 [ + + ]: 44498259 : if (strcasecmp(name, flag->name) == 0) {
20 : 2091251 : return flag;
21 : : }
22 : 42407008 : }
23 : :
24 : 2596 : return NULL;
25 : 2093847 : }
26 : :
27 : : void
28 : 2596 : spdk_log_register_flag(const char *name, struct spdk_log_flag *flag)
29 : : {
30 : : struct spdk_log_flag *iter;
31 : :
32 [ + - ]: 2596 : if (name == NULL || flag == NULL) {
33 : 0 : SPDK_ERRLOG("missing spdk_log_flag parameters\n");
34 : 0 : assert(false);
35 : : return;
36 : : }
37 : :
38 [ - + ]: 2596 : if (get_log_flag(name)) {
39 : 0 : SPDK_ERRLOG("duplicate spdk_log_flag '%s'\n", name);
40 : 0 : assert(false);
41 : : return;
42 : : }
43 : :
44 [ + + ]: 33966 : TAILQ_FOREACH(iter, &g_log_flags, tailq) {
45 [ + + ]: 33453 : if (strcasecmp(iter->name, flag->name) > 0) {
46 : 2083 : TAILQ_INSERT_BEFORE(iter, flag, tailq);
47 : 2083 : return;
48 : : }
49 : 31370 : }
50 : :
51 : 513 : TAILQ_INSERT_TAIL(&g_log_flags, flag, tailq);
52 : 2596 : }
53 : :
54 : : bool
55 : 2091097 : spdk_log_get_flag(const char *name)
56 : : {
57 : 2091097 : struct spdk_log_flag *flag = get_log_flag(name);
58 : :
59 [ + + + + ]: 2091097 : if (flag && flag->enabled) {
60 : 1 : return true;
61 : : }
62 : :
63 : 2091096 : return false;
64 : 2091083 : }
65 : :
66 : : static int
67 : 3 : log_set_flag(const char *name, bool value)
68 : : {
69 : : struct spdk_log_flag *flag;
70 : 3 : int rc = -EINVAL;
71 : :
72 [ - + ]: 3 : if (strcasecmp(name, "all") == 0) {
73 [ # # ]: 0 : TAILQ_FOREACH(flag, &g_log_flags, tailq) {
74 : 0 : flag->enabled = value;
75 : 0 : }
76 : 0 : return 0;
77 : : }
78 : :
79 [ + + ]: 6 : TAILQ_FOREACH(flag, &g_log_flags, tailq) {
80 [ + - ]: 3 : if (fnmatch(name, flag->name, FNM_CASEFOLD) == 0) {
81 : 3 : flag->enabled = value;
82 : 3 : rc = 0;
83 : 3 : }
84 : 3 : }
85 : :
86 : 3 : return rc;
87 : 3 : }
88 : :
89 : : int
90 : 2 : spdk_log_set_flag(const char *name)
91 : : {
92 : 2 : return log_set_flag(name, true);
93 : : }
94 : :
95 : : int
96 : 1 : spdk_log_clear_flag(const char *name)
97 : : {
98 : 1 : return log_set_flag(name, false);
99 : : }
100 : :
101 : : struct spdk_log_flag *
102 : 0 : spdk_log_get_first_flag(void)
103 : : {
104 : 0 : return TAILQ_FIRST(&g_log_flags);
105 : : }
106 : :
107 : : struct spdk_log_flag *
108 : 0 : spdk_log_get_next_flag(struct spdk_log_flag *flag)
109 : : {
110 : 0 : return TAILQ_NEXT(flag, tailq);
111 : : }
112 : :
113 : : void
114 : 3 : spdk_log_usage(FILE *f, const char *log_arg)
115 : : {
116 : : #define LINE_PREFIX " "
117 : : #define ENTRY_SEPARATOR ", "
118 : : #define MAX_LINE_LENGTH 100
119 : 3 : uint64_t prefix_len = strlen(LINE_PREFIX);
120 : 3 : uint64_t separator_len = strlen(ENTRY_SEPARATOR);
121 : 3 : const char *first_entry = "--logflag <flag> enable log flag (all, ";
122 : : uint64_t curr_line_len;
123 : : uint64_t curr_entry_len;
124 : : struct spdk_log_flag *flag;
125 : 3 : char first_line[MAX_LINE_LENGTH] = {};
126 : :
127 : 3 : snprintf(first_line, sizeof(first_line), " %s, %s", log_arg, first_entry);
128 : 3 : fprintf(f, "%s", first_line);
129 : 3 : curr_line_len = strlen(first_line);
130 : :
131 [ - + ]: 15 : TAILQ_FOREACH(flag, &g_log_flags, tailq) {
132 : 15 : curr_entry_len = strlen(flag->name);
133 [ + - ]: 15 : if ((curr_line_len + curr_entry_len + separator_len) > MAX_LINE_LENGTH) {
134 : 0 : fprintf(f, "\n%s", LINE_PREFIX);
135 : 0 : curr_line_len = prefix_len;
136 : 0 : }
137 : :
138 : 15 : fprintf(f, "%s", flag->name);
139 : 15 : curr_line_len += curr_entry_len;
140 : :
141 [ + + ]: 15 : if (TAILQ_LAST(&g_log_flags, spdk_log_flag_head) == flag) {
142 : 3 : break;
143 : : }
144 : :
145 : 12 : fprintf(f, "%s", ENTRY_SEPARATOR);
146 : 12 : curr_line_len += separator_len;
147 : 12 : }
148 : :
149 : 3 : fprintf(f, ")\n");
150 : 3 : }
|