[BACK]Return to rf_threadstuff.h CVS log [TXT][DIR] Up to [local] / sys / dev / raidframe

Annotation of sys/dev/raidframe/rf_threadstuff.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: rf_threadstuff.h,v 1.8 2002/12/16 07:01:05 tdeval Exp $       */
                      2: /*     $NetBSD: rf_threadstuff.h,v 1.8 2000/06/11 03:35:38 oster Exp $ */
                      3:
                      4: /*
                      5:  * Copyright (c) 1995 Carnegie-Mellon University.
                      6:  * All rights reserved.
                      7:  *
                      8:  * Author: Mark Holland, Daniel Stodolsky, Jim Zelenka
                      9:  *
                     10:  * Permission to use, copy, modify and distribute this software and
                     11:  * its documentation is hereby granted, provided that both the copyright
                     12:  * notice and this permission notice appear in all copies of the
                     13:  * software, derivative works or modified versions, and any portions
                     14:  * thereof, and that both notices appear in supporting documentation.
                     15:  *
                     16:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     17:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
                     18:  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     19:  *
                     20:  * Carnegie Mellon requests users of this software to return to
                     21:  *
                     22:  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
                     23:  *  School of Computer Science
                     24:  *  Carnegie Mellon University
                     25:  *  Pittsburgh PA 15213-3890
                     26:  *
                     27:  * any improvements or extensions that they make and grant Carnegie the
                     28:  * rights to redistribute these changes.
                     29:  */
                     30:
                     31: /*
                     32:  * threadstuff.h -- Definitions for threads, locks, and synchronization.
                     33:  *
                     34:  * The purpose of this file is provide some illusion of portability.
                     35:  * If the functions below can be implemented with the same semantics on
                     36:  * some new system, then at least the synchronization and thread control
                     37:  * part of the code should not require modification to port to a new machine.
                     38:  * The only other place where the pthread package is explicitly used is
                     39:  * threadid.h
                     40:  *
                     41:  * This file should be included above stdio.h to get some necessary defines.
                     42:  *
                     43:  */
                     44:
                     45: #ifndef        _RF__RF_THREADSTUFF_H_
                     46: #define        _RF__RF_THREADSTUFF_H_
                     47:
                     48: #include "rf_types.h"
                     49: #include <sys/types.h>
                     50: #include <sys/param.h>
                     51: #ifdef _KERNEL
                     52: #include <sys/systm.h>
                     53: #include <sys/proc.h>
                     54: #include <sys/kthread.h>
                     55: #endif
                     56:
                     57: #define        rf_create_managed_mutex(a,b)                                    \
                     58:        _rf_create_managed_mutex(a,b,__FILE__,__LINE__)
                     59: #define        rf_create_managed_cond(a,b)                                     \
                     60:        _rf_create_managed_cond(a,b,__FILE__,__LINE__)
                     61: #define        rf_init_managed_threadgroup(a,b)                                \
                     62:        _rf_init_managed_threadgroup(a,b,__FILE__,__LINE__)
                     63: #define        rf_init_threadgroup(a)                                          \
                     64:        _rf_init_threadgroup(a,__FILE__,__LINE__)
                     65: #define        rf_destroy_threadgroup(a)                                       \
                     66:        _rf_destroy_threadgroup(a,__FILE__,__LINE__)
                     67:
                     68: int _rf_init_threadgroup(RF_ThreadGroup_t *, char *, int);
                     69: int _rf_destroy_threadgroup(RF_ThreadGroup_t *, char *, int);
                     70: int _rf_init_managed_threadgroup(RF_ShutdownList_t **, RF_ThreadGroup_t *,
                     71:     char *, int);
                     72:
                     73: #include <sys/lock.h>
                     74: #define        decl_simple_lock_data(a,b)      a struct simplelock b
                     75: #define        simple_lock_addr(a)             ((struct simplelock *)&(a))
                     76:
                     77: typedef struct proc    *RF_Thread_t;
                     78: typedef void           *RF_ThreadArg_t;
                     79:
                     80: #define        RF_DECLARE_MUTEX(_m_)           decl_simple_lock_data(,(_m_))
                     81: #define        RF_DECLARE_STATIC_MUTEX(_m_)    decl_simple_lock_data(static,(_m_))
                     82: #define        RF_DECLARE_EXTERN_MUTEX(_m_)    decl_simple_lock_data(extern,(_m_))
                     83:
                     84: #define        RF_DECLARE_COND(_c_)            int _c_
                     85: #define        RF_DECLARE_STATIC_COND(_c_)     static int _c_
                     86: #define        RF_DECLARE_EXTERN_COND(_c_)     extern int _c_
                     87:
                     88: #define        RF_LOCK_MUTEX(_m_)              simple_lock(&(_m_))
                     89: #define        RF_UNLOCK_MUTEX(_m_)            simple_unlock(&(_m_))
                     90:
                     91: /*
                     92:  * In Net- and OpenBSD, kernel threads are simply processes that share several
                     93:  * substructures and never run in userspace.
                     94:  */
                     95: #define        RF_WAIT_COND(_c_,_m_)   do {                                    \
                     96:        RF_UNLOCK_MUTEX(_m_);                                           \
                     97:        tsleep(&_c_, PRIBIO, "rfwcond", 0);                             \
                     98:        RF_LOCK_MUTEX(_m_);                                             \
                     99: } while (0)
                    100: #define        RF_SIGNAL_COND(_c_)     wakeup(&(_c_))
                    101: #define        RF_BROADCAST_COND(_c_)  wakeup(&(_c_))
                    102: #define        RF_CREATE_THREAD(_handle_, _func_, _arg_, _name_)               \
                    103:        kthread_create((void (*)(void *))(_func_), (void *)(_arg_),     \
                    104:            (struct proc **)&(_handle_), _name_)
                    105:
                    106: struct RF_ThreadGroup_s {
                    107:        int                      created;
                    108:        int                      running;
                    109:        int                      shutdown;
                    110:        RF_DECLARE_MUTEX        (mutex);
                    111:        RF_DECLARE_COND         (cond);
                    112: };
                    113:
                    114: /*
                    115:  * Someone has started a thread in the group.
                    116:  */
                    117: #define        RF_THREADGROUP_STARTED(_g_)     do {                            \
                    118:        RF_LOCK_MUTEX((_g_)->mutex);                                    \
                    119:        (_g_)->created++;                                               \
                    120:        RF_UNLOCK_MUTEX((_g_)->mutex);                                  \
                    121: } while (0)
                    122:
                    123: /*
                    124:  * Thread announcing that it is now running.
                    125:  */
                    126: #define        RF_THREADGROUP_RUNNING(_g_)     do {                            \
                    127:        RF_LOCK_MUTEX((_g_)->mutex);                                    \
                    128:        (_g_)->running++;                                               \
                    129:        RF_UNLOCK_MUTEX((_g_)->mutex);                                  \
                    130:        RF_SIGNAL_COND((_g_)->cond);                                    \
                    131: } while (0)
                    132:
                    133: /*
                    134:  * Thread announcing that it is now done.
                    135:  */
                    136: #define        RF_THREADGROUP_DONE(_g_)        do {                            \
                    137:        RF_LOCK_MUTEX((_g_)->mutex);                                    \
                    138:        (_g_)->shutdown++;                                              \
                    139:        RF_UNLOCK_MUTEX((_g_)->mutex);                                  \
                    140:        RF_SIGNAL_COND((_g_)->cond);                                    \
                    141: } while (0)
                    142:
                    143: /*
                    144:  * Wait for all threads to start running.
                    145:  */
                    146: #define        RF_THREADGROUP_WAIT_START(_g_)  do {                            \
                    147:        RF_LOCK_MUTEX((_g_)->mutex);                                    \
                    148:        while((_g_)->running < (_g_)->created) {                        \
                    149:                RF_WAIT_COND((_g_)->cond, (_g_)->mutex);                \
                    150:        }                                                               \
                    151:        RF_UNLOCK_MUTEX((_g_)->mutex);                                  \
                    152: } while (0)
                    153:
                    154: /*
                    155:  * Wait for all threads to stop running.
                    156:  */
                    157: #if    !defined(__NetBSD__) && !defined(__OpenBSD__)
                    158: #define        RF_THREADGROUP_WAIT_STOP(_g_)   do {                            \
                    159:        RF_LOCK_MUTEX((_g_)->mutex);                                    \
                    160:        RF_ASSERT((_g_)->running == (_g_)->created);                    \
                    161:        while((_g_)->shutdown < (_g_)->running) {                       \
                    162:                RF_WAIT_COND((_g_)->cond, (_g_)->mutex);                \
                    163:        }                                                               \
                    164:        RF_UNLOCK_MUTEX((_g_)->mutex);                                  \
                    165: } while (0)
                    166: #else
                    167:  /*
                    168:   * XXX Note that we've removed the assert. That should be put back in once
                    169:   * we actually get something like a kernel thread running.
                    170:   */
                    171: #define        RF_THREADGROUP_WAIT_STOP(_g_)   do {                            \
                    172:        RF_LOCK_MUTEX((_g_)->mutex);                                    \
                    173:        while((_g_)->shutdown < (_g_)->running) {                       \
                    174:                RF_WAIT_COND((_g_)->cond, (_g_)->mutex);                \
                    175:        }                                                               \
                    176:        RF_UNLOCK_MUTEX((_g_)->mutex);                                  \
                    177: } while (0)
                    178: #endif
                    179:
                    180:
                    181: int  rf_mutex_init(struct simplelock *);
                    182: int  rf_mutex_destroy(struct simplelock *);
                    183: int _rf_create_managed_mutex(RF_ShutdownList_t **, struct simplelock *,
                    184:        char *, int);
                    185: int _rf_create_managed_cond(RF_ShutdownList_t ** listp, int *, char *, int);
                    186:
                    187: int  rf_cond_init(int *);
                    188: int  rf_cond_destroy(int *);
                    189:
                    190: #endif /* !_RF__RF_THREADSTUFF_H_ */

CVSweb