Skip to content

Commit 174acd4

Browse files
rmacnak-googleCommit Queue
authored andcommitted
[vm] Print some resource usage and limits when pthread_create fails.
TEST=ulimit Bug: flutter/flutter#164591 Change-Id: Ica782d6e9dbf8da3017f6cf65196564bbed40f2f Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/419988 Reviewed-by: Alexander Aprelev <[email protected]> Commit-Queue: Ryan Macnak <[email protected]>
1 parent 4463abc commit 174acd4

File tree

1 file changed

+38
-4
lines changed

1 file changed

+38
-4
lines changed

runtime/vm/os_thread_linux.cc

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@
88

99
#include "vm/os_thread.h"
1010

11-
#include <errno.h> // NOLINT
11+
#include <errno.h>
12+
#include <fcntl.h>
1213
#include <stdio.h>
13-
#include <sys/resource.h> // NOLINT
14-
#include <sys/syscall.h> // NOLINT
15-
#include <sys/time.h> // NOLINT
14+
#include <sys/resource.h>
15+
#include <sys/syscall.h>
16+
#include <sys/time.h>
1617

1718
#include "platform/address_sanitizer.h"
1819
#include "platform/assert.h"
@@ -114,6 +115,39 @@ int OSThread::TryStart(const char* name,
114115

115116
pthread_t tid;
116117
result = pthread_create(&tid, &attr, ThreadStart, data);
118+
if (result != 0) {
119+
fprintf(stderr, "pthread_create failed\n");
120+
const char* const kPaths[] = {
121+
"/proc/self/limits",
122+
"/proc/sys/kernel/threads-max",
123+
"/proc/sys/kernel/pid_max",
124+
"/sys/fs/cgroup/user.slice/memory.current",
125+
"/sys/fs/cgroup/user.slice/memory.max",
126+
"/sys/fs/cgroup/user.slice/memory.peak",
127+
"/sys/fs/cgroup/user.slice/pids.current",
128+
"/sys/fs/cgroup/user.slice/pids.max",
129+
"/sys/fs/cgroup/user.slice/pids.peak",
130+
};
131+
for (uintptr_t i = 0; i < ARRAY_SIZE(kPaths); i++) {
132+
const char* path = kPaths[i];
133+
134+
int fd = open(path, O_RDONLY | O_CLOEXEC);
135+
if (fd < 0) {
136+
fprintf(stderr, "%s: Failed to open\n", path);
137+
continue;
138+
}
139+
const intptr_t kBufferSize = 2048;
140+
char buffer[kBufferSize];
141+
memset(buffer, 0, kBufferSize);
142+
ssize_t red = read(fd, buffer, kBufferSize - 1);
143+
close(fd);
144+
if (red < 0) {
145+
fprintf(stderr, "%s: Failed to read\n", path);
146+
continue;
147+
}
148+
fprintf(stderr, "%s: %s\n", path, buffer);
149+
}
150+
}
117151
RETURN_ON_PTHREAD_FAILURE(result);
118152

119153
result = pthread_attr_destroy(&attr);

0 commit comments

Comments
 (0)