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 2225716 : static void debug_traceid_trace_fde(struct tevent_fd *fde, 26 : enum tevent_event_trace_point point, 27 : void *private_data) 28 : { 29 2225716 : switch (point) { 30 695137 : case TEVENT_EVENT_TRACE_ATTACH: 31 : /* Assign the current traceid id when the event is created. */ 32 695137 : tevent_fd_set_tag(fde, debug_traceid_get()); 33 695137 : break; 34 835810 : case TEVENT_EVENT_TRACE_BEFORE_HANDLER: 35 : /* Set the traceid id when a handler is being called. */ 36 835810 : debug_traceid_set(tevent_fd_get_tag(fde)); 37 835810 : break; 38 694769 : default: 39 : /* Do nothing. */ 40 694769 : break; 41 : } 42 2225716 : } 43 : 44 275 : static void debug_traceid_trace_signal(struct tevent_signal *se, 45 : enum tevent_event_trace_point point, 46 : void *private_data) 47 : { 48 275 : switch (point) { 49 246 : case TEVENT_EVENT_TRACE_ATTACH: 50 : /* Assign the current traceid id when the event is created. */ 51 246 : tevent_signal_set_tag(se, debug_traceid_get()); 52 246 : break; 53 29 : case TEVENT_EVENT_TRACE_BEFORE_HANDLER: 54 : /* Set the traceid id when a handler is being called. */ 55 29 : debug_traceid_set(tevent_signal_get_tag(se)); 56 29 : break; 57 0 : default: 58 : /* Do nothing. */ 59 0 : break; 60 : } 61 275 : } 62 : 63 264316 : static void debug_traceid_trace_timer(struct tevent_timer *timer, 64 : enum tevent_event_trace_point point, 65 : void *private_data) 66 : { 67 264316 : switch (point) { 68 129510 : case TEVENT_EVENT_TRACE_ATTACH: 69 : /* Assign the current traceid id when the event is created. */ 70 129510 : tevent_timer_set_tag(timer, debug_traceid_get()); 71 129510 : break; 72 5423 : case TEVENT_EVENT_TRACE_BEFORE_HANDLER: 73 : /* Set the traceid id when a handler is being called. */ 74 5423 : debug_traceid_set(tevent_timer_get_tag(timer)); 75 5423 : break; 76 129383 : default: 77 : /* Do nothing. */ 78 129383 : break; 79 : } 80 264316 : } 81 : 82 2849788 : static void debug_traceid_trace_immediate(struct tevent_immediate *im, 83 : enum tevent_event_trace_point point, 84 : void *private_data) 85 : { 86 2849788 : switch (point) { 87 1023123 : case TEVENT_EVENT_TRACE_ATTACH: 88 : /* Assign the current traceid id when the event is created. */ 89 1023123 : tevent_immediate_set_tag(im, debug_traceid_get()); 90 1023123 : break; 91 803542 : case TEVENT_EVENT_TRACE_BEFORE_HANDLER: 92 : /* Set the traceid id when a handler is being called. */ 93 803542 : debug_traceid_set(tevent_immediate_get_tag(im)); 94 803542 : break; 95 1023123 : default: 96 : /* Do nothing. */ 97 1023123 : break; 98 : } 99 2849788 : } 100 : 101 1098336 : static void debug_traceid_trace_queue(struct tevent_queue_entry *qe, 102 : enum tevent_event_trace_point point, 103 : void *private_data) 104 : { 105 1098336 : switch (point) { 106 366111 : case TEVENT_EVENT_TRACE_ATTACH: 107 : /* Assign the current traceid id when the event is created. */ 108 366111 : tevent_queue_entry_set_tag(qe, debug_traceid_get()); 109 366111 : break; 110 366114 : case TEVENT_EVENT_TRACE_BEFORE_HANDLER: 111 : /* Set the traceid id when a handler is being called. */ 112 366114 : debug_traceid_set(tevent_queue_entry_get_tag(qe)); 113 366114 : break; 114 366111 : default: 115 : /* Do nothing. */ 116 366111 : break; 117 : } 118 1098336 : } 119 : 120 4971829 : static void debug_traceid_trace_loop(enum tevent_trace_point point, 121 : void *private_data) 122 : { 123 4971829 : switch (point) { 124 1644763 : 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 1644763 : debug_traceid_set(1); 131 1644763 : break; 132 3327066 : default: 133 : /* Do nothing. */ 134 3327066 : break; 135 : } 136 4971829 : } 137 : 138 41 : void winbind_debug_traceid_setup(struct tevent_context *ev) 139 : { 140 41 : tevent_set_trace_callback(ev, debug_traceid_trace_loop, NULL); 141 41 : tevent_set_trace_fd_callback(ev, debug_traceid_trace_fde, NULL); 142 41 : tevent_set_trace_signal_callback(ev, debug_traceid_trace_signal, NULL); 143 41 : tevent_set_trace_timer_callback(ev, debug_traceid_trace_timer, NULL); 144 41 : tevent_set_trace_immediate_callback(ev, debug_traceid_trace_immediate, NULL); 145 41 : tevent_set_trace_queue_callback(ev, debug_traceid_trace_queue, NULL); 146 41 : debug_traceid_set(1); 147 41 : }