Commit c4549009 authored by Daniel Verkamp's avatar Daniel Verkamp
Browse files

log: print trace flag names in SPDK_TRACELOG()



Change-Id: I962ee098818f48563e67f9b4214bc3519eee48b4
Signed-off-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent 5f3761cf
Loading
Loading
Loading
Loading
+2 −6
Original line number Diff line number Diff line
@@ -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);

+24 −9
Original line number Diff line number Diff line
@@ -40,10 +40,25 @@
#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); \
@@ -51,16 +66,16 @@ __attribute__((constructor)) static void register_trace_flag_##flag(void) \

#define SPDK_TRACELOG(FLAG, ...)								\
	do {											\
		extern bool FLAG;							\
		if (FLAG) {								\
			spdk_tracelog(__FILE__, __LINE__, __func__, __VA_ARGS__);	\
		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)
+36 −59
Original line number Diff line number Diff line
@@ -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)
static struct spdk_trace_flag *
get_trace_flag(const char *name)
{
	const struct spdk_trace_flag *flag = p;
	struct spdk_trace_flag *flag;

	return strcasecmp(key, flag->name);
	TAILQ_FOREACH(flag, &g_trace_flags, tailq) {
		if (strcasecmp(name, flag->name) == 0) {
			return flag;
		}
	}

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);
	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");
+6 −7
Original line number Diff line number Diff line
@@ -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);
+0 −4
Original line number Diff line number Diff line
@@ -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");
Loading