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

Annotation of src/lib/libpthread/pthread_int.h, Revision 1.39

1.39    ! ad          1: /*     $NetBSD: pthread_int.h,v 1.38 2007/03/02 18:53:52 ad Exp $      */
1.2       thorpej     2:
                      3: /*-
1.38      ad          4:  * Copyright (c) 2001, 2002, 2003, 2006, 2007 The NetBSD Foundation, Inc.
1.2       thorpej     5:  * All rights reserved.
                      6:  *
                      7:  * This code is derived from software contributed to The NetBSD Foundation
1.38      ad          8:  * by Nathan J. Williams and Andrew Doran.
1.2       thorpej     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_INT_H
                     40: #define _LIB_PTHREAD_INT_H
                     41:
                     42: #define PTHREAD__DEBUG
                     43: #define ERRORCHECK
                     44:
                     45: #include "pthread_types.h"
                     46: #include "pthread_queue.h"
                     47: #include "pthread_debug.h"
                     48: #include "pthread_md.h"
                     49:
1.35      ad         50: #include <lwp.h>
1.2       thorpej    51: #include <signal.h>
                     52:
1.15      nathanw    53: #define PTHREAD_KEYS_MAX 256
1.2       thorpej    54: /*
                     55:  * The size of this structure needs to be no larger than struct
                     56:  * __pthread_cleanup_store, defined in pthread.h.
                     57:  */
                     58: struct pt_clean_t {
                     59:        PTQ_ENTRY(pt_clean_t)   ptc_next;
                     60:        void    (*ptc_cleanup)(void *);
                     61:        void    *ptc_arg;
                     62: };
                     63:
1.16      nathanw    64: /* Private data for pthread_attr_t */
                     65: struct pthread_attr_private {
                     66:        char ptap_name[PTHREAD_MAX_NAMELEN_NP];
                     67:        void *ptap_namearg;
                     68:        void *ptap_stackaddr;
                     69:        size_t ptap_stacksize;
                     70:        size_t ptap_guardsize;
1.2       thorpej    71: };
                     72:
1.15      nathanw    73: struct __pthread_st {
1.2       thorpej    74:        unsigned int    pt_magic;
1.4       nathanw    75:        /* Identifier, for debugging and for preventing recycling. */
                     76:        int             pt_num;
1.2       thorpej    77:
1.35      ad         78:        lwpid_t pt_lid;         /* LWP ID */
1.2       thorpej    79:        int     pt_state;       /* running, blocked, etc. */
                     80:        pthread_spin_t pt_statelock;    /* lock on pt_state */
                     81:        int     pt_flags;       /* see PT_FLAG_* below */
1.17      nathanw    82:        pthread_spin_t pt_flaglock;     /* lock on pt_flag */
1.2       thorpej    83:        int     pt_cancel;      /* Deferred cancellation */
                     84:        int     pt_spinlocks;   /* Number of spinlocks held. */
1.36      ad         85:        int     pt_sleeponq;    /* on a sleep queue */
1.2       thorpej    86:        int     pt_errno;       /* Thread-specific errno. */
                     87:
                     88:        /* Entry on the list of all threads */
1.15      nathanw    89:        PTQ_ENTRY(__pthread_st) pt_allq;
1.2       thorpej    90:        /* Entry on the sleep queue (xxx should be same as run queue?) */
1.15      nathanw    91:        PTQ_ENTRY(__pthread_st) pt_sleep;
1.35      ad         92:        /*
                     93:         * Object we're sleeping on.  For 1:1 threads (!SA), this is
                     94:         * protected by the interlock on the object that the thread is
                     95:         * sleeping on.
                     96:         */
1.6       jdolecek   97:        void                    *pt_sleepobj;
1.2       thorpej    98:        /* Queue we're sleeping on */
1.6       jdolecek   99:        struct pthread_queue_t  *pt_sleepq;
1.2       thorpej   100:
                    101:        stack_t         pt_stack;       /* Our stack */
                    102:        ucontext_t      *pt_uc;         /* Saved context when we're stopped */
1.38      ad        103:        void            *pt_exitval;    /* Read by pthread_join() */
                    104:        char            *pt_name;       /* Thread's name, set by the app. */
1.2       thorpej   105:
                    106:        /* Stack of cancellation cleanup handlers and their arguments */
                    107:        PTQ_HEAD(, pt_clean_t)  pt_cleanup_stack;
                    108:
                    109:        /* Other threads trying to pthread_join() us. */
                    110:        struct pthread_queue_t  pt_joiners;
                    111:        /* Lock for above, and for changing pt_state to ZOMBIE or DEAD,
1.9       thorpej   112:         * and for setting the DETACHED flag.  Also protects pt_name.
1.2       thorpej   113:         */
                    114:        pthread_spin_t  pt_join_lock;
                    115:
                    116:        /* Thread-specific data */
                    117:        void*           pt_specific[PTHREAD_KEYS_MAX];
                    118: };
                    119:
                    120: struct pthread_lock_ops {
                    121:        void    (*plo_init)(__cpu_simple_lock_t *);
                    122:        int     (*plo_try)(__cpu_simple_lock_t *);
                    123:        void    (*plo_unlock)(__cpu_simple_lock_t *);
                    124: };
                    125:
                    126: /* Thread states */
                    127: #define PT_STATE_RUNNING       1
                    128: #define PT_STATE_ZOMBIE                5
                    129: #define PT_STATE_DEAD          6
