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

1.1.2.5 ! nathanw     1: /*     $NetBSD: pthread_int.h,v 1.1.2.4 2001/07/13 02:42:38 nathanw Exp $      */
1.1.2.4   nathanw     2:
                      3: /*-
                      4:  * Copyright (c) 2001 The NetBSD Foundation, Inc.
                      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:  */
1.1.2.1   nathanw    38:
                     39: #ifndef _LIB_PTHREAD_INT_H
                     40: #define _LIB_PTHREAD_INT_H
                     41:
                     42: #include <sa.h>
                     43: #include <signal.h>
                     44:
                     45: #define PTHREAD__DEBUG
                     46:
1.1.2.2   nathanw    47: #include "pthread_types.h"
1.1.2.1   nathanw    48:
                     49:
                     50: struct pthread_st {
                     51:        unsigned int    pt_magic;
                     52:
                     53:        int     pt_type;        /* normal, upcall, or idle */
                     54:        int     pt_state;       /* running, blocked, etc. */
                     55:        int     pt_flags;
                     56:        int     pt_spinlocks;   /* Number of spinlocks held. */
                     57:
                     58:        /* Entry on the run queue */
1.1.2.2   nathanw    59:        PTQ_ENTRY(pthread_st)   pt_runq;
1.1.2.1   nathanw    60:        /* Entry on the list of all threads */
1.1.2.2   nathanw    61:        PTQ_ENTRY(pthread_st)   pt_allq;
1.1.2.1   nathanw    62:        /* Entry on the sleep queue (xxx should be same as run queue?) */
1.1.2.2   nathanw    63:        PTQ_ENTRY(pthread_st)   pt_sleep;
1.1.2.1   nathanw    64:
                     65:        stack_t         pt_stack;       /* Our stack */
                     66:        ucontext_t      *pt_uc;         /* Saved context when we're stopped */
                     67:
                     68:        sigset_t        pt_sigmask;     /* Signals we won't take. */
                     69:        sigset_t        pt_siglist;     /* Signals pending for us. */
                     70:        pt_spin_t       pt_siglock;     /* Lock on above */
                     71:
                     72:        void *          pt_exitval;     /* Read by pthread_join() */
                     73:
                     74:        /* Other threads trying to pthread_join() us. */
                     75:        struct pt_queue_t       pt_joiners;
                     76:        /* Lock for above, and for changing pt_state to ZOMBIE or DEAD,
                     77:         * and for setting the DETACHED flag
                     78:         */
                     79:        pt_spin_t               pt_join_lock;
                     80:
                     81:        /* Thread we were going to switch to before we were preempted
                     82:         * ourselves. Will be used by the upcall that's continuing us.
                     83:         */
                     84:        pthread_t       pt_switchto;
                     85:        ucontext_t*     pt_switchtouc;
                     86:
                     87:        /* Threads that are preempted with spinlocks held will be
                     88:         * continued until they unlock their spinlock. When they do
                     89:         * so, they should jump ship to the thread pointed to by
                     90:         * pt_next.
                     91:         */
                     92:        pthread_t       pt_next;
                     93:
                     94:        /* The upcall that is continuing this thread */
                     95:        pthread_t       pt_parent;
                     96:
                     97:        /* A queue lock that this thread held while trying to
                     98:         * context switch to another process.
                     99:         */
                    100:        pt_spin_t*      pt_heldlock;
                    101:
                    102: #ifdef PTHREAD__DEBUG
                    103:        int     blocks;
                    104:        int     preempts;
                    105:        int     rescheds;
                    106: #endif
                    107: };
                    108:
                    109:
                    110:
                    111: /* Thread types */
                    112: #define PT_THREAD_NORMAL       1
                    113: #define PT_THREAD_UPCALL       2
                    114: #define PT_THREAD_IDLE         3
                    115:
                    116: /* Thread states */
                    117: #define PT_STATE_RUNNABLE      1
                    118: #define PT_STATE_BLOCKED       2
                    119: #define PT_STATE_ZOMBIE                3
                    120: #define PT_STATE_DEAD          4
                    121: #define PT_STATE_RECYCLABLE    5
                    122:
                    123: /* Flag values */
                    124:
                    125: #define PT_FLAG_DETACHED       0x0001
                    126: #define PT_FLAG_IDLED          0x0002
                    127:
                    128: #define PT_MAGIC       0xBABCAAAA
1.1.2.2   nathanw   129: #define PT_DEAD                0xDEADBEEF
                    130:
