Powered by Linux
[PATCH] Implement memory tracker for Solarish systems — Semantic Matching Tool

[PATCH] Implement memory tracker for Solarish systems

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Patrick Mooney <pmooney@xxxxxxxxxxxx>

In addition, only try to track if requested by the mem option.

Portions-contributed-by: John Levon <john.levon@xxxxxxxxxx>
---
 smatch_mem_tracker.c | 39 ++++++++++++++++++++++++++++++++++-----
 1 file changed, 34 insertions(+), 5 deletions(-)

diff --git a/smatch_mem_tracker.c b/smatch_mem_tracker.c
index b1671857..a92b8f35 100644
--- a/smatch_mem_tracker.c
+++ b/smatch_mem_tracker.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2018 Oracle.
+ * Copyright 2019 Joyent, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -16,21 +17,46 @@
  */
 
 #include "smatch.h"
+#include <fcntl.h>
 #include <unistd.h>
+#ifdef __sun
+#include <sys/procfs.h>
+#endif
 
 static int my_id;
 
 static unsigned long max_size;
 
+#ifdef __sun
+unsigned long get_mem_kb(void)
+{
+	static int my_fd = -2;
+	prpsinfo_t pbuf;
+
+	if (my_fd == -2) {
+		/* Do not repeatedly attempt this if it fails. */
+		my_fd = open("/proc/self/psinfo", O_RDONLY);
+	}
+	if (my_fd == -1) {
+		return (0);
+	}
+
+	if (pread(my_fd, &pbuf, sizeof (pbuf), 0) != sizeof (pbuf)) {
+		return (0);
+	}
+
+	return (pbuf.pr_rssize);
+}
+#else
 unsigned long get_mem_kb(void)
 {
 	FILE *file;
-	char buf[1024];
+	char buf[1024] = "0";
 	unsigned long size;
 
 	file = fopen("/proc/self/statm", "r");
 	if (!file)
-		return 0;
+	        return 0;
 	fread(buf, 1, sizeof(buf), file);
 	fclose(file);
 
@@ -38,14 +64,17 @@ unsigned long get_mem_kb(void)
 	size = size * sysconf(_SC_PAGESIZE) / 1024;
 	return size;
 }
+#endif
 
 static void match_end_func(struct symbol *sym)
 {
 	unsigned long size;
 
-	size = get_mem_kb();
-	if (size > max_size)
-		max_size = size;
+	if (option_mem) {
+		size = get_mem_kb();
+		if (size > max_size)
+			max_size = size;
+	}
 }
 
 unsigned long get_max_memory(void)
-- 
2.17.1




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux