| 1 | #ifdef GC_SOLARIS_THREADS
|
|---|
| 2 |
|
|---|
| 3 | /* The set of all known threads. We intercept thread creation and */
|
|---|
| 4 | /* joins. We never actually create detached threads. We allocate all */
|
|---|
| 5 | /* new thread stacks ourselves. These allow us to maintain this */
|
|---|
| 6 | /* data structure. */
|
|---|
| 7 | /* Protected by GC_thr_lock. */
|
|---|
| 8 | /* Some of this should be declared volatile, but that's incosnsistent */
|
|---|
| 9 | /* with some library routine declarations. In particular, the */
|
|---|
| 10 | /* definition of cond_t doesn't mention volatile! */
|
|---|
| 11 | typedef struct GC_Thread_Rep {
|
|---|
| 12 | struct GC_Thread_Rep * next;
|
|---|
| 13 | thread_t id;
|
|---|
| 14 | word flags;
|
|---|
| 15 | # define FINISHED 1 /* Thread has exited. */
|
|---|
| 16 | # define DETACHED 2 /* Thread is intended to be detached. */
|
|---|
| 17 | # define CLIENT_OWNS_STACK 4
|
|---|
| 18 | /* Stack was supplied by client. */
|
|---|
| 19 | # define SUSPNDED 8 /* Currently suspended. */
|
|---|
| 20 | /* SUSPENDED is used insystem header. */
|
|---|
| 21 | ptr_t stack;
|
|---|
| 22 | size_t stack_size;
|
|---|
| 23 | cond_t join_cv;
|
|---|
| 24 | void * status;
|
|---|
| 25 | } * GC_thread;
|
|---|
| 26 | extern GC_thread GC_new_thread(thread_t id);
|
|---|
| 27 |
|
|---|
| 28 | extern GC_bool GC_thr_initialized;
|
|---|
| 29 | extern volatile GC_thread GC_threads[];
|
|---|
| 30 | extern size_t GC_min_stack_sz;
|
|---|
| 31 | extern size_t GC_page_sz;
|
|---|
| 32 | extern void GC_thr_init(void);
|
|---|
| 33 | extern ptr_t GC_stack_alloc(size_t * stack_size);
|
|---|
| 34 | extern void GC_stack_free(ptr_t stack, size_t size);
|
|---|
| 35 |
|
|---|
| 36 | # endif /* GC_SOLARIS_THREADS */
|
|---|
| 37 |
|
|---|