25 #ifndef __MOTR_LIB_TRACE_H__ 26 #define __MOTR_LIB_TRACE_H__ 167 #define M0_LOG(level, ...) \ 168 M0_CAT(M0_LOG, M0_COUNT_PARAMS(__VA_ARGS__))(level, __VA_ARGS__) 170 #define M0_ENTRY(...) M0_LOG(M0_CALL, "> " __VA_ARGS__) 171 #define M0_LEAVE(...) M0_LOG(M0_CALL, "< " __VA_ARGS__) 182 #define M0_RC_HOOK (0) 194 #define M0_RC(rc) ({ \ 195 typeof(rc) __rc = (rc); \ 196 M0_LOG(M0_CALL, "< rc=%d", __rc); \ 201 #define M0_ERR(rc) ({ \ 202 typeof(rc) __rc = (rc); \ 203 M0_ASSERT(__rc != 0); \ 204 M0_LOG(M0_ERROR, "<! rc=%d", __rc); \ 209 #define M0_RC_INFO(rc, fmt, ...) ({ \ 210 typeof(rc) __rc = (rc); \ 211 M0_LOG(M0_CALL, "< rc=%d " fmt, __rc, ## __VA_ARGS__ ); \ 215 #define M0_ERR_INFO(rc, fmt, ...) ({ \ 216 typeof(rc) __rc = (rc); \ 217 M0_ASSERT(__rc != 0); \ 218 M0_LOG(M0_ERROR, "<! rc=%d " fmt, __rc, ## __VA_ARGS__ ); \ 239 #define M0_TRACE_SUBSYSTEMS \ 240 M0_TRACE_SUBSYS(OTHER, 0) \ 241 M0_TRACE_SUBSYS(LIB, 1) \ 242 M0_TRACE_SUBSYS(UT, 2) \ 244 M0_TRACE_SUBSYS(ADDB, 3) \ 245 M0_TRACE_SUBSYS(ADSTOB, 4) \ 246 M0_TRACE_SUBSYS(BALLOC, 5) \ 247 M0_TRACE_SUBSYS(BE, 6) \ 248 M0_TRACE_SUBSYS(BTREE, 7) \ 249 M0_TRACE_SUBSYS(CAS, 8) \ 250 M0_TRACE_SUBSYS(CLIENT, 9) \ 251 M0_TRACE_SUBSYS(CM, 10) \ 252 M0_TRACE_SUBSYS(COB, 11) \ 253 M0_TRACE_SUBSYS(CONF, 12) \ 254 M0_TRACE_SUBSYS(CONSOLE, 13) \ 255 M0_TRACE_SUBSYS(DIX, 14) \ 256 M0_TRACE_SUBSYS(DIXCM, 15) \ 257 M0_TRACE_SUBSYS(DTM, 16) \ 258 M0_TRACE_SUBSYS(EXTMAP, 17) \ 259 M0_TRACE_SUBSYS(FD, 18) \ 260 M0_TRACE_SUBSYS(FILE, 19) \ 261 M0_TRACE_SUBSYS(FOL, 20) \ 262 M0_TRACE_SUBSYS(FOP, 21) \ 263 M0_TRACE_SUBSYS(FORMATION, 22) \ 264 M0_TRACE_SUBSYS(HA, 23) \ 265 M0_TRACE_SUBSYS(IOSERVICE, 24) \ 266 M0_TRACE_SUBSYS(LAYOUT, 25) \ 267 M0_TRACE_SUBSYS(LNET, 26) \ 268 M0_TRACE_SUBSYS(M0D, 27) \ 269 M0_TRACE_SUBSYS(M0T1FS, 28) \ 270 M0_TRACE_SUBSYS(MDS, 29) \ 271 M0_TRACE_SUBSYS(MEMORY, 30) \ 272 M0_TRACE_SUBSYS(MGMT, 31) \ 273 M0_TRACE_SUBSYS(NET, 32) \ 274 M0_TRACE_SUBSYS(POOL, 33) \ 275 M0_TRACE_SUBSYS(RM, 34) \ 276 M0_TRACE_SUBSYS(RPC, 35) \ 277 M0_TRACE_SUBSYS(SM, 36) \ 278 M0_TRACE_SUBSYS(SNS, 37) \ 279 M0_TRACE_SUBSYS(SNSCM, 38) \ 280 M0_TRACE_SUBSYS(SPIEL, 39) \ 281 M0_TRACE_SUBSYS(SSS, 40) \ 282 M0_TRACE_SUBSYS(STATS, 41) \ 283 M0_TRACE_SUBSYS(STOB, 42) \ 284 M0_TRACE_SUBSYS(XCODE, 43) \ 285 M0_TRACE_SUBSYS(FDMI, 44) \ 286 M0_TRACE_SUBSYS(ISCS, 45) \ 287 M0_TRACE_SUBSYS(DTM0, 46) 289 #define M0_TRACE_SUBSYS(name, value) M0_TRACE_SUBSYS_ ## name = (1UL << value), 545 const
void *
tr_body,
bool yaml_stream_mode);
572 #define M0_TRACE_POINT(LEVEL, NR, DECL, OFFSET, SIZEOF, ISSTR, HASSTR, FMT, ...)\ 574 struct t_body DECL; \ 575 static const int _offset[NR] = OFFSET; \ 576 static const int _sizeof[NR] = SIZEOF; \ 577 static const bool _isstr[NR] = ISSTR; \ 578 static const struct m0_trace_descr __trace_descr = { \ 579 .td_magic = M0_TRACE_DESCR_MAGIC, \ 580 .td_level = (LEVEL), \ 582 .td_func = __func__, \ 583 .td_file = __FILE__, \ 584 .td_line = __LINE__, \ 585 .td_subsys = M0_TRACE_SUBSYSTEM, \ 586 .td_size = sizeof(struct t_body), \ 588 .td_offset = _offset, \ 589 .td_sizeof = _sizeof, \ 590 .td_isstr = _isstr, \ 591 .td_hasstr = (HASSTR), \ 593 printf_check(FMT , ## __VA_ARGS__); \ 594 m0_trace_allot(&__trace_descr, &(const struct t_body){ __VA_ARGS__ });\ 597 #ifndef M0_TRACE_SUBSYSTEM 598 # define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_OTHER 608 #define LOG_TYPEOF(a, v) typeof(a) v 609 #define LOG_OFFSETOF(v) offsetof(struct t_body, v) 610 #define LOG_SIZEOF(a) sizeof(a) 611 #define LOG_IS_STR_ARG(a) \ 612 M0_HAS_TYPE((a), char*) ?: \ 613 M0_HAS_TYPE((a), const char*) ?: \ 614 M0_HAS_TYPE((a), char[]) ?: \ 615 M0_HAS_TYPE((a), const char[]) ?: false 618 #define LOG_CHECK(a) \ 619 M0_CASSERT(!M0_HAS_TYPE(a, const char []) && \ 620 (sizeof(a) == 1 || sizeof(a) == 2 || sizeof(a) == 4 || \ 627 #define LOG_GROUP(...) __VA_ARGS__ 629 #define M0_LOG0(level, fmt) \ 630 M0_TRACE_POINT(level, 0, { ; }, {}, {}, {}, false, fmt) 632 #define M0_LOG1(level, fmt, a0) \ 633 ({ M0_TRACE_POINT(level, 1, \ 634 { LOG_TYPEOF(a0, v0); }, \ 635 { LOG_OFFSETOF(v0) }, \ 636 { LOG_SIZEOF(a0) }, \ 637 { LOG_IS_STR_ARG(a0) }, \ 638 LOG_IS_STR_ARG(a0), \ 642 #define M0_LOG2(level, fmt, a0, a1) \ 643 ({ M0_TRACE_POINT(level, 2, \ 644 { LOG_TYPEOF(a0, v0); LOG_TYPEOF(a1, v1); }, \ 645 LOG_GROUP({ LOG_OFFSETOF(v0), LOG_OFFSETOF(v1) }), \ 646 LOG_GROUP({ LOG_SIZEOF(a0), LOG_SIZEOF(a1) }), \ 647 LOG_GROUP({ LOG_IS_STR_ARG(a0), LOG_IS_STR_ARG(a1) }), \ 648 LOG_IS_STR_ARG(a0) || LOG_IS_STR_ARG(a1), \ 650 LOG_CHECK(a0); LOG_CHECK(a1); }) 652 #define M0_LOG3(level, fmt, a0, a1, a2) \ 653 ({ M0_TRACE_POINT(level, 3, \ 654 { LOG_TYPEOF(a0, v0); LOG_TYPEOF(a1, v1); LOG_TYPEOF(a2, v2); }, \ 655 LOG_GROUP({ LOG_OFFSETOF(v0), LOG_OFFSETOF(v1), LOG_OFFSETOF(v2) }), \ 656 LOG_GROUP({ LOG_SIZEOF(a0), LOG_SIZEOF(a1), LOG_SIZEOF(a2) }), \ 657 LOG_GROUP({ LOG_IS_STR_ARG(a0), LOG_IS_STR_ARG(a1), \ 658 LOG_IS_STR_ARG(a2) }), \ 659 LOG_IS_STR_ARG(a0) || LOG_IS_STR_ARG(a1) || LOG_IS_STR_ARG(a2), \ 661 LOG_CHECK(a0); LOG_CHECK(a1); LOG_CHECK(a2); }) 663 #define M0_LOG4(level, fmt, a0, a1, a2, a3) \ 664 ({ M0_TRACE_POINT(level, 4, \ 665 { LOG_TYPEOF(a0, v0); LOG_TYPEOF(a1, v1); LOG_TYPEOF(a2, v2); \ 666 LOG_TYPEOF(a3, v3); }, \ 667 LOG_GROUP({ LOG_OFFSETOF(v0), LOG_OFFSETOF(v1), LOG_OFFSETOF(v2), \ 668 LOG_OFFSETOF(v3) }), \ 669 LOG_GROUP({ LOG_SIZEOF(a0), LOG_SIZEOF(a1), LOG_SIZEOF(a2), \ 671 LOG_GROUP({ LOG_IS_STR_ARG(a0), LOG_IS_STR_ARG(a1), \ 672 LOG_IS_STR_ARG(a2), LOG_IS_STR_ARG(a3) }), \ 673 LOG_IS_STR_ARG(a0) || LOG_IS_STR_ARG(a1) || LOG_IS_STR_ARG(a2) || \ 674 LOG_IS_STR_ARG(a3), \ 675 fmt, a0, a1, a2, a3); \ 676 LOG_CHECK(a0); LOG_CHECK(a1); LOG_CHECK(a2); LOG_CHECK(a3); }) 678 #define M0_LOG5(level, fmt, a0, a1, a2, a3, a4) \ 679 ({ M0_TRACE_POINT(level, 5, \ 680 { LOG_TYPEOF(a0, v0); LOG_TYPEOF(a1, v1); LOG_TYPEOF(a2, v2); \ 681 LOG_TYPEOF(a3, v3); LOG_TYPEOF(a4, v4); }, \ 682 LOG_GROUP({ LOG_OFFSETOF(v0), LOG_OFFSETOF(v1), LOG_OFFSETOF(v2), \ 683 LOG_OFFSETOF(v3), LOG_OFFSETOF(v4) }), \ 684 LOG_GROUP({ LOG_SIZEOF(a0), LOG_SIZEOF(a1), LOG_SIZEOF(a2), \ 685 LOG_SIZEOF(a3), LOG_SIZEOF(a4) }), \ 686 LOG_GROUP({ LOG_IS_STR_ARG(a0), LOG_IS_STR_ARG(a1), \ 687 LOG_IS_STR_ARG(a2), LOG_IS_STR_ARG(a3), \ 688 LOG_IS_STR_ARG(a4) }), \ 689 LOG_IS_STR_ARG(a0) || LOG_IS_STR_ARG(a1) || LOG_IS_STR_ARG(a2) || \ 690 LOG_IS_STR_ARG(a3) || LOG_IS_STR_ARG(a4), \ 691 fmt, a0, a1, a2, a3, a4); \ 692 LOG_CHECK(a0); LOG_CHECK(a1); LOG_CHECK(a2); LOG_CHECK(a3); \ 695 #define M0_LOG6(level, fmt, a0, a1, a2, a3, a4, a5) \ 696 ({ M0_TRACE_POINT(level, 6, \ 697 { LOG_TYPEOF(a0, v0); LOG_TYPEOF(a1, v1); LOG_TYPEOF(a2, v2); \ 698 LOG_TYPEOF(a3, v3); LOG_TYPEOF(a4, v4); LOG_TYPEOF(a5, v5); }, \ 699 LOG_GROUP({ LOG_OFFSETOF(v0), LOG_OFFSETOF(v1), LOG_OFFSETOF(v2), \ 700 LOG_OFFSETOF(v3), LOG_OFFSETOF(v4), LOG_OFFSETOF(v5) }), \ 701 LOG_GROUP({ LOG_SIZEOF(a0), LOG_SIZEOF(a1), LOG_SIZEOF(a2), \ 702 LOG_SIZEOF(a3), LOG_SIZEOF(a4), LOG_SIZEOF(a5) }), \ 703 LOG_GROUP({ LOG_IS_STR_ARG(a0), LOG_IS_STR_ARG(a1), \ 704 LOG_IS_STR_ARG(a2), LOG_IS_STR_ARG(a3), \ 705 LOG_IS_STR_ARG(a4), LOG_IS_STR_ARG(a5) }), \ 706 LOG_IS_STR_ARG(a0) || LOG_IS_STR_ARG(a1) || LOG_IS_STR_ARG(a2) || \ 707 LOG_IS_STR_ARG(a3) || LOG_IS_STR_ARG(a4) || LOG_IS_STR_ARG(a5), \ 708 fmt, a0, a1, a2, a3, a4, a5); \ 709 LOG_CHECK(a0); LOG_CHECK(a1); LOG_CHECK(a2); LOG_CHECK(a3); \ 710 LOG_CHECK(a4); LOG_CHECK(a5); }) 712 #define M0_LOG7(level, fmt, a0, a1, a2, a3, a4, a5, a6) \ 713 ({ M0_TRACE_POINT(level, 7, \ 714 { LOG_TYPEOF(a0, v0); LOG_TYPEOF(a1, v1); LOG_TYPEOF(a2, v2); \ 715 LOG_TYPEOF(a3, v3); LOG_TYPEOF(a4, v4); LOG_TYPEOF(a5, v5); \ 716 LOG_TYPEOF(a6, v6); }, \ 717 LOG_GROUP({ LOG_OFFSETOF(v0), LOG_OFFSETOF(v1), LOG_OFFSETOF(v2), \ 718 LOG_OFFSETOF(v3), LOG_OFFSETOF(v4), \ 719 LOG_OFFSETOF(v5), LOG_OFFSETOF(v6) }), \ 720 LOG_GROUP({ LOG_SIZEOF(a0), LOG_SIZEOF(a1), LOG_SIZEOF(a2), \ 721 LOG_SIZEOF(a3), LOG_SIZEOF(a4), \ 722 LOG_SIZEOF(a5), LOG_SIZEOF(a6) }), \ 723 LOG_GROUP({ LOG_IS_STR_ARG(a0), LOG_IS_STR_ARG(a1), \ 724 LOG_IS_STR_ARG(a2), LOG_IS_STR_ARG(a3), \ 725 LOG_IS_STR_ARG(a4), LOG_IS_STR_ARG(a5), \ 726 LOG_IS_STR_ARG(a6) }), \ 727 LOG_IS_STR_ARG(a0) || LOG_IS_STR_ARG(a1) || LOG_IS_STR_ARG(a2) || \ 728 LOG_IS_STR_ARG(a3) || LOG_IS_STR_ARG(a4) || \ 729 LOG_IS_STR_ARG(a5) || LOG_IS_STR_ARG(a6), \ 730 fmt, a0, a1, a2, a3, a4, a5, a6); \ 731 LOG_CHECK(a0); LOG_CHECK(a1); LOG_CHECK(a2); LOG_CHECK(a3); \ 732 LOG_CHECK(a4); LOG_CHECK(a5); LOG_CHECK(a6); }) 734 #define M0_LOG8(level, fmt, a0, a1, a2, a3, a4, a5, a6, a7) \ 735 ({ M0_TRACE_POINT(level, 8, \ 736 { LOG_TYPEOF(a0, v0); LOG_TYPEOF(a1, v1); LOG_TYPEOF(a2, v2); \ 737 LOG_TYPEOF(a3, v3); LOG_TYPEOF(a4, v4); LOG_TYPEOF(a5, v5); \ 738 LOG_TYPEOF(a6, v6); LOG_TYPEOF(a7, v7); }, \ 739 LOG_GROUP({ LOG_OFFSETOF(v0), LOG_OFFSETOF(v1), LOG_OFFSETOF(v2), \ 740 LOG_OFFSETOF(v3), LOG_OFFSETOF(v4), LOG_OFFSETOF(v5), \ 741 LOG_OFFSETOF(v6), LOG_OFFSETOF(v7) }), \ 742 LOG_GROUP({ LOG_SIZEOF(a0), LOG_SIZEOF(a1), LOG_SIZEOF(a2), \ 743 LOG_SIZEOF(a3), LOG_SIZEOF(a4), LOG_SIZEOF(a5), \ 744 LOG_SIZEOF(a6), LOG_SIZEOF(a7) }), \ 745 LOG_GROUP({ LOG_IS_STR_ARG(a0), LOG_IS_STR_ARG(a1), \ 746 LOG_IS_STR_ARG(a2), LOG_IS_STR_ARG(a3), \ 747 LOG_IS_STR_ARG(a4), LOG_IS_STR_ARG(a5), \ 748 LOG_IS_STR_ARG(a6), LOG_IS_STR_ARG(a7) }), \ 749 LOG_IS_STR_ARG(a0) || LOG_IS_STR_ARG(a1) || LOG_IS_STR_ARG(a2) || \ 750 LOG_IS_STR_ARG(a3) || LOG_IS_STR_ARG(a4) || \ 751 LOG_IS_STR_ARG(a5) || LOG_IS_STR_ARG(a6) || \ 752 LOG_IS_STR_ARG(a7), \ 753 fmt, a0, a1, a2, a3, a4, a5, a6, a7); \ 754 LOG_CHECK(a0); LOG_CHECK(a1); LOG_CHECK(a2); LOG_CHECK(a3); \ 755 LOG_CHECK(a4); LOG_CHECK(a5); LOG_CHECK(a6); LOG_CHECK(a7); }) 757 #define M0_LOG9(level, fmt, a0, a1, a2, a3, a4, a5, a6, a7, a8) \ 758 ({ M0_TRACE_POINT(level, 9, \ 759 { LOG_TYPEOF(a0, v0); LOG_TYPEOF(a1, v1); LOG_TYPEOF(a2, v2); \ 760 LOG_TYPEOF(a3, v3); LOG_TYPEOF(a4, v4); LOG_TYPEOF(a5, v5); \ 761 LOG_TYPEOF(a6, v6); LOG_TYPEOF(a7, v7); LOG_TYPEOF(a8, v8); }, \ 762 LOG_GROUP({ LOG_OFFSETOF(v0), LOG_OFFSETOF(v1), LOG_OFFSETOF(v2), \ 763 LOG_OFFSETOF(v3), LOG_OFFSETOF(v4), LOG_OFFSETOF(v5), \ 764 LOG_OFFSETOF(v6), LOG_OFFSETOF(v7), LOG_OFFSETOF(v8) }), \ 765 LOG_GROUP({ LOG_SIZEOF(a0), LOG_SIZEOF(a1), LOG_SIZEOF(a2), \ 766 LOG_SIZEOF(a3), LOG_SIZEOF(a4), LOG_SIZEOF(a5), \ 767 LOG_SIZEOF(a6), LOG_SIZEOF(a7), LOG_SIZEOF(a8) }), \ 768 LOG_GROUP({ LOG_IS_STR_ARG(a0), LOG_IS_STR_ARG(a1), \ 769 LOG_IS_STR_ARG(a2), LOG_IS_STR_ARG(a3), \ 770 LOG_IS_STR_ARG(a4), LOG_IS_STR_ARG(a5), \ 771 LOG_IS_STR_ARG(a6), LOG_IS_STR_ARG(a7), \ 772 LOG_IS_STR_ARG(a8) }), \ 773 LOG_IS_STR_ARG(a0) || LOG_IS_STR_ARG(a1) || LOG_IS_STR_ARG(a2) || \ 774 LOG_IS_STR_ARG(a3) || LOG_IS_STR_ARG(a4) || \ 775 LOG_IS_STR_ARG(a5) || LOG_IS_STR_ARG(a6) || \ 776 LOG_IS_STR_ARG(a7) || LOG_IS_STR_ARG(a8), \ 777 fmt, a0, a1, a2, a3, a4, a5, a6, a7, a8); \ 778 LOG_CHECK(a0); LOG_CHECK(a1); LOG_CHECK(a2); LOG_CHECK(a3); \ 779 LOG_CHECK(a4); LOG_CHECK(a5); LOG_CHECK(a6); LOG_CHECK(a7); LOG_CHECK(a8); })
void m0_error_printf(const char *fmt,...)
M0_INTERNAL void m0_trace_print_subsystems(void)
enum m0_trace_level level
void m0_console_printf(const char *fmt,...)
M0_INTERNAL void m0_trace_level_allow(unsigned level)
enum m0_trace_level td_level
M0_INTERNAL int m0_trace_record_print_yaml(char *outbuf, size_t outbuf_size, const struct m0_trace_rec_header *trh, const void *tr_body, bool yaml_stream_mode)
static void m0_rc_hook(int rc)
#define M0_TRACE_SUBSYSTEMS
M0_INTERNAL int m0_trace_set_print_context(const char *ctx_name)
M0_INTERNAL void m0_trace_fini(void)
char * fmt(const char *format,...) __attribute__((format(printf
__attribute__((format(printf, 1, 2))) void m0_console_printf(const char *fmt
M0_INTERNAL void m0_trace_record_print(const struct m0_trace_rec_header *trh, const void *buf)
M0_INTERNAL void m0_trace_allot(const struct m0_trace_descr *td, const void *body)
void m0_console_flush(void)
M0_INTERNAL int m0_trace_set_immediate_mask(const char *mask_str)
M0_BASSERT(M0_TRACE_BUF_FLAGS_MAX< UINT16_MAX)
static void m0_err_hook(int rc)
unsigned long m0_trace_immediate_mask
M0_INTERNAL int m0_trace_init(void)
struct m0_trace_buf_header * m0_logbuf_header
M0_INTERNAL int m0_trace_set_level(const char *level_str)