[BACK]Return to solaris_pthreads.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gc

Annotation of OpenXM_contrib/gc/solaris_pthreads.c, Revision 1.1.1.1

1.1       maekawa     1: /*
                      2:  * Copyright (c) 1994 by Xerox Corporation.  All rights reserved.
                      3:  *
                      4:  * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
                      5:  * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
                      6:  *
                      7:  * Permission is hereby granted to use or copy this program
                      8:  * for any purpose,  provided the above notices are retained on all copies.
                      9:  * Permission to modify the code and to distribute modified code is granted,
                     10:  * provided the above notices are retained, and a notice that the code was
                     11:  * modified is included with the above copyright notice.
                     12:  */
                     13: /*
                     14:  * Support code for Solaris threads.  Provides functionality we wish Sun
                     15:  * had provided.  Relies on some information we probably shouldn't rely on.
                     16:  * Modified Peter C. for Solaris Posix Threads.
                     17:  */
                     18: /* Boehm, September 14, 1994 4:44 pm PDT */
                     19: /* $Id: solaris_pthreads.c,v 1.10 1997/05/13 23:09:09 peterc Exp $ */
                     20:
                     21: # if defined(_SOLARIS_PTHREADS)
                     22: # include "gc_priv.h"
                     23: # include <pthread.h>
                     24: # include <thread.h>
                     25: # include <signal.h>
                     26: # include <fcntl.h>
                     27: # include <sys/types.h>
                     28: # include <sys/mman.h>
                     29: # include <sys/time.h>
                     30: # include <sys/resource.h>
                     31: # include <sys/stat.h>
                     32: # include <sys/syscall.h>
                     33: # include <sys/procfs.h>
                     34: # include <sys/lwp.h>
                     35: # include <sys/reg.h>
                     36: # define _CLASSIC_XOPEN_TYPES
                     37: # include <unistd.h>
                     38: # include <errno.h>
                     39: # include "solaris_threads.h"
                     40: # include <stdio.h>
                     41:
                     42: #undef pthread_join
                     43: #undef pthread_create
                     44:
                     45: pthread_cond_t GC_prom_join_cv;                /* Broadcast when any thread terminates */
                     46: pthread_cond_t GC_create_cv;           /* Signalled when a new undetached      */
                     47:                                /* thread starts.                       */
                     48:
                     49: extern GC_bool GC_multithreaded;
                     50:
                     51: /* We use the allocation lock to protect thread-related data structures. */
                     52:
                     53: /* We stop the world using /proc primitives.  This makes some  */
                     54: /* minimal assumptions about the threads implementation.       */
                     55: /* We don't play by the rules, since the rules make this       */
                     56: /* impossible (as of Solaris 2.3).  Also note that as of       */
                     57: /* Solaris 2.3 the various thread and lwp suspension           */
                     58: /* primitives failed to stop threads by the time the request   */
                     59: /* is completed.                                               */
                     60:
                     61:
                     62:
                     63: int GC_pthread_join(pthread_t wait_for, void **status)
                     64: {
                     65:        return GC_thr_join((thread_t)wait_for, NULL, status);
                     66: }
                     67:
                     68:
                     69: int
                     70: GC_pthread_create(pthread_t *new_thread,
                     71:           const pthread_attr_t *attr_in,
                     72:           void * (*thread_execp)(void *), void *arg)
                     73: {
                     74:     int result;
                     75:     GC_thread t;
                     76:     pthread_t my_new_thread;
                     77:     pthread_attr_t  attr;
                     78:     word my_flags = 0;
                     79:     int  flag;
                     80:     void * stack;
                     81:     size_t stack_size;
                     82:     int    n;
                     83:     struct sched_param schedparam;
                     84:
                     85:     (void)pthread_attr_getstacksize(attr_in, &stack_size);
                     86:     (void)pthread_attr_getstackaddr(attr_in, &stack);
                     87:     (void)pthread_attr_init(&attr);
                     88:
                     89:     LOCK();
                     90:     if (!GC_thr_initialized) {
                     91:            GC_thr_init();
                     92:     }
                     93:     GC_multithreaded++;
                     94:
                     95:     if (stack == 0) {
                     96:        if (stack_size == 0)
                     97:                stack_size = GC_min_stack_sz;
                     98:        else
                     99:                stack_size += thr_min_stack();
                    100:
                    101:        stack = (void *)GC_stack_alloc(&stack_size);
                    102:        if (stack == 0) {
                    103:            GC_multithreaded--;
                    104:            UNLOCK();
                    105:            errno = ENOMEM;
                    106:            return -1;
                    107:        }
                    108:     } else {
                    109:        my_flags |= CLIENT_OWNS_STACK;
                    110:     }
                    111:     (void)pthread_attr_setstacksize(&attr, stack_size);
                    112:     (void)pthread_attr_setstackaddr(&attr, stack);
                    113:     (void)pthread_attr_getscope(attr_in, &n);
                    114:     (void)pthread_attr_setscope(&attr, n);
                    115:     (void)pthread_attr_getschedparam(attr_in, &schedparam);
                    116:     (void)pthread_attr_setschedparam(&attr, &schedparam);
                    117:     (void)pthread_attr_getschedpolicy(attr_in, &n);
                    118:     (void)pthread_attr_setschedpolicy(&attr, n);
                    119:     (void)pthread_attr_getinheritsched(attr_in, &n);
                    120:     (void)pthread_attr_setinheritsched(&attr, n);
                    121:
                    122:     (void)pthread_attr_getdetachstate(attr_in, &flag);
                    123:     if (flag == PTHREAD_CREATE_DETACHED) {
                    124:            my_flags |= DETACHED;
                    125:     }
                    126:     (void)pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
                    127:     /*
                    128:      * thr_create can call malloc(), which if redirected will
                    129:      * attempt to acquire the allocation lock.
                    130:      * Unlock here to prevent deadlock.
                    131:      */
                    132:
                    133:
                    134: #if 0
                    135: #ifdef I386
                    136:     UNLOCK();
                    137: #endif
                    138: #endif
                    139:     result =
                    140:            pthread_create(&my_new_thread, &attr, thread_execp, arg);
                    141: #if 0
                    142: #ifdef I386
                    143:     LOCK();
                    144: #endif
                    145: #endif
                    146:     if (result == 0) {
                    147:         t = GC_new_thread(my_new_thread);
                    148:         t -> flags = my_flags;
                    149:         if (!(my_flags & DETACHED)) cond_init(&(t->join_cv), USYNC_THREAD, 0);
                    150:         t -> stack = stack;
                    151:         t -> stack_size = stack_size;
                    152:         if (new_thread != 0) *new_thread = my_new_thread;
                    153:         pthread_cond_signal(&GC_create_cv);
                    154:     } else {
                    155:            if (!(my_flags & CLIENT_OWNS_STACK)) {
                    156:                    GC_stack_free(stack, stack_size);
                    157:            }
                    158:            GC_multithreaded--;
                    159:     }
                    160:     UNLOCK();
                    161:     pthread_attr_destroy(&attr);
                    162:     return(result);
                    163: }
                    164:
                    165: # else
                    166:
                    167: #ifndef LINT
                    168:   int GC_no_sunOS_pthreads;
                    169: #endif
                    170:
                    171: # endif /* SOLARIS_THREADS */
                    172:

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>