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 : }