1.35      ad        130:
1.2       thorpej   131: /* Flag values */
                    132:
                    133: #define PT_FLAG_DETACHED       0x0001
                    134: #define PT_FLAG_CS_DISABLED    0x0004  /* Cancellation disabled */
                    135: #define PT_FLAG_CS_ASYNC       0x0008  /* Cancellation is async */
                    136: #define PT_FLAG_CS_PENDING     0x0010
1.15      nathanw   137: #define PT_FLAG_SCOPE_SYSTEM   0x0040
                    138: #define PT_FLAG_EXPLICIT_SCHED 0x0080
1.29      nathanw   139: #define PT_FLAG_SUSPENDED      0x0100  /* In the suspended queue */
1.2       thorpej   140:
                    141: #define PT_MAGIC       0x11110001
                    142: #define PT_DEAD                0xDEAD0001
                    143:
                    144: #define PT_ATTR_MAGIC  0x22220002
                    145: #define PT_ATTR_DEAD   0xDEAD0002
                    146:
1.22      cl        147: #ifdef PT_FIXEDSTACKSIZE_LG
                    148:
                    149: #define        PT_STACKSIZE_LG PT_FIXEDSTACKSIZE_LG
                    150: #define        PT_STACKSIZE    (1<<(PT_STACKSIZE_LG))
                    151: #define        PT_STACKMASK    (PT_STACKSIZE-1)
                    152:
                    153: #else  /* PT_FIXEDSTACKSIZE_LG */
                    154:
1.25      nathanw   155: extern int             pthread_stacksize_lg;
                    156: extern size_t          pthread_stacksize;
                    157: extern vaddr_t         pthread_stackmask;
                    158:
                    159: #define        PT_STACKSIZE_LG pthread_stacksize_lg
                    160: #define        PT_STACKSIZE    pthread_stacksize
                    161: #define        PT_STACKMASK    pthread_stackmask
1.22      cl        162:
                    163: #endif /* PT_FIXEDSTACKSIZE_LG */
                    164:
1.2       thorpej   165: /* Flag to be used in a ucontext_t's uc_flags indicating that
                    166:  * the saved register state is "user" state only, not full
                    167:  * trap state.
                    168:  */
                    169: #define _UC_USER_BIT           30
                    170: #define _UC_USER               (1LU << _UC_USER_BIT)
                    171:
                    172: void   pthread_init(void)  __attribute__ ((__constructor__));
                    173:
                    174: /* Utility functions */
                    175:
                    176: /* Set up/clean up a thread's basic state. */
                    177: void   pthread__initthread(pthread_t self, pthread_t t);
1.24      cl        178: /* Get offset from stack start to struct sa_stackinfo */
                    179: ssize_t        pthread__stackinfo_offset(void);
1.2       thorpej   180:
1.35      ad        181: void   pthread__unpark_all(pthread_t self, pthread_spin_t *lock,
1.39    ! ad        182:                            struct pthread_queue_t *threadq);
1.35      ad        183: void   pthread__unpark(pthread_t self, pthread_spin_t *lock,
1.39    ! ad        184:                        struct pthread_queue_t *queue, pthread_t target);
1.35      ad        185: int    pthread__park(pthread_t self, pthread_spin_t *lock,
1.39    ! ad        186:                      struct pthread_queue_t *threadq,
        !           187:                      const struct timespec *abs_timeout,
1.36      ad        188:                      int cancelpt);
1.35      ad        189:
1.2       thorpej   190: int    pthread__stackalloc(pthread_t *t);
                    191: void   pthread__initmain(pthread_t *t);
                    192:
                    193: /* Internal locking primitives */
