New upstream version 18.02
[deb_dpdk.git] / examples / performance-thread / common / lthread_diag.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2015 Intel Corporation
3  */
4
5 #ifndef LTHREAD_DIAG_H_
6 #define LTHREAD_DIAG_H_
7
8 #ifdef __cplusplus
9 extern "C" {
10 #endif
11
12 #include <stdint.h>
13 #include <inttypes.h>
14
15 #include <rte_log.h>
16 #include <rte_common.h>
17
18 #include "lthread_api.h"
19 #include "lthread_diag_api.h"
20
21 extern diag_callback diag_cb;
22
23 extern const char *diag_event_text[];
24 extern uint64_t diag_mask;
25
26 /* max size of name strings */
27 #define LT_MAX_NAME_SIZE 64
28
29 #if LTHREAD_DIAG
30 #define DISPLAY_OBJCACHE_QUEUES 1
31
32 /*
33  * Generate a diagnostic trace or event in the case where an object is created.
34  *
35  * The value returned by the callback is stored in the object.
36  *
37  * @ param obj
38  *  pointer to the object that was created
39  * @ param ev
40  *  the event code
41  *
42  */
43 #define DIAG_CREATE_EVENT(obj, ev) do {                                 \
44         struct lthread *ct = RTE_PER_LCORE(this_sched)->current_lthread;\
45         if ((BIT(ev) & diag_mask) && (ev < LT_DIAG_EVENT_MAX)) {        \
46                 (obj)->diag_ref = (diag_cb)(rte_rdtsc(),                \
47                                         ct,                             \
48                                         (ev),                           \
49                                         0,                              \
50                                         diag_event_text[(ev)],          \
51                                         (uint64_t)obj,                  \
52                                         0);                             \
53         }                                                               \
54 } while (0)
55
56 /*
57  * Generate a diagnostic trace event.
58  *
59  * @ param obj
60  *  pointer to the lthread, cond or mutex object
61  * @ param ev
62  *  the event code
63  * @ param p1
64  *  object specific value ( see lthread_diag_api.h )
65  * @ param p2
66  *  object specific value ( see lthread_diag_api.h )
67  */
68 #define DIAG_EVENT(obj, ev, p1, p2) do {                                \
69         struct lthread *ct = RTE_PER_LCORE(this_sched)->current_lthread;\
70         if ((BIT(ev) & diag_mask) && (ev < LT_DIAG_EVENT_MAX)) {        \
71                 (diag_cb)(rte_rdtsc(),                                  \
72                                 ct,                                     \
73                                 ev,                                     \
74                                 (obj)->diag_ref,                        \
75                                 diag_event_text[(ev)],                  \
76                                 (uint64_t)(p1),                         \
77                                 (uint64_t)(p2));                        \
78         }                                                               \
79 } while (0)
80
81 #define DIAG_COUNT_DEFINE(x) rte_atomic64_t count_##x
82 #define DIAG_COUNT_INIT(o, x) rte_atomic64_init(&((o)->count_##x))
83 #define DIAG_COUNT_INC(o, x) rte_atomic64_inc(&((o)->count_##x))
84 #define DIAG_COUNT_DEC(o, x) rte_atomic64_dec(&((o)->count_##x))
85 #define DIAG_COUNT(o, x) rte_atomic64_read(&((o)->count_##x))
86
87 #define DIAG_USED
88
89 #else
90
91 /* no diagnostics configured */
92
93 #define DISPLAY_OBJCACHE_QUEUES 0
94
95 #define DIAG_CREATE_EVENT(obj, ev)
96 #define DIAG_EVENT(obj, ev, p1, p)
97
98 #define DIAG_COUNT_DEFINE(x)
99 #define DIAG_COUNT_INIT(o, x) do {} while (0)
100 #define DIAG_COUNT_INC(o, x) do {} while (0)
101 #define DIAG_COUNT_DEC(o, x) do {} while (0)
102 #define DIAG_COUNT(o, x) 0
103
104 #define DIAG_USED __rte_unused
105
106 #endif                          /* LTHREAD_DIAG */
107
108 #ifdef __cplusplus
109 }
110 #endif
111
112 #endif                          /* LTHREAD_DIAG_H_ */