-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
Ruby bugtracker gives 500 occasionally GitHub goes down too of course but now the eggs are all in one basket
- Loading branch information
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
From 2cd56ff98bdb291b9b5e2d0e3fd4cd315076c904 Mon Sep 17 00:00:00 2001 | ||
From: Natanael Copa <[email protected]> | ||
Date: Wed, 14 Mar 2018 14:14:11 +0100 | ||
Subject: [PATCH] thread_pthread.c: make get_main_stack portable on linux | ||
|
||
We can not rely on the calculated stack size from pthread_getattr_np() | ||
for the main thread, because the way this is calculated may differ | ||
depending on implementation. The _np means non-portable. | ||
|
||
So we test if it is a known implementation (__GLIBC__) and fallback to a | ||
portable way on Linux by parsing /proc/self/maps to get the stack for | ||
main thread. We also add a 100MB safety limit so we don't reserve_stack | ||
with an insane value. | ||
|
||
Credit goes to Szabolcs Nagy for this code. | ||
--- | ||
thread_pthread.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++--- | ||
1 file changed, 49 insertions(+), 3 deletions(-) | ||
|
||
diff --git a/thread_pthread.c b/thread_pthread.c | ||
index 951885ffa0..cf90321d1d 100644 | ||
--- a/thread_pthread.c | ||
+++ b/thread_pthread.c | ||
@@ -530,9 +530,6 @@ hpux_attr_getstackaddr(const pthread_attr_t *attr, void **addr) | ||
# define MAINSTACKADDR_AVAILABLE 0 | ||
# endif | ||
#endif | ||
-#if MAINSTACKADDR_AVAILABLE && !defined(get_main_stack) | ||
-# define get_main_stack(addr, size) get_stack(addr, size) | ||
-#endif | ||
|
||
#ifdef STACKADDR_AVAILABLE | ||
/* | ||
@@ -614,6 +611,55 @@ get_stack(void **addr, size_t *size) | ||
return 0; | ||
#undef CHECK_ERR | ||
} | ||
+ | ||
+#if defined(__linux__) && !defined(__GLIBC__) && defined(HAVE_GETRLIMIT) | ||
+ | ||
+#ifndef PAGE_SIZE | ||
+#include <unistd.h> | ||
+#define PAGE_SIZE sysconf(_SC_PAGE_SIZE) | ||
+#endif | ||
+ | ||
+static int | ||
+get_main_stack(void **addr, size_t *size) | ||
+{ | ||
+ size_t start, end, limit, prevend = 0; | ||
+ struct rlimit r; | ||
+ FILE *f; | ||
+ char buf[PATH_MAX+80], s[8]; | ||
+ int n; | ||
+ STACK_GROW_DIR_DETECTION; | ||
+ | ||
+ f = fopen("/proc/self/maps", "re"); | ||
+ if (!f) | ||
+ return -1; | ||
+ n = 0; | ||
+ while (fgets(buf, sizeof buf, f)) { | ||
+ n = sscanf(buf, "%zx-%zx %*s %*s %*s %*s %7s", &start, &end, s); | ||
+ if (n >= 2) { | ||
+ if (n == 3 && strcmp(s, "[stack]") == 0) | ||
+ break; | ||
+ prevend = end; | ||
+ } | ||
+ n = 0; | ||
+ } | ||
+ fclose(f); | ||
+ if (n == 0) | ||
+ return -1; | ||
+ | ||
+ limit = 100 << 20; /* 100MB stack limit */ | ||
+ if (getrlimit(RLIMIT_STACK, &r)==0 && r.rlim_cur < limit) | ||
+ limit = r.rlim_cur & -PAGE_SIZE; | ||
+ if (limit > end) limit = end; | ||
+ if (prevend < end - limit) prevend = end - limit; | ||
+ if (start > prevend) start = prevend; | ||
+ *addr = IS_STACK_DIR_UPPER() ? (void *)start : (void *)end; | ||
+ *size = end - start; | ||
+ return 0; | ||
+} | ||
+#else | ||
+# define get_main_stack(addr, size) get_stack(addr, size) | ||
+#endif | ||
+ | ||
#endif | ||
|
||
static struct { | ||
-- | ||
2.16.2 | ||
|