Annotation of coherent/f/usr/include/kernel/v_proc.h, revision 1.1

1.1     ! root        1: #ifndef        __KERNEL_V_PROC_H__
        !             2: #define        __KERNEL_V_PROC_H__
        !             3: 
        !             4: /*
        !             5:  * This function describes a high-level abstract interface to the low-level
        !             6:  * scheduling system that is suitable for multiprocessor use. The design of
        !             7:  * this interface has been primarily motivated by the multiprocessor DDI/DKI
        !             8:  * sleep lock and synchronization variable functions, which impose a rather
        !             9:  * different model of sleep incompatible with the old-style sleep () and
        !            10:  * wakeup () functions. See "ksynch.c" for a detailed discussion of this.
        !            11:  *
        !            12:  * This interface is private to this DDI/DKI implementation, and is not
        !            13:  * part of the DDI/DKI itself. Portable code should not rely on the contents
        !            14:  * of this header at all.
        !            15:  */
        !            16: 
        !            17: /*
        !            18:  *-IMPORTS:
        !            19:  *     <common/ccompat.h>
        !            20:  *             __EXTERN_C_BEGIN__
        !            21:  *             __EXTERN_C_END__
        !            22:  *             __PROTO ()
        !            23:  *     <kernel/_sleep.h>
        !            24:  *             __sleep_t
        !            25:  *     <kernel/ddi_proc.h>
        !            26:  *             pnode_t
        !            27:  *             ddi_proc_data ()
        !            28:  */
        !            29: 
        !            30: #include <common/ccompat.h>
        !            31: #include <kernel/_sleep.h>
        !            32: #include <kernel/ddi_proc.h>
        !            33: 
        !            34: 
        !            35: /*
        !            36:  * Flag values to pass to MAKE_SLEEPING ().
        !            37:  */
        !            38: 
        !            39: enum {
        !            40:        SLEEP_NO_SIGNALS,
        !            41:        SLEEP_INTERRUPTIBLE
        !            42: };
        !            43: 
        !            44: 
        !            45: /*
        !            46:  * The following structure type defines the information that a client of
        !            47:  * MAKE_SLEEPING is required to keep.
        !            48:  *
        !            49:  * If the underlying implementation uses an adress-based hash-list like the
        !            50:  * old-style sleep () and wakeup () functions, then this item need not contain
        !            51:  * any data. However, making at least one byte in size gives the property that
        !            52:  * the address of such an item is unique. While this would normally contain
        !            53:  * pointers threading process-table entries together, an implementation based
        !            54:  * on old-style broadcast wakeup is plausible (where this structure would
        !            55:  * contain counters to implement the one-at-a-time wakeup).
        !            56:  *
        !            57:  * Since this stuff is used to implement sleep locking, it is justified in not
        !            58:  * using basic locks but going instead to the really primitive operations.
        !            59:  */
        !            60: 
        !            61: typedef struct proc_list plist_t;
        !            62: 
        !            63: struct proc_list {
        !            64:        atomic_uchar_t  pl_locked;      /* control list manipulation */
        !            65:        pnode_t       * pl_head;        /* first waiting process info */
        !            66: };
        !            67: 
        !            68: 
        !            69: #define        PLIST_INIT(l)           ((void) ATOMIC_CLEAR_UCHAR ((l)->pl_locked))
        !            70: #define PLIST_DESTROY(l)       ((void) 0)
        !            71: #define PLIST_LOCK(l,n)                (TEST_AND_SET_LOCK ((l)->pl_locked, plhi, \
        !            72:                                                    (n)))
        !            73: #define        PLIST_UNLOCK(l,p)       (ATOMIC_CLEAR_UCHAR ((l)->pl_locked), \
        !            74:                                                     (void) splx (p))
        !            75: #define        PLIST_ASSERT_LOCKED(l)  ASSERT (ATOMIC_FETCH_UCHAR ((l)->pl_locked) \
        !            76:                                        != 0)
        !            77: 
        !            78: 
        !            79: /*
        !            80:  * External function definitions. The curious may like to note that the use
        !            81:  * of the __PROTO () macro below has a useful side-effect with respect to
        !            82:  * macro-expansion of MAKE_SLEEPING (). The ISO C preprocessor scanning rules
        !            83:  * prevent MAKE_SLEEPING () below being expanded because the next right token
        !            84:  * is not a left parenthesis. The rescanning rules mean that even through
        !            85:  * __PROTO () actually expands to something beginning with a left parenthesis,
        !            86:  * the MAKE_SLEEPING token will get copied to the output without expansion,
        !            87:  * because it will not be considered again.
        !            88:  *
        !            89:  * This feature may be of some use if one has a non-ISO C compiler but can
        !            90:  * get the source ISO-preprocessed. Many K&R compilers do not understand the
        !            91:  * ISO macro-suppression idiom of enclosing a macro name within parentheses
        !            92:  * (this suppresses macro-expansion because the next token will be a right
        !            93:  * parenthesis) in function declarations due to weaknesses in the grammars
        !            94:  * used. Use of an identity macro to enclose the parameter list ensures that
        !            95:  * the preprocessor doesn't perform the expansion but leaves the function
        !            96:  * name unadorned by unnecessary parentheses. Note that enclosing the function
        !            97:  * name does not have the suppressing effect!
        !            98:  */
        !            99: 
        !           100: __EXTERN_C_BEGIN__
        !           101: 
        !           102: __sleep_t      MAKE_SLEEPING   __PROTO ((plist_t * _plistp, int _priority,
        !           103:                                          int _flag));
        !           104: void           RUN_NEXT        __PROTO ((void));
        !           105: __VOID__      *        WAKE_ONE        __PROTO ((plist_t * _plistp));
        !           106: void           WAKE_ALL        __PROTO ((plist_t * _plistp));
        !           107: 
        !           108: __VOID__      *        PROC_HANDLE     __PROTO ((void));
        !           109: 
        !           110: __EXTERN_C_END__
        !           111: 
        !           112: 
        !           113: #endif /* ! defined (__KERNEL_V_PROC_H__) */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.