Line data Source code
1 : /*
2 : Authors:
3 : Pavel Březina <pbrezina@redhat.com>
4 :
5 : Copyright (C) 2021 Red Hat
6 :
7 : This program is free software; you can redistribute it and/or modify
8 : it under the terms of the GNU General Public License as published by
9 : the Free Software Foundation; either version 3 of the License, or
10 : (at your option) any later version.
11 :
12 : This program is distributed in the hope that it will be useful,
13 : but WITHOUT ANY WARRANTY; without even the implied warranty of
14 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 : GNU General Public License for more details.
16 :
17 : You should have received a copy of the GNU General Public License
18 : along with this program. If not, see <http://www.gnu.org/licenses/>.
19 : */
20 :
21 : #include "lib/util/debug.h"
22 : #include "winbindd_traceid.h"
23 : #include "tevent.h"
24 :
25 0 : static void debug_traceid_trace_fde(struct tevent_fd *fde,
26 : enum tevent_event_trace_point point,
27 : void *private_data)
28 : {
29 0 : switch (point) {
30 0 : case TEVENT_EVENT_TRACE_ATTACH:
31 : /* Assign the current traceid id when the event is created. */
32 0 : tevent_fd_set_tag(fde, debug_traceid_get());
33 0 : break;
34 0 : case TEVENT_EVENT_TRACE_BEFORE_HANDLER:
35 : /* Set the traceid id when a handler is being called. */
36 0 : debug_traceid_set(tevent_fd_get_tag(fde));
37 0 : break;
38 0 : default:
39 : /* Do nothing. */
40 0 : break;
41 : }
42 0 : }
43 :
44 0 : static void debug_traceid_trace_signal(struct tevent_signal *se,
45 : enum tevent_event_trace_point point,
46 : void *private_data)
47 : {
48 0 : switch (point) {
49 0 : case TEVENT_EVENT_TRACE_ATTACH:
50 : /* Assign the current traceid id when the event is created. */
51 0 : tevent_signal_set_tag(se, debug_traceid_get());
52 0 : break;
53 0 : case TEVENT_EVENT_TRACE_BEFORE_HANDLER:
54 : /* Set the traceid id when a handler is being called. */
55 0 : debug_traceid_set(tevent_signal_get_tag(se));
56 0 : break;
57 0 : default:
58 : /* Do nothing. */
59 0 : break;
60 : }
61 0 : }
62 :
63 0 : static void debug_traceid_trace_timer(struct tevent_timer *timer,
64 : enum tevent_event_trace_point point,
65 : void *private_data)
66 : {
67 0 : switch (point) {
68 0 : case TEVENT_EVENT_TRACE_ATTACH:
69 : /* Assign the current traceid id when the event is created. */
70 0 : tevent_timer_set_tag(timer, debug_traceid_get());
71 0 : break;
72 0 : case TEVENT_EVENT_TRACE_BEFORE_HANDLER:
73 : /* Set the traceid id when a handler is being called. */
74 0 : debug_traceid_set(tevent_timer_get_tag(timer));
75 0 : break;
76 0 : default:
77 : /* Do nothing. */
78 0 : break;
79 : }
80 0 : }
81 :
82 0 : static void debug_traceid_trace_immediate(struct tevent_immediate *im,
83 : enum tevent_event_trace_point point,
84 : void *private_data)
85 : {
86 0 : switch (point) {
87 0 : case TEVENT_EVENT_TRACE_ATTACH:
88 : /* Assign the current traceid id when the event is created. */
89 0 : tevent_immediate_set_tag(im, debug_traceid_get());
90 0 : break;
91 0 : case TEVENT_EVENT_TRACE_BEFORE_HANDLER:
92 : /* Set the traceid id when a handler is being called. */
93 0 : debug_traceid_set(tevent_immediate_get_tag(im));
94 0 : break;
95 0 : default:
96 : /* Do nothing. */
97 0 : break;
98 : }
99 0 : }
100 :
101 0 : static void debug_traceid_trace_queue(struct tevent_queue_entry *qe,
102 : enum tevent_event_trace_point point,
103 : void *private_data)
104 : {
105 0 : switch (point) {
106 0 : case TEVENT_EVENT_TRACE_ATTACH:
107 : /* Assign the current traceid id when the event is created. */
108 0 : tevent_queue_entry_set_tag(qe, debug_traceid_get());
109 0 : break;
110 0 : case TEVENT_EVENT_TRACE_BEFORE_HANDLER:
111 : /* Set the traceid id when a handler is being called. */
112 0 : debug_traceid_set(tevent_queue_entry_get_tag(qe));
113 0 : break;
114 0 : default:
115 : /* Do nothing. */
116 0 : break;
117 : }
118 0 : }
119 :
120 0 : static void debug_traceid_trace_loop(enum tevent_trace_point point,
121 : void *private_data)
122 : {
123 0 : switch (point) {
124 0 : case TEVENT_TRACE_AFTER_LOOP_ONCE:
125 : /* Reset traceid id when we got back to the loop. An event handler
126 : * that set traceid id was fired. This tracepoint represents a place
127 : * after the event handler was finished, we need to restore traceid
128 : * id to 1 (out of request). 0 means not initialized.
129 : */
130 0 : debug_traceid_set(1);
131 0 : break;
132 0 : default:
133 : /* Do nothing. */
134 0 : break;
135 : }
136 0 : }
137 :
138 0 : void winbind_debug_traceid_setup(struct tevent_context *ev)
139 : {
140 0 : tevent_set_trace_callback(ev, debug_traceid_trace_loop, NULL);
141 0 : tevent_set_trace_fd_callback(ev, debug_traceid_trace_fde, NULL);
142 0 : tevent_set_trace_signal_callback(ev, debug_traceid_trace_signal, NULL);
143 0 : tevent_set_trace_timer_callback(ev, debug_traceid_trace_timer, NULL);
144 0 : tevent_set_trace_immediate_callback(ev, debug_traceid_trace_immediate, NULL);
145 0 : tevent_set_trace_queue_callback(ev, debug_traceid_trace_queue, NULL);
146 0 : debug_traceid_set(1);
147 0 : }
|