1 /* 2 * Copyright (C) 2018 Oracle. 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License 6 * as published by the Free Software Foundation; either version 2 7 * of the License, or (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, see http://www.gnu.org/copyleft/gpl.txt 16 */ 17 18 #include "smatch.h" 19 #include <fcntl.h> 20 #include <unistd.h> 21 #include <sys/procfs.h> 22 23 static int my_id; 24 static int my_fd = -2; 25 26 static unsigned long max_size; 27 28 unsigned long get_mem_kb(void) 29 { 30 prpsinfo_t pbuf; 31 32 if (my_fd == -2) { 33 /* Do not repeatedly attempt this if it fails. */ 34 my_fd = open("/proc/self/psinfo", O_RDONLY); 35 } 36 if (my_fd == -1) { 37 return (0); 38 } 39 40 if (pread(my_fd, &pbuf, sizeof (pbuf), 0) != sizeof (pbuf)) { 41 return (0); 42 } 43 44 return (pbuf.pr_rssize); 45 } 46 47 static void match_end_func(struct symbol *sym) 48 { 49 unsigned long size; 50 51 if (option_mem) { 52 size = get_mem_kb(); 53 if (size > max_size) 54 max_size = size; 55 } 56 } 57 58 unsigned long get_max_memory(void) 59 { 60 return max_size; 61 } 62 63 void register_mem_tracker(int id) 64 { 65 my_id = id; 66 67 add_hook(&match_end_func, END_FUNC_HOOK); 68 }