archives/ruby3.2: new aport
This commit is contained in:
parent
e7773e8def
commit
a6bb19365d
6 changed files with 443 additions and 0 deletions
68
archives/ruby3.2/fix-get_main_stack.patch
Normal file
68
archives/ruby3.2/fix-get_main_stack.patch
Normal file
|
@ -0,0 +1,68 @@
|
|||
--- a/thread_pthread.c
|
||||
+++ b/thread_pthread.c
|
||||
@@ -858,9 +858,6 @@
|
||||
# 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
|
||||
/*
|
||||
@@ -942,6 +939,55 @@
|
||||
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 {
|
Loading…
Add table
Add a link
Reference in a new issue