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 <unistd.h>
20 
21 static int my_id;
22 
23 static unsigned long max_size;
24 
25 unsigned long get_mem_kb(void)
26 {
27 	FILE *file;
28 	char buf[1024];
29 	unsigned long size;
30 
31 	file = fopen("/proc/self/statm", "r");
32 	if (!file)
33 		return 0;
34 	fread(buf, 1, sizeof(buf), file);
35 	fclose(file);
36 
37 	size = strtoul(buf, NULL, 10);
38 	size = size * sysconf(_SC_PAGESIZE) / 1024;
39 	return size;
40 }
41 
42 static void match_end_func(struct symbol *sym)
43 {
44 	unsigned long size;
45 
46 	if (option_mem) {
47 		size = get_mem_kb();
48 		if (size > max_size)
49 			max_size = size;
50 	}
51 }
52 
53 unsigned long get_max_memory(void)
54 {
55 	return max_size;
56 }
57 
58 void register_mem_tracker(int id)
59 {
60 	my_id = id;
61 
62 	add_hook(&match_end_func, END_FUNC_HOOK);
63 }
64