forked from OSchip/llvm-project
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
This commit is contained in:
parent
d712403b98
commit
fe17080c88
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue