[BACK]Return to pthread_types.h CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libpthread

Annotation of src/lib/libpthread/pthread_types.h, Revision 1.9

1.9     ! ad          1: /*     $NetBSD: pthread_types.h,v 1.8 2007/09/07 14:09:28 ad Exp $     */
1.2       thorpej     2:
                      3: /*-
1.9     ! ad          4:  * Copyright (c) 2001, 2008 The NetBSD Foundation, Inc.
1.2       thorpej     5:  * All rights reserved.
                      6:  *
                      7:  * This code is derived from software contributed to The NetBSD Foundation
                      8:  * by Nathan J. Williams.
                      9:  *
                     10:  * Redistribution and use in source and binary forms, with or without
                     11:  * modification, are permitted provided that the following conditions
                     12:  * are met:
                     13:  * 1. Redistributions of source code must retain the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer.
                     15:  * 2. Redistributions in binary form must reproduce the above copyright
                     16:  *    notice, this list of conditions and the following disclaimer in the
                     17:  *    documentation and/or other materials provided with the distribution.
                     18:  * 3. All advertising materials mentioning features or use of this software
                     19:  *    must display the following acknowledgement:
                     20:  *        This product includes software developed by the NetBSD
                     21:  *        Foundation, Inc. and its contributors.
                     22:  * 4. Neither the name of The NetBSD Foundation nor the names of its
                     23:  *    contributors may be used to endorse or promote products derived
                     24:  *    from this software without specific prior written permission.
                     25:  *
                     26:  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
                     27:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
                     28:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
                     29:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
                     30:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
                     31:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
                     32:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     33:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
                     34:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     35:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     36:  * POSSIBILITY OF SUCH DAMAGE.
                     37:  */
                     38:
                     39: #ifndef _LIB_PTHREAD_TYPES_H
                     40: #define _LIB_PTHREAD_TYPES_H
                     41:
1.5       nathanw    42: /*
                     43:  * We use the "pthread_spin_t" name internally; "pthread_spinlock_t" is the
1.2       thorpej    44:  * POSIX spinlock object.
                     45:  */
                     46: typedef __cpu_simple_lock_t    pthread_spin_t;
                     47:
                     48: /*
                     49:  * Copied from PTQ_HEAD in pthread_queue.h
                     50:  */
                     51: #define _PTQ_HEAD(name, type)                                  \
                     52: struct name {                                                          \
                     53:        struct type *ptqh_first;/* first element */                     \
                     54:        struct type **ptqh_last;/* addr of last next element */         \
                     55: }
                     56:
1.7       ad         57: _PTQ_HEAD(pthread_queue_struct_t, __pthread_st);
                     58: typedef struct pthread_queue_struct_t pthread_queue_t;
1.2       thorpej    59:
1.4       nathanw    60: struct __pthread_st;
                     61: struct __pthread_attr_st;
                     62: struct __pthread_mutex_st;
                     63: struct __pthread_mutexattr_st;
                     64: struct __pthread_cond_st;
                     65: struct __pthread_condattr_st;
                     66: struct __pthread_spin_st;
                     67: struct __pthread_rwlock_st;
                     68: struct __pthread_rwlockattr_st;
                     69: struct __pthread_barrier_st;
                     70: struct __pthread_barrierattr_st;
                     71:
                     72: typedef struct __pthread_st *pthread_t;
                     73: typedef struct __pthread_attr_st pthread_attr_t;
                     74: typedef struct __pthread_mutex_st pthread_mutex_t;
                     75: typedef struct __pthread_mutexattr_st pthread_mutexattr_t;
                     76: typedef struct __pthread_cond_st pthread_cond_t;
                     77: typedef struct __pthread_condattr_st pthread_condattr_t;
                     78: typedef struct __pthread_once_st pthread_once_t;
                     79: typedef struct __pthread_spinlock_st pthread_spinlock_t;
                     80: typedef struct __pthread_rwlock_st pthread_rwlock_t;
                     81: typedef struct __pthread_rwlockattr_st pthread_rwlockattr_t;
                     82: typedef struct __pthread_barrier_st pthread_barrier_t;
                     83: typedef struct __pthread_barrierattr_st pthread_barrierattr_t;
1.2       thorpej    84: typedef int pthread_key_t;
                     85:
1.4       nathanw    86: struct __pthread_attr_st {
1.2       thorpej    87:        unsigned int    pta_magic;
                     88:
                     89:        int     pta_flags;
                     90:        void    *pta_private;
                     91: };
                     92:
1.6       ad         93: /*
                     94:  * ptm_lock will never be spun on: it's locked with
                     95:  * pthread__simple_lock_try() or not at all.
                     96:  */
1.4       nathanw    97: struct __pthread_mutex_st {
1.2       thorpej    98:        unsigned int    ptm_magic;
1.9     ! ad         99:        unsigned int    ptm_errorcheck;
        !           100:        unsigned int    ptm_recursed;
        !           101:        pthread_t * volatile ptm_waiters;
1.8       ad        102:        volatile pthread_t ptm_owner;
1.2       thorpej   103: };
                    104:
                    105: #define        _PT_MUTEX_MAGIC 0x33330003
                    106: #define        _PT_MUTEX_DEAD  0xDEAD0003
                    107:
1.9     ! ad        108: #define _PTHREAD_MUTEX_INITIALIZER { _PT_MUTEX_MAGIC, 0, 0, NULL, NULL }
1.2       thorpej   109:
1.4       nathanw   110: struct __pthread_mutexattr_st {
1.2       thorpej   111:        unsigned int    ptma_magic;
                    112:        void    *ptma_private;
                    113: };
                    114:
                    115: #define _PT_MUTEXATTR_MAGIC    0x44440004
                    116: #define _PT_MUTEXATTR_DEAD     0xDEAD0004
                    117:
                    118:
