version 1.2, 2000/12/01 09:26:13 |
version 1.3, 2001/04/20 07:39:19 |
|
|
*/ |
*/ |
/* Boehm, September 14, 1994 4:44 pm PDT */ |
/* Boehm, September 14, 1994 4:44 pm PDT */ |
|
|
# if defined(SOLARIS_THREADS) |
# if defined(GC_SOLARIS_THREADS) || defined(SOLARIS_THREADS) |
|
|
# include "gc_priv.h" |
# include "private/gc_priv.h" |
# include "solaris_threads.h" |
# include "private/solaris_threads.h" |
# include <thread.h> |
# include <thread.h> |
# include <synch.h> |
# include <synch.h> |
# include <signal.h> |
# include <signal.h> |
Line 558 void GC_old_stacks_are_fresh() |
|
Line 558 void GC_old_stacks_are_fresh() |
|
# define THREAD_TABLE_SZ 128 /* Must be power of 2 */ |
# define THREAD_TABLE_SZ 128 /* Must be power of 2 */ |
volatile GC_thread GC_threads[THREAD_TABLE_SZ]; |
volatile GC_thread GC_threads[THREAD_TABLE_SZ]; |
|
|
|
void GC_push_thread_structures GC_PROTO((void)) |
|
{ |
|
GC_push_all((ptr_t)(GC_threads), (ptr_t)(GC_threads)+sizeof(GC_threads)); |
|
} |
|
|
/* Add a thread to GC_threads. We assume it wasn't already there. */ |
/* Add a thread to GC_threads. We assume it wasn't already there. */ |
/* Caller holds allocation lock. */ |
/* Caller holds allocation lock. */ |
GC_thread GC_new_thread(thread_t id) |
GC_thread GC_new_thread(thread_t id) |
Line 573 GC_thread GC_new_thread(thread_t id) |
|
Line 578 GC_thread GC_new_thread(thread_t id) |
|
/* Dont acquire allocation lock, since we may already hold it. */ |
/* Dont acquire allocation lock, since we may already hold it. */ |
} else { |
} else { |
result = (struct GC_Thread_Rep *) |
result = (struct GC_Thread_Rep *) |
GC_generic_malloc_inner(sizeof(struct GC_Thread_Rep), NORMAL); |
GC_INTERNAL_MALLOC(sizeof(struct GC_Thread_Rep), NORMAL); |
} |
} |
if (result == 0) return(0); |
if (result == 0) return(0); |
result -> id = id; |
result -> id = id; |
Line 627 word GC_get_orig_stack_size() { |
|
Line 632 word GC_get_orig_stack_size() { |
|
result = (word)rl.rlim_cur & ~(HBLKSIZE-1); |
result = (word)rl.rlim_cur & ~(HBLKSIZE-1); |
if (result > MAX_ORIG_STACK_SIZE) { |
if (result > MAX_ORIG_STACK_SIZE) { |
if (!warned) { |
if (!warned) { |
WARN("Large stack limit(%ld): only scanning 8 MB", result); |
WARN("Large stack limit(%ld): only scanning 8 MB\n", result); |
warned = 1; |
warned = 1; |
} |
} |
result = MAX_ORIG_STACK_SIZE; |
result = MAX_ORIG_STACK_SIZE; |
Line 673 void GC_push_all_stacks() |
|
Line 678 void GC_push_all_stacks() |
|
|
|
# define PUSH(bottom,top) \ |
# define PUSH(bottom,top) \ |
if (GC_dirty_maintained) { \ |
if (GC_dirty_maintained) { \ |
GC_push_dirty((bottom), (top), GC_page_was_ever_dirty, \ |
GC_push_selected((bottom), (top), GC_page_was_ever_dirty, \ |
GC_push_all_stack); \ |
GC_push_all_stack); \ |
} else { \ |
} else { \ |
GC_push_all_stack((bottom), (top)); \ |
GC_push_all_stack((bottom), (top)); \ |
Line 703 int GC_is_thread_stack(ptr_t addr) |
|
Line 708 int GC_is_thread_stack(ptr_t addr) |
|
register int i; |
register int i; |
register GC_thread p; |
register GC_thread p; |
register ptr_t bottom, top; |
register ptr_t bottom, top; |
struct rlimit rl; |
|
|
|
for (i = 0; i < THREAD_TABLE_SZ; i++) { |
for (i = 0; i < THREAD_TABLE_SZ; i++) { |
for (p = GC_threads[i]; p != 0; p = p -> next) { |
for (p = GC_threads[i]; p != 0; p = p -> next) { |
Line 714 int GC_is_thread_stack(ptr_t addr) |
|
Line 718 int GC_is_thread_stack(ptr_t addr) |
|
} |
} |
} |
} |
} |
} |
|
return 0; |
} |
} |
|
|
/* The only thread that ever really performs a thr_join. */ |
/* The only thread that ever really performs a thr_join. */ |