From fe17080c88246781cc2c398c6a1e9e8d4419d558 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Fri, 25 Jul 2014 13:47:57 +0000 Subject: [PATCH] tsan: fix and make faster GetRSS It is currently broken because it reads a wrong value from profile (heap instead of total). Also make it faster by reading /proc/self/statm. Reading of /proc/self/smaps can consume more than 50% of time on beefy apps if done every 100ms. llvm-svn: 213942 --- compiler-rt/lib/tsan/rtl/tsan_platform_linux.cc | 27 ++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cc b/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cc index 53ecfc6..ec20d68 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cc @@ -109,9 +109,30 @@ void WriteMemoryProfile(char *buf, uptr buf_size, uptr nthread, uptr nlive) { } uptr GetRSS() { - uptr mem[7] = {}; - __sanitizer::GetMemoryProfile(FillProfileCallback, mem, 7); - return mem[6]; + uptr fd = OpenFile("/proc/self/statm", false); + if ((sptr)fd < 0) + return 0; + char buf[64]; + uptr len = internal_read(fd, buf, sizeof(buf) - 1); + internal_close(fd); + if ((sptr)len <= 0) + return 0; + buf[len] = 0; + // The format of the file is: + // 1084 89 69 11 0 79 0 + // We need the second number which is RSS in 4K units. + char *pos = buf; + // Skip the first number. + while (*pos >= '0' && *pos <= '9') + pos++; + // Skip whitespaces. + while (!(*pos >= '0' && *pos <= '9') && *pos != 0) + pos++; + // Read the number. + uptr rss = 0; + while (*pos >= '0' && *pos <= '9') + rss = rss * 10 + *pos++ - '0'; + return rss * 4096; } #if SANITIZER_LINUX -- 2.7.4