Index: test/cctest/test-mark-compact.cc |
=================================================================== |
--- test/cctest/test-mark-compact.cc (revision 10092) |
+++ test/cctest/test-mark-compact.cc (working copy) |
@@ -27,6 +27,14 @@ |
#include <stdlib.h> |
+#ifdef __linux__ |
+#include <sys/types.h> |
+#include <sys/stat.h> |
+#include <fcntl.h> |
+#include <unistd.h> |
+#include <errno.h> |
+#endif |
+ |
#include "v8.h" |
#include "global-handles.h" |
@@ -444,3 +452,84 @@ |
global_handles->AddImplicitReferences( |
Handle<HeapObject>::cast(object).location(), NULL, 0); |
} |
+ |
+ |
+#ifdef __linux__ |
+ |
+ |
+static uintptr_t ReadLong(char* buffer, intptr_t* position, int base) { |
+ char* end_address = buffer + *position; |
+ uintptr_t result = strtoul(buffer + *position, &end_address, base); |
+ CHECK(result != ULONG_MAX || errno != ERANGE); |
+ CHECK(end_address > buffer + *position); |
+ *position = end_address - buffer; |
+ return result; |
+} |
+ |
+ |
+static intptr_t MemoryInUse() { |
+ intptr_t memory_use = 0; |
+ |
+ int fd = open("/proc/self/maps", O_RDONLY); |
+ if (fd < 0) return -1; |
+ |
+ const int kBufSize = 10000; |
+ char buffer[kBufSize]; |
+ int length = read(fd, buffer, kBufSize); |
+ intptr_t line_start = 0; |
+ CHECK_LT(length, kBufSize); // Make the buffer bigger. |
+ CHECK_GT(length, 0); // We have to find some data in the file. |
+ while (line_start < length) { |
+ if (buffer[line_start] == '\n') { |
+ line_start++; |
+ continue; |
+ } |
+ intptr_t position = line_start; |
+ uintptr_t start = ReadLong(buffer, &position, 16); |
+ CHECK_EQ(buffer[position++], '-'); |
+ uintptr_t end = ReadLong(buffer, &position, 16); |
+ CHECK_EQ(buffer[position++], ' '); |
+ CHECK(buffer[position] == '-' || buffer[position] == 'r'); |
+ bool read_permission = (buffer[position++] == 'r'); |
+ CHECK(buffer[position] == '-' || buffer[position] == 'w'); |
+ bool write_permission = (buffer[position++] == 'w'); |
+ CHECK(buffer[position] == '-' || buffer[position] == 'x'); |
+ bool execute_permission = (buffer[position++] == 'x'); |
+ CHECK(buffer[position] == '-' || buffer[position] == 'p'); |
+ bool private_mapping = (buffer[position++] == 'p'); |
+ CHECK_EQ(buffer[position++], ' '); |
+ uintptr_t offset = ReadLong(buffer, &position, 16); |
+ USE(offset); |
+ CHECK_EQ(buffer[position++], ' '); |
+ uintptr_t major = ReadLong(buffer, &position, 16); |
+ USE(major); |
+ CHECK_EQ(buffer[position++], ':'); |
+ uintptr_t minor = ReadLong(buffer, &position, 16); |
+ USE(minor); |
+ CHECK_EQ(buffer[position++], ' '); |
+ uintptr_t inode = ReadLong(buffer, &position, 10); |
+ while (position < length && buffer[position] != '\n') position++; |
+ if ((read_permission || write_permission || execute_permission) && |
+ private_mapping && inode == 0) { |
+ memory_use += (end - start); |
+ } |
+ |
+ line_start = position; |
+ } |
+ close(fd); |
+ return memory_use; |
+} |
+ |
+ |
+TEST(BootUpMemoryUse) { |
+ intptr_t initial_memory = MemoryInUse(); |
+ // Only Linux has the proc filesystem and only if it is mapped. If it's not |
+ // there we just skip the test. |
+ if (initial_memory >= 0) { |
+ InitializeVM(); |
+ intptr_t booted_memory = MemoryInUse(); |
+ CHECK_LE(booted_memory - initial_memory, 20 * 1024 * 1024); |
+ } |
+} |
+ |
+#endif |
Michael Starzinger
2011/12/01 11:44:13
Please add an "// __linux__" comment here.
|