[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.2

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;
1.1.1.2 ! maekawa    80:     void * stack = 0;
        !            81:     size_t stack_size = 0;
1.1       maekawa    82:     int    n;
                     83:     struct sched_param schedparam;
                     84:
                     85:     (void)pthread_attr_init(&attr);
1.1.1.2 ! maekawa    86:     if (attr_in != 0) {
        !            87:        (void)pthread_attr_getstacksize(attr_in, &stack_size);
        !            88:        (void)pthread_attr_getstackaddr(attr_in, &stack);
        !            89:     }
1.1       maekawa    90:
                     91:     LOCK();
                     92:     if (!GC_thr_initialized) {
                     93:            GC_thr_init();
                     94:     }
                     95:     GC_multithreaded++;
                     96:
                     97:     if (stack == 0) {
                     98:        if (stack_size == 0)
1.1.1.2 ! maekawa    99:                stack_size = 1048576;
        !           100:                          /* ^-- 1 MB (this was GC_min_stack_sz, but that
        !           101:                           * violates the pthread_create documentation which
        !           102:                           * says the default value if none is supplied is
        !           103:                           * 1MB) */
1.1       maekawa   104:        else
                    105:                stack_size += thr_min_stack();
                    106:
                    107:        stack = (void *)GC_stack_alloc(&stack_size);
                    108:        if (stack == 0) {
                    109:            GC_multithreaded--;
                    110:            UNLOCK();
                    111:            errno = ENOMEM;
                    112:            return -1;
                    113:        }
                    114:     } else {
                    115:        my_flags |= CLIENT_OWNS_STACK;
                    116:     }
                    117:     (void)pthread_attr_setstacksize(&attr, stack_size);
                    118:     (void)pthread_attr_setstackaddr(&attr, stack);
1.1.1.2 ! maekawa   119:     if (attr_in != 0) {
        !           120:        (void)pthread_attr_getscope(attr_in, &n);
        !           121:        (void)pthread_attr_setscope(&attr, n);
        !           122:        (void)pthread_attr_getschedparam(attr_in, &schedparam);
        !           123:        (void)pthread_attr_setschedparam(&attr, &schedparam);
        !           124:        (void)pthread_attr_getschedpolicy(attr_in, &n);
        !           125:        (void)pthread_attr_setschedpolicy(&attr, n);
        !           126:        (void)pthread_attr_getinheritsched(attr_in, &n);
        !           127:        (void)pthread_attr_setinheritsched(&attr, n);
1.1       maekawa   128:
1.1.1.2 ! maekawa   129:        (void)pthread_attr_getdetachstate(attr_in, &flag);
        !           130:        if (flag == PTHREAD_CREATE_DETACHED) {
        !           131:                my_flags |= DETACHED;
        !           132:        }
        !           133:        (void)pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
1.1       maekawa   134:     }
                    135:     /*
                    136:      * thr_create can call malloc(), which if redirected will
                    137:      * attempt to acquire the allocation lock.
                    138:      * Unlock here to prevent deadlock.
                    139:      */
                    140:
                    141:
                    142: #if 0
                    143: #ifdef I386
                    144:     UNLOCK();
                    145: #endif
                    146: #endif
                    147:     result =
                    148:            pthread_create(&my_new_thread, &attr, thread_execp, arg);
                    149: #if 0
                    150: #ifdef I386
                    151:     LOCK();
                    152: #endif
                    153: #endif
                    154:     if (result == 0) {
                    155:         t = GC_new_thread(my_new_thread);
                    156:         t -> flags = my_flags;
                    157:         if (!(my_flags & DETACHED)) cond_init(&(t->join_cv), USYNC_THREAD, 0);
                    158:         t -> stack = stack;
                    159:         t -> stack_size = stack_size;
                    160:         if (new_thread != 0) *new_thread = my_new_thread;
                    161:         pthread_cond_signal(&GC_create_cv);
                    162:     } else {
                    163:            if (!(my_flags & CLIENT_OWNS_STACK)) {
                    164:                    GC_stack_free(stack, stack_size);
                    165:            }
                    166:            GC_multithreaded--;
                    167:     }
                    168:     UNLOCK();
                    169:     pthread_attr_destroy(&attr);
                    170:     return(result);
                    171: }
                    172:
                    173: # else
                    174:
                    175: #ifndef LINT
                    176:   int GC_no_sunOS_pthreads;
                    177: #endif
                    178:
                    179: # endif /* SOLARIS_THREADS */
                    180:

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