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 2128814 : static void debug_traceid_trace_fde(struct tevent_fd *fde, 26 : enum tevent_event_trace_point point, 27 : void *private_data) 28 : { 29 2128814 : switch (point) { 30 665922 : case TEVENT_EVENT_TRACE_ATTACH: 31 : /* Assign the current traceid id when the event is created. */ 32 665922 : tevent_fd_set_tag(fde, debug_traceid_get()); 33 665922 : break; 34 797343 : case TEVENT_EVENT_TRACE_BEFORE_HANDLER: 35 : /* Set the traceid id when a handler is being called. */ 36 797343 : debug_traceid_set(tevent_fd_get_tag(fde)); 37 797343 : break; 38 665549 : default: 39 : /* Do nothing. */ 40 665549 : break; 41 : } 42 2128814 : } 43 : 44 277 : static void debug_traceid_trace_signal(struct tevent_signal *se, 45 : enum tevent_event_trace_point point, 46 : void *private_data) 47 : { 48 277 : 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 31 : case TEVENT_EVENT_TRACE_BEFORE_HANDLER: 54 : /* Set the traceid id when a handler is being called. */ 55 31 : debug_traceid_set(tevent_signal_get_tag(se)); 56 31 : break; 57 0 : default: 58 : /* Do nothing. */ 59 0 : break; 60 : } 61 277 : } 62 : 63 248824 : static void debug_traceid_trace_timer(struct tevent_timer *timer, 64 : enum tevent_event_trace_point point, 65 : void *private_data) 66 : { 67 248824 : switch (point) { 68 121773 : case TEVENT_EVENT_TRACE_ATTACH: 69 : /* Assign the current traceid id when the event is created. */ 70 121773 : tevent_timer_set_tag(timer, debug_traceid_get()); 71 121773 : break; 72 5406 : case TEVENT_EVENT_TRACE_BEFORE_HANDLER: 73 : /* Set the traceid id when a handler is being called. */ 74 5406 : debug_traceid_set(tevent_timer_get_tag(timer)); 75 5406 : break; 76 121645 : default: 77 : /* Do nothing. */ 78 121645 : break; 79 : } 80 248824 : } 81 : 82 2696809 : static void debug_traceid_trace_immediate(struct tevent_immediate *im, 83 : enum tevent_event_trace_point point, 84 : void *private_data) 85 : { 86 2696809 : switch (point) { 87 969929 : case TEVENT_EVENT_TRACE_ATTACH: 88 : /* Assign the current traceid id when the event is created. */ 89 969929 : tevent_immediate_set_tag(im, debug_traceid_get()); 90 969929 : break; 91 756951 : case TEVENT_EVENT_TRACE_BEFORE_HANDLER: 92 : /* Set the traceid id when a handler is being called. */ 93 756951 : debug_traceid_set(tevent_immediate_get_tag(im)); 94 756951 : break; 95 969929 : default: 96 : /* Do nothing. */ 97 969929 : break; 98 : } 99 2696809 : } 100 : 101 1047743 : static void debug_traceid_trace_queue(struct tevent_queue_entry *qe, 102 : enum tevent_event_trace_point point, 103 : void *private_data) 104 : { 105 1047743 : switch (point) { 106 349247 : case TEVENT_EVENT_TRACE_ATTACH: 107 : /* Assign the current traceid id when the event is created. */ 108 349247 : tevent_queue_entry_set_tag(qe, debug_traceid_get()); 109 349247 : break; 110 349250 : case TEVENT_EVENT_TRACE_BEFORE_HANDLER: 111 : /* Set the traceid id when a handler is being called. */ 112 349250 : debug_traceid_set(tevent_queue_entry_get_tag(qe)); 113 349250 : break; 114 349246 : default: 115 : /* Do nothing. */ 116 349246 : break; 117 : } 118 1047743 : } 119 : 120 4724719 : static void debug_traceid_trace_loop(enum tevent_trace_point point, 121 : void *private_data) 122 : { 123 4724719 : switch (point) { 124 1559690 : 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 1559690 : debug_traceid_set(1); 131 1559690 : break; 132 3165029 : default: 133 : /* Do nothing. */ 134 3165029 : break; 135 : } 136 4724719 : } 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 : }