log: print trace flag names in SPDK_TRACELOG()
Change-Id: I962ee098818f48563e67f9b4214bc3519eee48b4 Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
parent
5f3761cf7e
commit
c454900960
@ -63,20 +63,16 @@ void spdk_noticelog(const char *file, const int line, const char *func,
|
||||
const char *format, ...) __attribute__((__format__(__printf__, 4, 5)));
|
||||
void spdk_warnlog(const char *file, const int line, const char *func,
|
||||
const char *format, ...) __attribute__((__format__(__printf__, 4, 5)));
|
||||
void spdk_tracelog(const char *file, const int line,
|
||||
const char *func, const char *format, ...) __attribute__((__format__(__printf__, 4, 5)));
|
||||
void spdk_tracelog(const char *flag, const char *file, const int line,
|
||||
const char *func, const char *format, ...) __attribute__((__format__(__printf__, 5, 6)));
|
||||
void spdk_errlog(const char *file, const int line, const char *func,
|
||||
const char *format, ...) __attribute__((__format__(__printf__, 4, 5)));
|
||||
void spdk_trace_dump(const char *label, const uint8_t *buf, size_t len);
|
||||
|
||||
void spdk_log_register_trace_flag(const char *name, bool *enabled);
|
||||
bool spdk_log_get_trace_flag(const char *flag);
|
||||
int spdk_log_set_trace_flag(const char *flag);
|
||||
int spdk_log_clear_trace_flag(const char *flag);
|
||||
|
||||
size_t spdk_log_get_num_trace_flags(void);
|
||||
const char *spdk_log_get_trace_flag_name(size_t idx);
|
||||
|
||||
void spdk_open_log(void);
|
||||
void spdk_close_log(void);
|
||||
|
||||
|
@ -40,27 +40,42 @@
|
||||
#define SPDK_INTERNAL_LOG_H
|
||||
|
||||
#include "spdk/log.h"
|
||||
#include "spdk/queue.h"
|
||||
|
||||
struct spdk_trace_flag {
|
||||
TAILQ_ENTRY(spdk_trace_flag) tailq;
|
||||
const char *name;
|
||||
bool enabled;
|
||||
};
|
||||
|
||||
void spdk_log_register_trace_flag(const char *name, struct spdk_trace_flag *flag);
|
||||
|
||||
struct spdk_trace_flag *spdk_log_get_first_trace_flag(void);
|
||||
struct spdk_trace_flag *spdk_log_get_next_trace_flag(struct spdk_trace_flag *flag);
|
||||
|
||||
#ifdef DEBUG
|
||||
#define SPDK_LOG_REGISTER_TRACE_FLAG(str, flag) \
|
||||
bool flag = false; \
|
||||
struct spdk_trace_flag flag = { \
|
||||
.enabled = false, \
|
||||
.name = str, \
|
||||
}; \
|
||||
__attribute__((constructor)) static void register_trace_flag_##flag(void) \
|
||||
{ \
|
||||
spdk_log_register_trace_flag(str, &flag); \
|
||||
}
|
||||
|
||||
#define SPDK_TRACELOG(FLAG, ...) \
|
||||
do { \
|
||||
extern bool FLAG; \
|
||||
if (FLAG) { \
|
||||
spdk_tracelog(__FILE__, __LINE__, __func__, __VA_ARGS__); \
|
||||
} \
|
||||
#define SPDK_TRACELOG(FLAG, ...) \
|
||||
do { \
|
||||
extern struct spdk_trace_flag FLAG; \
|
||||
if (FLAG.enabled) { \
|
||||
spdk_tracelog(FLAG.name, __FILE__, __LINE__, __func__, __VA_ARGS__); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define SPDK_TRACEDUMP(FLAG, LABEL, BUF, LEN) \
|
||||
do { \
|
||||
extern bool FLAG; \
|
||||
if ((FLAG) && (LEN)) { \
|
||||
extern struct spdk_trace_flag FLAG; \
|
||||
if ((FLAG.enabled) && (LEN)) { \
|
||||
spdk_trace_dump((LABEL), (BUF), (LEN)); \
|
||||
} \
|
||||
} while (0)
|
||||
|
@ -42,13 +42,7 @@
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
|
||||
struct spdk_trace_flag {
|
||||
const char *name;
|
||||
bool *enabled;
|
||||
};
|
||||
|
||||
static size_t g_num_trace_flags = 0;
|
||||
static struct spdk_trace_flag *g_trace_flags = NULL;
|
||||
static TAILQ_HEAD(, spdk_trace_flag) g_trace_flags = TAILQ_HEAD_INITIALIZER(g_trace_flags);
|
||||
|
||||
unsigned int spdk_g_notice_stderr_flag = 1;
|
||||
unsigned int spdk_g_log_facility = LOG_DAEMON;
|
||||
@ -171,7 +165,7 @@ spdk_warnlog(const char *file, const int line, const char *func,
|
||||
}
|
||||
|
||||
void
|
||||
spdk_tracelog(const char *file, const int line, const char *func,
|
||||
spdk_tracelog(const char *flag, const char *file, const int line, const char *func,
|
||||
const char *format, ...)
|
||||
{
|
||||
char buf[MAX_TMPBUF];
|
||||
@ -180,11 +174,11 @@ spdk_tracelog(const char *file, const int line, const char *func,
|
||||
va_start(ap, format);
|
||||
vsnprintf(buf, sizeof buf, format, ap);
|
||||
if (func != NULL) {
|
||||
fprintf(stderr, "%s:%4d:%s: %s", file, line, func, buf);
|
||||
//syslog(LOG_INFO, "%s:%4d:%s: %s", file, line, func, buf);
|
||||
fprintf(stderr, "[%s] %s:%4d:%s: %s", flag, file, line, func, buf);
|
||||
//syslog(LOG_INFO, "[%s] %s:%4d:%s: %s", flag, file, line, func, buf);
|
||||
} else {
|
||||
fprintf(stderr, "%s:%4d: %s", file, line, buf);
|
||||
//syslog(LOG_INFO, "%s:%4d: %s", file, line, buf);
|
||||
fprintf(stderr, "[%s] %s:%4d: %s", flag, file, line, buf);
|
||||
//syslog(LOG_INFO, "[%s] %s:%4d: %s", flag, file, line, buf);
|
||||
}
|
||||
va_end(ap);
|
||||
}
|
||||
@ -254,26 +248,26 @@ spdk_trace_dump(const char *label, const uint8_t *buf, size_t len)
|
||||
fdump(stderr, label, buf, len);
|
||||
}
|
||||
|
||||
static int compare_trace_flags(const void *key, const void *p)
|
||||
{
|
||||
const struct spdk_trace_flag *flag = p;
|
||||
|
||||
return strcasecmp(key, flag->name);
|
||||
}
|
||||
|
||||
static struct spdk_trace_flag *
|
||||
get_trace_flag(const char *name)
|
||||
{
|
||||
return bsearch(name, g_trace_flags, g_num_trace_flags, sizeof(struct spdk_trace_flag),
|
||||
compare_trace_flags);
|
||||
struct spdk_trace_flag *flag;
|
||||
|
||||
TAILQ_FOREACH(flag, &g_trace_flags, tailq) {
|
||||
if (strcasecmp(name, flag->name) == 0) {
|
||||
return flag;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
spdk_log_register_trace_flag(const char *name, bool *enabled)
|
||||
spdk_log_register_trace_flag(const char *name, struct spdk_trace_flag *flag)
|
||||
{
|
||||
struct spdk_trace_flag *flag, *new_flags;
|
||||
struct spdk_trace_flag *iter;
|
||||
|
||||
if (name == NULL || enabled == NULL) {
|
||||
if (name == NULL || flag == NULL) {
|
||||
fprintf(stderr, "missing spdk_trace_flag parameters\n");
|
||||
abort();
|
||||
}
|
||||
@ -283,27 +277,14 @@ spdk_log_register_trace_flag(const char *name, bool *enabled)
|
||||
abort();
|
||||
}
|
||||
|
||||
new_flags = realloc(g_trace_flags, (g_num_trace_flags + 1) * sizeof(struct spdk_trace_flag));
|
||||
if (new_flags == NULL) {
|
||||
fprintf(stderr, "spdk_trace_flag allocation error\n");
|
||||
abort();
|
||||
}
|
||||
|
||||
g_trace_flags = new_flags;
|
||||
|
||||
/* Find slot so that new flag is inserted in sorted order */
|
||||
for (flag = g_trace_flags; flag != g_trace_flags + g_num_trace_flags; flag++) {
|
||||
if (strcasecmp(name, flag->name) < 0) {
|
||||
size_t to_move = g_num_trace_flags - (flag - g_trace_flags);
|
||||
|
||||
memmove(flag + 1, flag, to_move * sizeof(struct spdk_trace_flag));
|
||||
break;
|
||||
TAILQ_FOREACH(iter, &g_trace_flags, tailq) {
|
||||
if (strcasecmp(iter->name, flag->name) > 0) {
|
||||
TAILQ_INSERT_BEFORE(iter, flag, tailq);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
flag->name = name;
|
||||
flag->enabled = enabled;
|
||||
g_num_trace_flags++;
|
||||
TAILQ_INSERT_TAIL(&g_trace_flags, flag, tailq);
|
||||
}
|
||||
|
||||
bool
|
||||
@ -311,7 +292,7 @@ spdk_log_get_trace_flag(const char *name)
|
||||
{
|
||||
struct spdk_trace_flag *flag = get_trace_flag(name);
|
||||
|
||||
if (flag && *flag->enabled) {
|
||||
if (flag && flag->enabled) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -322,11 +303,10 @@ static int
|
||||
set_trace_flag(const char *name, bool value)
|
||||
{
|
||||
struct spdk_trace_flag *flag;
|
||||
size_t i;
|
||||
|
||||
if (strcasecmp(name, "all") == 0) {
|
||||
for (i = 0; i < g_num_trace_flags; i++) {
|
||||
*g_trace_flags[i].enabled = value;
|
||||
TAILQ_FOREACH(flag, &g_trace_flags, tailq) {
|
||||
flag->enabled = value;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -336,7 +316,7 @@ set_trace_flag(const char *name, bool value)
|
||||
return -1;
|
||||
}
|
||||
|
||||
*flag->enabled = value;
|
||||
flag->enabled = value;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -353,19 +333,16 @@ spdk_log_clear_trace_flag(const char *name)
|
||||
return set_trace_flag(name, false);
|
||||
}
|
||||
|
||||
|
||||
size_t spdk_log_get_num_trace_flags(void)
|
||||
struct spdk_trace_flag *
|
||||
spdk_log_get_first_trace_flag(void)
|
||||
{
|
||||
return g_num_trace_flags;
|
||||
return TAILQ_FIRST(&g_trace_flags);
|
||||
}
|
||||
|
||||
const char *spdk_log_get_trace_flag_name(size_t idx)
|
||||
struct spdk_trace_flag *
|
||||
spdk_log_get_next_trace_flag(struct spdk_trace_flag *flag)
|
||||
{
|
||||
if (idx >= g_num_trace_flags) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return g_trace_flags[idx].name;
|
||||
return TAILQ_NEXT(flag, tailq);
|
||||
}
|
||||
|
||||
void
|
||||
@ -388,12 +365,12 @@ void
|
||||
spdk_tracelog_usage(FILE *f, const char *trace_arg)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
size_t i;
|
||||
struct spdk_trace_flag *flag;
|
||||
|
||||
fprintf(f, " %s flag enable trace flag (all", trace_arg);
|
||||
|
||||
for (i = 0; i < g_num_trace_flags; i++) {
|
||||
fprintf(f, ", %s", g_trace_flags[i].name);
|
||||
TAILQ_FOREACH(flag, &g_trace_flags, tailq) {
|
||||
fprintf(f, ", %s", flag->name);
|
||||
}
|
||||
|
||||
fprintf(f, ")\n");
|
||||
|
@ -129,7 +129,7 @@ spdk_rpc_get_trace_flags(struct spdk_jsonrpc_server_conn *conn,
|
||||
const struct spdk_json_val *id)
|
||||
{
|
||||
struct spdk_json_write_ctx *w;
|
||||
size_t i, count;
|
||||
struct spdk_trace_flag *flag;
|
||||
|
||||
if (params != NULL) {
|
||||
spdk_jsonrpc_send_error_response(conn, id, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
|
||||
@ -141,14 +141,13 @@ spdk_rpc_get_trace_flags(struct spdk_jsonrpc_server_conn *conn,
|
||||
return;
|
||||
}
|
||||
|
||||
count = spdk_log_get_num_trace_flags();
|
||||
flag = spdk_log_get_first_trace_flag();
|
||||
w = spdk_jsonrpc_begin_result(conn, id);
|
||||
spdk_json_write_object_begin(w);
|
||||
for (i = 0; i < count; i++) {
|
||||
const char *name = spdk_log_get_trace_flag_name(i);
|
||||
|
||||
spdk_json_write_name(w, name);
|
||||
spdk_json_write_bool(w, spdk_log_get_trace_flag(name));
|
||||
while (flag) {
|
||||
spdk_json_write_name(w, flag->name);
|
||||
spdk_json_write_bool(w, flag->enabled);
|
||||
flag = spdk_log_get_next_trace_flag(flag);
|
||||
}
|
||||
spdk_json_write_object_end(w);
|
||||
spdk_jsonrpc_end_result(conn, w);
|
||||
|
@ -56,10 +56,6 @@ log_test(void)
|
||||
CU_ASSERT(rc == 0);
|
||||
|
||||
#ifdef DEBUG
|
||||
rc = spdk_log_get_num_trace_flags();
|
||||
CU_ASSERT(rc == 1);
|
||||
CU_ASSERT(strcasecmp(spdk_log_get_trace_flag_name(0), "debug") == 0);
|
||||
|
||||
CU_ASSERT(spdk_log_get_trace_flag("debug") == false);
|
||||
|
||||
spdk_log_set_trace_flag("debug");
|
||||
|
@ -33,12 +33,16 @@
|
||||
|
||||
#include "spdk_cunit.h"
|
||||
|
||||
#include "spdk_internal/log.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "lib/nvme/unit/test_env.c"
|
||||
|
||||
bool trace_flag = false;
|
||||
#define SPDK_TRACE_NVME trace_flag
|
||||
struct spdk_trace_flag SPDK_TRACE_NVME = {
|
||||
.name = "nvme",
|
||||
.enabled = false,
|
||||
};
|
||||
|
||||
#include "nvme/nvme_ctrlr.c"
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user