memlog.h (1974B)
1 /* 2 * 3 * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file. 4 * 5 * Copyright 2007-2019 Broadcom Inc. All rights reserved. 6 * 7 * File: memlog.h 8 * Purpose: Supports memlog memory leak tool 9 */ 10 11 #ifndef _SAL_MEMLOG_H 12 #define _SAL_MEMLOG_H 13 14 #if defined(MEMLOG_SUPPORT) && defined(__GNUC__) 15 16 #include <stdio.h> 17 #include <unistd.h> 18 #include <sal/core/sync.h> 19 20 #define MEM_LOG_BUF_SIZE 512 21 22 extern sal_mutex_t memlog_lock; 23 extern int memlog_fd; 24 extern char memlog_buf[MEM_LOG_BUF_SIZE]; 25 26 #define MEMLOG_ALLOC(func,ptr,size,string) \ 27 { \ 28 int n; \ 29 if (memlog_fd > 0) { \ 30 if (memlog_lock) { \ 31 sal_mutex_take(memlog_lock, sal_mutex_FOREVER); \ 32 } \ 33 if ((string) != NULL) { \ 34 n = snprintf(memlog_buf, MEM_LOG_BUF_SIZE, "%s %p %p %d %s\n", \ 35 (func), __builtin_return_address(0), (ptr), (size), (string)); \ 36 } else {\ 37 n = snprintf(memlog_buf, MEM_LOG_BUF_SIZE, "%s %p %p %d NULL\n", \ 38 (func), __builtin_return_address(0), (ptr), (size)); \ 39 } \ 40 write(memlog_fd, memlog_buf, n); \ 41 fsync(memlog_fd); \ 42 if (memlog_lock) { \ 43 sal_mutex_give(memlog_lock); \ 44 } \ 45 } \ 46 } 47 48 #define MEMLOG_FREE(func,ptr) \ 49 { \ 50 int n; \ 51 if (memlog_fd > 0) { \ 52 if (memlog_lock) { \ 53 sal_mutex_take(memlog_lock, sal_mutex_FOREVER); \ 54 } \ 55 n = snprintf(memlog_buf, MEM_LOG_BUF_SIZE, "%s %p\n", (func), (ptr)); \ 56 write(memlog_fd, memlog_buf, n); \ 57 fsync(memlog_fd); \ 58 if (memlog_lock) { \ 59 sal_mutex_give(memlog_lock); \ 60 } \ 61 } \ 62 } 63 64 #else 65 66 #define MEMLOG_ALLOC(func,ptr,size,string) 67 #define MEMLOG_FREE(func,ptr) 68 69 #endif 70 71 #endif /* !_SAL_MEMLOG_H */