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 2497262 : static void debug_traceid_trace_fde(struct tevent_fd *fde, 26 : enum tevent_event_trace_point point, 27 : void *private_data) 28 : { 29 2497262 : switch (point) { 30 782909 : case TEVENT_EVENT_TRACE_ATTACH: 31 : /* Assign the current traceid id when the event is created. */ 32 782909 : tevent_fd_set_tag(fde, debug_traceid_get()); 33 782909 : break; 34 931850 : case TEVENT_EVENT_TRACE_BEFORE_HANDLER: 35 : /* Set the traceid id when a handler is being called. */ 36 931850 : debug_traceid_set(tevent_fd_get_tag(fde)); 37 931850 : break; 38 782503 : default: 39 : /* Do nothing. */ 40 782503 : break; 41 : } 42 2497262 : } 43 : 44 301 : static void debug_traceid_trace_signal(struct tevent_signal *se, 45 : enum tevent_event_trace_point point, 46 : void *private_data) 47 : { 48 301 : switch (point) { 49 270 : case TEVENT_EVENT_TRACE_ATTACH: 50 : /* Assign the current traceid id when the event is created. */ 51 270 : tevent_signal_set_tag(se, debug_traceid_get()); 52 270 : 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 301 : } 62 : 63 284435 : static void debug_traceid_trace_timer(struct tevent_timer *timer, 64 : enum tevent_event_trace_point point, 65 : void *private_data) 66 : { 67 284435 : switch (point) { 68 139136 : case TEVENT_EVENT_TRACE_ATTACH: 69 : /* Assign the current traceid id when the event is created. */ 70 139136 : tevent_timer_set_tag(timer, debug_traceid_get()); 71 139136 : break; 72 6304 : case TEVENT_EVENT_TRACE_BEFORE_HANDLER: 73 : /* Set the traceid id when a handler is being called. */ 74 6304 : debug_traceid_set(tevent_timer_get_tag(timer)); 75 6304 : break; 76 138995 : default: 77 : /* Do nothing. */ 78 138995 : break; 79 : } 80 284435 : } 81 : 82 3158874 : static void debug_traceid_trace_immediate(struct tevent_immediate *im, 83 : enum tevent_event_trace_point point, 84 : void *private_data) 85 : { 86 3158874 : switch (point) { 87 1137862 : case TEVENT_EVENT_TRACE_ATTACH: 88 : /* Assign the current traceid id when the event is created. */ 89 1137862 : tevent_immediate_set_tag(im, debug_traceid_get()); 90 1137862 : break; 91 883150 : case TEVENT_EVENT_TRACE_BEFORE_HANDLER: 92 : /* Set the traceid id when a handler is being called. */ 93 883150 : debug_traceid_set(tevent_immediate_get_tag(im)); 94 883150 : break; 95 1137862 : default: 96 : /* Do nothing. */ 97 1137862 : break; 98 : } 99 3158874 : } 100 : 101 1229963 : static void debug_traceid_trace_queue(struct tevent_queue_entry *qe, 102 : enum tevent_event_trace_point point, 103 : void *private_data) 104 : { 105 1229963 : switch (point) { 106 409984 : case TEVENT_EVENT_TRACE_ATTACH: 107 : /* Assign the current traceid id when the event is created. */ 108 409984 : tevent_queue_entry_set_tag(qe, debug_traceid_get()); 109 409984 : break; 110 409995 : case TEVENT_EVENT_TRACE_BEFORE_HANDLER: 111 : /* Set the traceid id when a handler is being called. */ 112 409995 : debug_traceid_set(tevent_queue_entry_get_tag(qe)); 113 409995 : break; 114 409984 : default: 115 : /* Do nothing. */ 116 409984 : break; 117 : } 118 1229963 : } 119 : 120 5518725 : static void debug_traceid_trace_loop(enum tevent_trace_point point, 121 : void *private_data) 122 : { 123 5518725 : switch (point) { 124 1821290 : 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 1821290 : debug_traceid_set(1); 131 1821290 : break; 132 3697435 : default: 133 : /* Do nothing. */ 134 3697435 : break; 135 : } 136 5518725 : } 137 : 138 45 : void winbind_debug_traceid_setup(struct tevent_context *ev) 139 : { 140 45 : tevent_set_trace_callback(ev, debug_traceid_trace_loop, NULL); 141 45 : tevent_set_trace_fd_callback(ev, debug_traceid_trace_fde, NULL); 142 45 : tevent_set_trace_signal_callback(ev, debug_traceid_trace_signal, NULL); 143 45 : tevent_set_trace_timer_callback(ev, debug_traceid_trace_timer, NULL); 144 45 : tevent_set_trace_immediate_callback(ev, debug_traceid_trace_immediate, NULL); 145 45 : tevent_set_trace_queue_callback(ev, debug_traceid_trace_queue, NULL); 146 45 : debug_traceid_set(1); 147 45 : }