18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Backtrace debugging
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2009, Jouni Malinen <j@w1.fi>
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license.
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details.
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef TRACE_H
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define TRACE_H
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define WPA_TRACE_LEN 16
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef WPA_TRACE
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <execinfo.h>
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "list.h"
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define WPA_TRACE_INFO void *btrace[WPA_TRACE_LEN]; int btrace_num;
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpa_trace_ref {
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct dl_list list;
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const void *addr;
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	WPA_TRACE_INFO
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define WPA_TRACE_REF(name) struct wpa_trace_ref wpa_trace_ref_##name
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_trace_dump(title, ptr) \
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_trace_dump_func((title), (ptr)->btrace, (ptr)->btrace_num)
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_trace_dump_func(const char *title, void **btrace, int btrace_num);
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_trace_record(ptr) \
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	(ptr)->btrace_num = backtrace((ptr)->btrace, WPA_TRACE_LEN)
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_trace_show(const char *title);
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_trace_add_ref(ptr, name, addr) \
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_trace_add_ref_func(&(ptr)->wpa_trace_ref_##name, (addr))
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_trace_add_ref_func(struct wpa_trace_ref *ref, const void *addr);
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_trace_remove_ref(ptr, name, addr)	\
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	do { \
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if ((addr)) \
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			dl_list_del(&(ptr)->wpa_trace_ref_##name.list); \
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} while (0)
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_trace_check_ref(const void *addr);
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* WPA_TRACE */
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define WPA_TRACE_INFO
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define WPA_TRACE_REF(n)
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_trace_dump(title, ptr) do { } while (0)
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_trace_record(ptr) do { } while (0)
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_trace_show(title) do { } while (0)
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_trace_add_ref(ptr, name, addr) do { } while (0)
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_trace_remove_ref(ptr, name, addr) do { } while (0)
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_trace_check_ref(addr) do { } while (0)
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* WPA_TRACE */
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef WPA_TRACE_BFD
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid wpa_trace_dump_funcname(const char *title, void *pc);
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* WPA_TRACE_BFD */
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define wpa_trace_dump_funcname(title, pc) do { } while (0)
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* WPA_TRACE_BFD */
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* TRACE_H */
69