1981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* 2981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * tracebuf.c 3981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * 4981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved. 5981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * All rights reserved. 6981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * 7981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * Redistribution and use in source and binary forms, with or without 8981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * modification, are permitted provided that the following conditions 9981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * are met: 10981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * 11981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * * Redistributions of source code must retain the above copyright 12981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * notice, this list of conditions and the following disclaimer. 13981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * * Redistributions in binary form must reproduce the above copyright 14981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * notice, this list of conditions and the following disclaimer in 15981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * the documentation and/or other materials provided with the 16981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * distribution. 17981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * * Neither the name Texas Instruments nor the names of its 18981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * contributors may be used to endorse or promote products derived 19981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * from this software without specific prior written permission. 20981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * 21981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt */ 33981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 34981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* 35981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * Benchmark tracing utility 36981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt */ 37981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 38981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "osApi.h" 39981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "tracebuf.h" 40981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "tracebuf_api.h" 41981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "report.h" 42981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 43981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidttypedef struct { 44981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt unsigned long loc;/* trace entry identification */ 45981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt unsigned long ts;/* Timestamp */ 46981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt unsigned long p1; /* Parameter 1 */ 47981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt unsigned long p2; /* Parameter 2 */ 48981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt char msg[MAX_TB_MSG]; 49981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt} tb_entry_t; 50981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 51981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidttypedef struct { 52981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt int pos; 53981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt int count; 54981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt int print_pos; 55981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt int nusers; 56981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt unsigned long self_delay; 57981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt unsigned long options; 58981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_entry_t entry[1]; /* Array of entries */ 59981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt} tb_control_t; 60981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 61981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidtstatic tb_control_t *tb_control; 62981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 63981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidtstatic int tb_control_size(void) 64981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{ 65981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt return TI_FIELD_OFFSET(tb_control_t, entry) + sizeof(tb_entry_t)*TB_NUM_ENTRIES; 66981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt} 67981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 68981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 69981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* Initialization */ 70981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidtint tb_init(unsigned long options) 71981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{ 72981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt if (tb_control) 73981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt { 74981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt ++tb_control->nusers; 75981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt return 0; 76981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt } 77981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_control = (tb_control_t *)TB_MALLOC(tb_control_size()); 78981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt if (!tb_control) 79981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt return -1; 80981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt memset(tb_control, 0, tb_control_size()); 81981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_control->nusers = 1; 82981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 83981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt /* Measure self-delay */ 84981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_trace(0, 0, 0); 85981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_trace(0, 0, 0); 86981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_control->self_delay = tb_control->entry[1].ts - tb_control->entry[0].ts; 87981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_control->pos = tb_control->count = 0; 88981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_control->options = options; 89981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt return 0; 90981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt} 91981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 92981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* De-initialization */ 93981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidtvoid tb_destroy(void) 94981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{ 95981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt if (--tb_control->nusers) 96981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt return; 97981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt TB_FREE(tb_control ); 98981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt} 99981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 100981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidtstatic int tb_next(void) 101981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{ 102981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt int pos; 103981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt if (!tb_control || tb_control->print_pos) 104981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt return -1; 105981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt pos = tb_control->pos; 106981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_control->pos = (pos+1) % TB_NUM_ENTRIES; 107981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt ++tb_control->count; 108981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 109981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_control->entry[tb_control->pos].ts = 110981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_control->entry[tb_control->pos].loc= 111981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_control->entry[tb_control->pos].p1 = 112981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_control->entry[tb_control->pos].p2 = 0xffffffff; 113981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 114981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt return pos; 115981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt} 116981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidtstatic void tb_autoprint(void) 117981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{ 118981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt if ((tb_control->pos == 0) && (tb_control->count)) 119981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt { 120981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt if (tb_control->options & TB_OPTION_PRINTONCE) 121981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt { 122981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_printf(); 123981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_reset_option(TB_OPTION_PRINTONCE); 124981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt } 125981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt else if (tb_control->options & TB_OPTION_AUTOPRINT) 126981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt { 127981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_printf(); 128981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt } 129981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt } 130981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt} 131981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 132981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* Add trace entry. not safe, but will do */ 133981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidtint tb_trace(int loc, unsigned long p1, unsigned long p2) 134981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{ 135981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt int pos; 136981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 137981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt if ((tb_control->options & TB_OPTION_STOP) || ((pos = tb_next()) < 0)) 138981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt { 139981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt return -1; 140981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt } 141981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_control->entry[pos].ts = os_timeStampUs(NULL); 142981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_control->entry[pos].loc= loc; 143981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_control->entry[pos].p1 = p1; 144981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_control->entry[pos].p2 = p2; 145981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 146981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt return pos; 147981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt} 148981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidtvoid tb_dump(void) 149981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{ 150981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt int j, pos; 151981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 152981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt WLAN_OS_REPORT(("Trace Dump:\n")); 153981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt WLAN_OS_REPORT(("===========\n\n")); 154981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt if (tb_control->count < TB_NUM_ENTRIES) 155981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt { 156981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt pos = 0; 157981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt } 158981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt else 159981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt { 160981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt pos = (tb_control->pos + 1) % TB_NUM_ENTRIES; 161981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt } 162981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt for (j=0; (unsigned int)j < tb_min((unsigned int)TB_NUM_ENTRIES,(unsigned int)tb_control->count); j++) 163981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt { 164981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt WLAN_OS_REPORT(("%4i %08x %08x %08x %08x\n", j, 165981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt (int)tb_control->entry[pos].ts, 166981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt (int)tb_control->entry[pos].loc, 167981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt (int)tb_control->entry[pos].p1, 168981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt (int)tb_control->entry[pos].p2)); 169981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt pos = (pos+1) % TB_NUM_ENTRIES; 170981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt } 171981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 172981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt} 173981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 174981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidtint tb_sprintf(const char *format ,...) 175981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{ 176981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 177981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt va_list ap; 178981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt int pos; 179981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 180981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt if ((tb_control->options & TB_OPTION_STOP) || ((pos = tb_next()) < 0)) 181981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt { 182981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt return -1; 183981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt } 184981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_control->entry[pos].loc = TB_ID; 185981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt va_start(ap,format); 186981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt vsprintf(&tb_control->entry[pos].msg[0], format, ap); 187981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_autoprint(); 188981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt return pos; 189981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt} 190981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 191981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidtvoid tb_printf(void) 192981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{ 193981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt int j, pos; 194981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt unsigned long saved_options=tb_control->options; 195981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 196981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_set_option(TB_OPTION_STOP); 197981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt WLAN_OS_REPORT(("Trace Dump:\n")); 198981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt WLAN_OS_REPORT(("===========\n\n")); 199981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt if (tb_control->count < TB_NUM_ENTRIES) 200981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt { 201981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt pos = 0; 202981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt } 203981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt else 204981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt { 205981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt pos = (tb_control->pos + 1) % TB_NUM_ENTRIES; 206981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt } 207981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt for (j=0; (unsigned int)j < tb_min((unsigned int)TB_NUM_ENTRIES,(unsigned int)tb_control->count); j++) 208981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt { 209981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt WLAN_OS_REPORT(("%4i id=0x%8x %s \n", j, 210981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidttb_control->entry[pos].loc, tb_control->entry[pos].msg)); 211981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt pos = (pos+1) % TB_NUM_ENTRIES; 212981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt } 213981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_control->options = saved_options; 214981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt} 215981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidtvoid tb_set_option(unsigned long option) 216981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{ 217981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_control->options |= option; 218981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt} 219981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 220981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidtvoid tb_reset_option(unsigned long option) 221981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{ 222981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_control->options &= ~option; 223981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt} 224981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 225981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidtvoid tb_scan(void) 226981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{ 227981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 228981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt int j,k, Size, nAllocs=0, nFrees=0; 229981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt unsigned long address, Allocs=0, Frees=0; 230981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 231981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt for (j=0; j < TB_NUM_ENTRIES; j++) 232981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt { 233981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt Size = (int)tb_control->entry[j].p2; 234981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt if (Size > 0) /* Alloc */ 235981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt { 236981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt nAllocs += 1; 237981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt Allocs += Size; 238981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt address = tb_control->entry[j].p1; 239981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt for (k=j+1; k < TB_NUM_ENTRIES; k++) 240981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt { 241981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt if (address == tb_control->entry[k].p1) 242981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt { 243981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt if (tb_control->entry[k].p2 != -Size) 244981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt { 245981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt TB_PRINTF("Bad free size at 0x%lx address = 0x%lx Size = %ld Allocated = %d\n", 246981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_control->entry[k].loc, tb_control->entry[k].p1, (long)tb_control->entry[k].p2, Size); 247981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt } 248981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt Frees += tb_control->entry[k].p2; 249981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt nFrees += 1; 250981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt break; 251981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt } 252981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt } 253981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt if (k == TB_NUM_ENTRIES) 254981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt { 255981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt TB_PRINTF("Memory leak at 0x%lx address = 0x%lx Size = %d\n", 256981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt tb_control->entry[j].loc, address, Size); 257981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt } 258981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt } 259981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt } 260981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt TB_PRINTF("tb_scan() Allocs = %ld nAllocs = %d Frees = %ld nFrees = %d\n", Allocs, nAllocs, Frees, nFrees); 261981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt} 262981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt 263