diff options
author | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 1999-11-01 23:15:51 +0000 |
---|---|---|
committer | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 1999-11-01 23:15:51 +0000 |
commit | 9bc8642e1f366a35c305b9abe9e01bf934b584b9 (patch) | |
tree | 9c24ba1ebabff472b9caddbff07ef957dbf2c24c /boehm-gc/solaris_threads.c | |
parent | 79eaf784f16b0e8079d9dca062a0fc959d289d18 (diff) | |
download | gcc-9bc8642e1f366a35c305b9abe9e01bf934b584b9.tar.gz |
Merged GC 5.0alpha4 with local changes, plus:
* Makefile.in: Rebuilt.
* Makefile.am (gctest_LDADD): Added THREADLIB.
(TESTS): New macro.
* configure: Rebuilt.
* configure.in (INCLUDES): New subst.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@30332 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'boehm-gc/solaris_threads.c')
-rw-r--r-- | boehm-gc/solaris_threads.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/boehm-gc/solaris_threads.c b/boehm-gc/solaris_threads.c index 1f5ebcdc390..65b2c6517b1 100644 --- a/boehm-gc/solaris_threads.c +++ b/boehm-gc/solaris_threads.c @@ -616,6 +616,25 @@ GC_thread GC_lookup_thread(thread_t id) return(p); } +# define MAX_ORIG_STACK_SIZE (8 * 1024 * 1024) + +word GC_get_orig_stack_size() { + struct rlimit rl; + static int warned = 0; + int result; + + if (getrlimit(RLIMIT_STACK, &rl) != 0) ABORT("getrlimit failed"); + result = (word)rl.rlim_cur & ~(HBLKSIZE-1); + if (result > MAX_ORIG_STACK_SIZE) { + if (!warned) { + WARN("Large stack limit(%ld): only scanning 8 MB", result); + warned = 1; + } + result = MAX_ORIG_STACK_SIZE; + } + return result; +} + /* Notify dirty bit implementation of unused parts of my stack. */ /* Caller holds allocation lock. */ void GC_my_stack_limits() @@ -628,12 +647,9 @@ void GC_my_stack_limits() if (stack_size == 0) { /* original thread */ - struct rlimit rl; - - if (getrlimit(RLIMIT_STACK, &rl) != 0) ABORT("getrlimit failed"); /* Empirically, what should be the stack page with lowest */ /* address is actually inaccessible. */ - stack_size = ((word)rl.rlim_cur & ~(HBLKSIZE-1)) - GC_page_sz; + stack_size = GC_get_orig_stack_size() - GC_page_sz; stack = GC_stackbottom - stack_size + GC_page_sz; } else { stack = me -> stack; @@ -671,8 +687,7 @@ void GC_push_all_stacks() top = p -> stack + p -> stack_size; } else { /* The original stack. */ - if (getrlimit(RLIMIT_STACK, &rl) != 0) ABORT("getrlimit failed"); - bottom = GC_stackbottom - rl.rlim_cur + GC_page_sz; + bottom = GC_stackbottom - GC_get_orig_stack_size() + GC_page_sz; top = GC_stackbottom; } if ((word)sp > (word)bottom && (word)sp < (word)top) bottom = sp; |