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