1.26      cl        194: void   pthread__lockprim_init(int ncpu);
1.2       thorpej   195: void   pthread_lockinit(pthread_spin_t *lock);
                    196: void   pthread_spinlock(pthread_t thread, pthread_spin_t *lock);
                    197: int    pthread_spintrylock(pthread_t thread, pthread_spin_t *lock);
                    198: void   pthread_spinunlock(pthread_t thread, pthread_spin_t *lock);
                    199:
                    200: extern const struct pthread_lock_ops *pthread__lock_ops;
                    201:
                    202: #define        pthread__simple_lock_init(alp)  (*pthread__lock_ops->plo_init)(alp)
                    203: #define        pthread__simple_lock_try(alp)   (*pthread__lock_ops->plo_try)(alp)
                    204: #define        pthread__simple_unlock(alp)     (*pthread__lock_ops->plo_unlock)(alp)
                    205:
                    206: #ifndef _getcontext_u
                    207: int    _getcontext_u(ucontext_t *);
                    208: #endif
                    209: #ifndef _setcontext_u
                    210: int    _setcontext_u(const ucontext_t *);
                    211: #endif
                    212: #ifndef _swapcontext_u
                    213: int    _swapcontext_u(ucontext_t *, const ucontext_t *);
                    214: #endif
                    215:
                    216: void   pthread__testcancel(pthread_t self);
                    217: int    pthread__find(pthread_t self, pthread_t target);
                    218:
                    219: #ifndef PTHREAD_MD_INIT
                    220: #define PTHREAD_MD_INIT
                    221: #endif
                    222:
                    223: #ifndef _INITCONTEXT_U_MD
                    224: #define _INITCONTEXT_U_MD(ucp)
                    225: #endif
                    226:
                    227: #define _INITCONTEXT_U(ucp) do {                                       \
                    228:        (ucp)->uc_flags = _UC_CPU | _UC_STACK;                          \
                    229:        _INITCONTEXT_U_MD(ucp)                                          \
1.3       christos  230:        } while (/*CONSTCOND*/0)
1.2       thorpej   231:
1.13      nathanw   232: #ifdef PTHREAD_MACHINE_HAS_ID_REGISTER
                    233: #define pthread__id(reg) (reg)
                    234: #else
1.2       thorpej   235: /* Stack location of pointer to a particular thread */
                    236: #define pthread__id(sp) \
                    237:        ((pthread_t) (((vaddr_t)(sp)) & ~PT_STACKMASK))
                    238:
1.13      nathanw   239: #define pthread__id_reg() pthread__sp()
                    240: #endif
                    241:
                    242: #define pthread__self() (pthread__id(pthread__id_reg()))
1.2       thorpej   243:
1.12      christos  244: #define pthread__abort()                                               \
                    245:        pthread__assertfunc(__FILE__, __LINE__, __func__, "unreachable")
                    246:
1.11      nathanw   247: #define pthread__assert(e) do {                                                \
                    248:        if (__predict_false(!(e)))                                      \
                    249:                       pthread__assertfunc(__FILE__, __LINE__, __func__, #e);   \
1.12      christos  250:         } while (/*CONSTCOND*/0)
1.11      nathanw   251:
                    252: #define pthread__error(err, msg, e) do {                               \
                    253:        if (__predict_false(!(e))) {                                    \
                    254:                       pthread__errorfunc(__FILE__, __LINE__, __func__, msg);   \
                    255:               return (err);                                            \
                    256:        }                                                               \
1.12      christos  257:         } while (/*CONSTCOND*/0)
1.11      nathanw   258:
1.2       thorpej   259: void   pthread__destroy_tsd(pthread_t self);
1.27      drochner  260: void   pthread__assertfunc(const char *file, int line, const char *function,
                    261:                const char *expr);
                    262: void   pthread__errorfunc(const char *file, int line, const char *function,
                    263:                const char *msg);
1.2       thorpej   264:
                    265: #endif /* _LIB_PTHREAD_INT_H */

CVSweb <webmaster@jp.NetBSD.org>