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