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