Home | History | Annotate | Download | only in threads
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 
     22 /*
     23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     28 
     29 #include "lint.h"
     30 #include "thr_uberdata.h"
     31 
     32 /*
     33  * pthread_condattr_init: allocates the cond attribute object and
     34  * initializes it with the default values.
     35  */
     36 #pragma weak _pthread_condattr_init = pthread_condattr_init
     37 int
     38 pthread_condattr_init(pthread_condattr_t *attr)
     39 {
     40 	cvattr_t *ap;
     41 
     42 	if ((ap = lmalloc(sizeof (cvattr_t))) == NULL)
     43 		return (ENOMEM);
     44 	ap->pshared = DEFAULT_TYPE;
     45 	ap->clockid = CLOCK_REALTIME;
     46 	attr->__pthread_condattrp = ap;
     47 	return (0);
     48 }
     49 
     50 /*
     51  * pthread_condattr_destroy: frees the cond attribute object and
     52  * invalidates it with NULL value.
     53  */
     54 int
     55 pthread_condattr_destroy(pthread_condattr_t *attr)
     56 {
     57 	if (attr == NULL || attr->__pthread_condattrp == NULL)
     58 		return (EINVAL);
     59 	lfree(attr->__pthread_condattrp, sizeof (cvattr_t));
     60 	attr->__pthread_condattrp = NULL;
     61 	return (0);
     62 }
     63 
     64 /*
     65  * pthread_condattr_setclock: sets the clockid attribute.
     66  */
     67 int
     68 pthread_condattr_setclock(pthread_condattr_t *attr, clockid_t clock_id)
     69 {
     70 	cvattr_t *ap;
     71 
     72 	if (attr != NULL && (ap = attr->__pthread_condattrp) != NULL &&
     73 	    (clock_id == CLOCK_REALTIME || clock_id == CLOCK_HIGHRES)) {
     74 		ap->clockid = clock_id;
     75 		return (0);
     76 	}
     77 	return (EINVAL);
     78 }
     79 
     80 /*
     81  * pthread_condattr_getclock: gets the shared attr.
     82  */
     83 int
     84 pthread_condattr_getclock(const pthread_condattr_t *attr, clockid_t *clock_id)
     85 {
     86 	cvattr_t *ap;
     87 
     88 	if (attr != NULL && (ap = attr->__pthread_condattrp) != NULL &&
     89 	    clock_id != NULL) {
     90 		*clock_id = ap->clockid;
     91 		return (0);
     92 	}
     93 	return (EINVAL);
     94 }
     95 
     96 
     97 /*
     98  * pthread_condattr_setpshared: sets the shared attr to PRIVATE or SHARED.
     99  * This is equivalent to setting USYNC_PROCESS/USYNC_THREAD flag in cond_init().
    100  */
    101 int
    102 pthread_condattr_setpshared(pthread_condattr_t *attr, int pshared)
    103 {
    104 	cvattr_t *ap;
    105 
    106 	if (attr != NULL && (ap = attr->__pthread_condattrp) != NULL &&
    107 	    (pshared == PTHREAD_PROCESS_PRIVATE ||
    108 	    pshared == PTHREAD_PROCESS_SHARED)) {
    109 		ap->pshared = pshared;
    110 		return (0);
    111 	}
    112 	return (EINVAL);
    113 }
    114 
    115 /*
    116  * pthread_condattr_getpshared: gets the shared attr.
    117  */
    118 #pragma weak _pthread_condattr_getpshared = pthread_condattr_getpshared
    119 int
    120 pthread_condattr_getpshared(const pthread_condattr_t *attr, int *pshared)
    121 {
    122 	cvattr_t *ap;
    123 
    124 	if (attr != NULL && (ap = attr->__pthread_condattrp) != NULL &&
    125 	    pshared != NULL) {
    126 		*pshared = ap->pshared;
    127 		return (0);
    128 	}
    129 	return (EINVAL);
    130 }
    131 
    132 /*
    133  * pthread_cond_init: Initializes the cond object. It copies the
    134  * pshared attr into type argument and calls cond_init().
    135  */
    136 #pragma weak _pthread_cond_init = pthread_cond_init
    137 int
    138 pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr)
    139 {
    140 	cvattr_t *ap;
    141 	int type;
    142 	clockid_t clock_id;
    143 	int error;
    144 
    145 	if (attr == NULL) {
    146 		type = DEFAULT_TYPE;
    147 		clock_id = CLOCK_REALTIME;
    148 	} else if ((ap = attr->__pthread_condattrp) != NULL) {
    149 		type = ap->pshared;
    150 		clock_id = ap->clockid;
    151 	} else {
    152 		return (EINVAL);
    153 	}
    154 
    155 	if (clock_id != CLOCK_REALTIME && clock_id != CLOCK_HIGHRES)
    156 		error = EINVAL;
    157 	else if ((error = cond_init((cond_t *)cond, type, NULL)) == 0)
    158 		((cond_t *)cond)->cond_clockid = (uint8_t)clock_id;
    159 
    160 	return (error);
    161 }
    162