.\"
.\" $FreeBSD: src/share/man/man9/ktr.9,v 1.8 2005/03/08 01:37:36 hmp Exp $
.\"
-.Dd January 2, 2012
+.Dd August 22, 2012
.Dt KTR 9
.Os
.Sh NAME
.Nm KTR_INFO_MASTER ,
.Nm KTR_INFO_MASTER_EXTERN ,
.Nm KTR_INFO ,
-.Nm KTR_LOG
+.Nm KTR_LOG ,
+.Nm KTR_COND_LOG
.Nd kernel tracing facility
.Sh SYNOPSIS
.In sys/ktr.h
.Fn KTR_INFO_MASTER_EXTERN "master"
.Fn KTR_INFO "compile" "master" "name" "maskbit" "format" "type name" "..."
.Fn KTR_LOG "info" "arg ..."
+.Fn KTR_COND_LOG "info" "cond" "arg ..."
.Sh DESCRIPTION
The
.Nm ktr
call.
.Pp
The
+.Fn KTR_COND_LOG
+macro is equivalent to
+.Fn KTR_LOG
+except it logs only when the condition specified in
+.Fa cond
+evaluates to true.
+.Pp
+The
.Va ktr_entries
variable contains the number of entries in the
.Va ktr_buf
KTR_INFO_MASTER(foo);
KTR_INFO(KTR_FOO, foo, func1, 0, "func1()");
KTR_INFO(KTR_FOO, foo, func2, 1, "func2(%d)", int arg);
+KTR_INFO(KTR_FOO, foo, func3, 2, "func3: arg positive: %d", int arg);
\&...
KTR_LOG(foo_func2, arg);
...
}
+
+void
+func3(int arg)
+{
+ KTR_COND_LOG(foo_func3, arg >= 0, arg);
+ ...
+}
.Ed
.Sh SEE ALSO
.Xr gdb 1 ,
} \
} while(0)
+#define KTR_COND_LOG(name, cond, ...) \
+ do { \
+ __ktr_info_ ## name ## _fmtcheck (__ktr_ ## name ## _fmt, ##__VA_ARGS__); \
+ if ((cond) && \
+ ktr_ ## name ## _enable && \
+ (ktr_ ## name ## _mask & *ktr_info_ ## name .kf_master_enable)) { \
+ struct ktr_entry *entry; \
+ entry = ktr_begin_write_entry(&ktr_info_ ## name, __FILE__, __LINE__); \
+ if (!entry) \
+ break; \
+ *(struct ktr_info_ ## name ## _args *)&entry->ktr_data[0] = \
+ (struct ktr_info_ ## name ## _args){ __VA_ARGS__}; \
+ if (ktr_finish_write_entry(&ktr_info_ ## name, entry)) { \
+ kprintf(ktr_info_ ## name .kf_format, ##__VA_ARGS__); \
+ kprintf("\n"); \
+ } \
+ } \
+ } while(0)
+
#else
#define KTR_INFO_MASTER(master) \
#define KTR_LOG(info, args...)
+#define KTR_COND_LOG(info, args...)
+
#endif
#endif /* !LOCORE */