1.1.2.1   nathanw   131: #define PT_ATTR_MAGIC  0x5555FACE
                    132: #define PT_ATTR_DEAD   0xFACEDEAD
                    133:
1.1.2.3   nathanw   134: #define PT_STACKSIZE   (1<<16)
1.1.2.1   nathanw   135: #define PT_STACKMASK   (PT_STACKSIZE-1)
                    136:
                    137: #define PT_UPCALLSTACKS        16
                    138:
1.1.2.5 ! nathanw   139: #define NIDLETHREADS   4
1.1.2.1   nathanw   140: #define IDLESPINS      1000
                    141:
                    142: /* Utility functions */
                    143:
                    144: void*  pthread__malloc(size_t size);
                    145: void   pthread__free(void *ptr);
                    146:
                    147: /* Set up/clean up a thread's basic state. */
                    148: void pthread__initthread(pthread_t t);
                    149:
                    150: /* Go do something else. Don't go back on the run queue */
                    151: void   pthread__block(pthread_t self, pt_spin_t* queuelock);
                    152: /* Put a thread back on the run queue */
                    153: void   pthread__sched(pthread_t self, pthread_t thread);
                    154: void   pthread__sched_idle(pthread_t self, pthread_t thread);
                    155: void   pthread__sched_idle2(pthread_t self);
                    156:
                    157: void   pthread__sched_bulk(pthread_t self, pthread_t qhead);
                    158:
                    159: void   pthread__idle(void);
                    160:
                    161: /* Get the next thread */
                    162: pthread_t pthread__next(pthread_t self);
                    163:
                    164: int    pthread__stackalloc(pthread_t *t);
                    165: void   pthread__initmain(pthread_t *t);
                    166:
                    167: void   pthread__sa_start(void);
                    168: void   pthread__sa_recycle(pthread_t old, pthread_t new);
                    169:
                    170: #include "pthread_md.h"
                    171:
                    172: /* Stack location of pointer to a particular thread */
                    173: #define pthread__id(sp) \
                    174:        ((pthread_t) (((vaddr_t)(sp)) & ~PT_STACKMASK))
                    175:
                    176: #define pthread__self() (pthread__id(pthread__sp()))
                    177:
                    178: void   pthread__upcall_switch(pthread_t self, pthread_t next);
                    179: void   pthread__switch(pthread_t self, pthread_t next, int locks);
                    180: void   pthread__locked_switch(pthread_t self, pthread_t next,
                    181:     pt_spin_t *lock);
                    182:
1.1.2.2   nathanw   183: void   pthread_lockinit(pt_spin_t *lock);
1.1.2.1   nathanw   184: void   pthread_spinlock(pthread_t thread, pt_spin_t *lock);
                    185: int    pthread_spintrylock(pthread_t thread, pt_spin_t *lock);
                    186: void   pthread_spinunlock(pthread_t thread, pt_spin_t *lock);
                    187:
                    188: void pthread__signal(pthread_t t, int sig, int code);
                    189:
                    190:
                    191:
                    192: #define PTHREADD_CREATE                0
                    193: #define PTHREADD_IDLE          1
                    194: #define PTHREADD_UPCALLS       2
                    195: #define PTHREADD_UP_BLOCK       3
                    196: #define PTHREADD_UP_NEW                4
                    197: #define PTHREADD_UP_PREEMPT    5
                    198: #define PTHREADD_UP_UNBLOCK    6
                    199: #define PTHREADD_UP_SIGNAL     7
                    200: #define PTHREADD_SPINLOCKS     8
                    201: #define PTHREADD_SPINUNLOCKS   9
                    202: #define PTHREADD_SPINPREEMPT   10
                    203: #define PTHREADD_RESOLVELOCKS  11
                    204: #define PTHREADD_SWITCHTO      12
                    205: #define PTHREADD_NCOUNTERS     13
                    206:
                    207: #ifdef PTHREAD__DEBUG
                    208:
                    209: extern int pthread__debug_counters[PTHREADD_NCOUNTERS];
                    210:
                    211: #define PTHREADD_ADD(x) (pthread__debug_counters[(x)]++)
                    212:
                    213: #else /* PTHREAD_DEBUG */
                    214:
                    215: #define PTHREADD_ADD(x)
                    216:
                    217: #endif /* PTHREAD_DEBUG */
                    218:
                    219:
                    220:
                    221:
                    222: #endif /* _LIB_PTHREAD_INT_H */
                    223:

CVSweb <webmaster@jp.NetBSD.org>