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:
Daniel Verkamp 2016-11-23 11:48:14 -07:00
parent 5f3761cf7e
commit c454900960
6 changed files with 74 additions and 87 deletions

View File

@ -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);

View File

@ -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)

View File

@ -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");

View File

@ -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);

View File

@ -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");

View File

@ -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"