1.4       nathanw   119: struct __pthread_cond_st {
1.2       thorpej   120:        unsigned int    ptc_magic;
                    121:
                    122:        /* Protects the queue of waiters */
                    123:        pthread_spin_t  ptc_lock;
1.7       ad        124:        pthread_queue_t ptc_waiters;
1.2       thorpej   125:
                    126:        pthread_mutex_t *ptc_mutex;     /* Current mutex */
                    127:        void    *ptc_private;
                    128: };
                    129:
                    130: #define        _PT_COND_MAGIC  0x55550005
                    131: #define        _PT_COND_DEAD   0xDEAD0005
                    132:
1.4       nathanw   133: #define _PTHREAD_COND_INITIALIZER { _PT_COND_MAGIC,                    \
1.2       thorpej   134:                                   __SIMPLELOCK_UNLOCKED,               \
                    135:                                   {NULL, NULL},                        \
                    136:                                   NULL,                                \
                    137:                                   NULL                                 \
                    138:                                 }
                    139:
1.4       nathanw   140: struct __pthread_condattr_st {
1.2       thorpej   141:        unsigned int    ptca_magic;
                    142:        void    *ptca_private;
                    143: };
                    144:
                    145: #define        _PT_CONDATTR_MAGIC      0x66660006
                    146: #define        _PT_CONDATTR_DEAD       0xDEAD0006
                    147:
1.4       nathanw   148: struct __pthread_once_st {
1.2       thorpej   149:        pthread_mutex_t pto_mutex;
                    150:        int     pto_done;
                    151: };
                    152:
1.4       nathanw   153: #define _PTHREAD_ONCE_INIT     { PTHREAD_MUTEX_INITIALIZER, 0 }
1.2       thorpej   154:
1.4       nathanw   155: struct __pthread_spinlock_st {
1.2       thorpej   156:        unsigned int    pts_magic;
                    157:        pthread_spin_t  pts_spin;
                    158:        int             pts_flags;
                    159: };
                    160:
                    161: #define        _PT_SPINLOCK_MAGIC      0x77770007
                    162: #define        _PT_SPINLOCK_DEAD       0xDEAD0007
                    163: #define _PT_SPINLOCK_PSHARED   0x00000001
                    164:
                    165: /* PTHREAD_SPINLOCK_INITIALIZER is an extension not specified by POSIX. */
1.4       nathanw   166: #define _PTHREAD_SPINLOCK_INITIALIZER { _PT_SPINLOCK_MAGIC,            \
1.2       thorpej   167:                                       __SIMPLELOCK_UNLOCKED,           \
                    168:                                       0                                \
                    169:                                     }
                    170:
1.4       nathanw   171: struct __pthread_rwlock_st {
1.2       thorpej   172:        unsigned int    ptr_magic;
                    173:
                    174:        /* Protects data below */
                    175:        pthread_spin_t  ptr_interlock;
                    176:
1.7       ad        177:        pthread_queue_t ptr_rblocked;
                    178:        pthread_queue_t ptr_wblocked;
1.2       thorpej   179:        unsigned int    ptr_nreaders;
1.9     ! ad        180:        volatile pthread_t ptr_owner;
1.2       thorpej   181:        void    *ptr_private;
                    182: };
                    183:
                    184: #define        _PT_RWLOCK_MAGIC        0x99990009
                    185: #define        _PT_RWLOCK_DEAD         0xDEAD0009
                    186:
1.4       nathanw   187: #define _PTHREAD_RWLOCK_INITIALIZER { _PT_RWLOCK_MAGIC,                        \
1.2       thorpej   188:                                     __SIMPLELOCK_UNLOCKED,             \
                    189:                                     {NULL, NULL},                      \
                    190:                                     {NULL, NULL},                      \
                    191:                                     0,                                 \
                    192:                                     NULL,                              \
                    193:                                     NULL,                              \
                    194:                                   }
                    195:
1.4       nathanw   196: struct __pthread_rwlockattr_st {
1.2       thorpej   197:        unsigned int    ptra_magic;
                    198:        void *ptra_private;
                    199: };
                    200:
                    201: #define _PT_RWLOCKATTR_MAGIC   0x99990909
                    202: #define _PT_RWLOCKATTR_DEAD    0xDEAD0909
                    203:
1.4       nathanw   204: struct __pthread_barrier_st {
1.2       thorpej   205:        unsigned int    ptb_magic;
                    206:
                    207:        /* Protects data below */
                    208:        pthread_spin_t  ptb_lock;
                    209:
1.7       ad        210:        pthread_queue_t ptb_waiters;
1.2       thorpej   211:        unsigned int    ptb_initcount;
                    212:        unsigned int    ptb_curcount;
1.3       nathanw   213:        unsigned int    ptb_generation;
1.2       thorpej   214:
                    215:        void            *ptb_private;
                    216: };
                    217:
                    218: #define        _PT_BARRIER_MAGIC       0x88880008
                    219: #define        _PT_BARRIER_DEAD        0xDEAD0008
                    220:
1.4       nathanw   221: struct __pthread_barrierattr_st {
1.2       thorpej   222:        unsigned int    ptba_magic;
                    223:        void            *ptba_private;
                    224: };
                    225:
                    226: #define        _PT_BARRIERATTR_MAGIC   0x88880808
                    227: #define        _PT_BARRIERATTR_DEAD    0xDEAD0808
                    228:
                    229: #endif /* _LIB_PTHREAD_TYPES_H */

CVSweb <webmaster@jp.NetBSD.org>