Annotation of OSKit-Mach/kern/thread.h, revision 1.1

1.1     ! root        1: /* 
        !             2:  * Mach Operating System
        !             3:  * Copyright (c) 1993-1987 Carnegie Mellon University
        !             4:  * All Rights Reserved.
        !             5:  * 
        !             6:  * Permission to use, copy, modify and distribute this software and its
        !             7:  * documentation is hereby granted, provided that both the copyright
        !             8:  * notice and this permission notice appear in all copies of the
        !             9:  * software, derivative works or modified versions, and any portions
        !            10:  * thereof, and that both notices appear in supporting documentation.
        !            11:  * 
        !            12:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
        !            13:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
        !            14:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
        !            15:  * 
        !            16:  * Carnegie Mellon requests users of this software to return to
        !            17:  * 
        !            18:  *  Software Distribution Coordinator  or  [email protected]
        !            19:  *  School of Computer Science
        !            20:  *  Carnegie Mellon University
        !            21:  *  Pittsburgh PA 15213-3890
        !            22:  * 
        !            23:  * any improvements or extensions that they make and grant Carnegie Mellon
        !            24:  * the rights to redistribute these changes.
        !            25:  */
        !            26: /*
        !            27:  *     File:   thread.h
        !            28:  *     Author: Avadis Tevanian, Jr.
        !            29:  *
        !            30:  *     This file contains the structure definitions for threads.
        !            31:  *
        !            32:  */
        !            33: 
        !            34: #ifndef        _KERN_THREAD_H_
        !            35: #define _KERN_THREAD_H_
        !            36: 
        !            37: #include <mach_ipc_compat.h>
        !            38: #include <hw_footprint.h>
        !            39: #include <mach_fixpri.h>
        !            40: #include <mach_host.h>
        !            41: #include <net_atm.h>
        !            42: 
        !            43: #include <mach/boolean.h>
        !            44: #include <mach/thread_info.h>
        !            45: #include <mach/thread_status.h>
        !            46: #include <mach/machine/vm_types.h>
        !            47: #include <mach/message.h>
        !            48: #include <mach/port.h>
        !            49: #include <mach/vm_prot.h>
        !            50: #include <kern/ast.h>
        !            51: #include <kern/cpu_number.h>
        !            52: #include <kern/queue.h>
        !            53: #include <kern/pc_sample.h>
        !            54: #include <kern/processor.h>
        !            55: #include <kern/sched_prim.h>   /* event_t, continuation_t */
        !            56: #include <kern/time_out.h>
        !            57: #include <kern/timer.h>
        !            58: #include <kern/lock.h>
        !            59: #include <kern/sched.h>
        !            60: #include <kern/task.h>         /* for current_space(), current_map() */
        !            61: #include <machine/thread.h>
        !            62: #include <ipc/ipc_kmsg_queue.h>
        !            63: 
        !            64: struct thread {
        !            65:        /* Run queues */
        !            66:        queue_chain_t   links;          /* current run queue links */
        !            67:        run_queue_t     runq;           /* run queue p is on SEE BELOW */
        !            68: /*
        !            69:  *     NOTE:   The runq field in the thread structure has an unusual
        !            70:  *     locking protocol.  If its value is RUN_QUEUE_NULL, then it is
        !            71:  *     locked by the thread_lock, but if its value is something else
        !            72:  *     (i.e. a run_queue) then it is locked by that run_queue's lock.
        !            73:  */
        !            74: 
        !            75:        /* Task information */
        !            76:        task_t          task;           /* Task to which I belong */
        !            77:        queue_chain_t   thread_list;    /* list of threads in task */
        !            78: 
        !            79:        /* Thread bookkeeping */
        !            80:        queue_chain_t   pset_threads;   /* list of all threads in proc set*/
        !            81: 
        !            82:        /* Self-preservation */
        !            83:        decl_simple_lock_data(,lock)
        !            84:        int             ref_count;      /* number of references to me */
        !            85: 
        !            86:        /* Hardware state */
        !            87:        pcb_t           pcb;            /* hardware pcb & machine state */
        !            88:        vm_offset_t     kernel_stack;   /* accurate only if the thread is
        !            89:                                           not swapped and not executing */
        !            90:        vm_offset_t     stack_privilege;/* reserved kernel stack */
        !            91: 
        !            92:        /* Swapping information */
        !            93:        void            (*swap_func)(); /* start here after swapin */
        !            94: 
        !            95:        /* Blocking information */
        !            96:        event_t         wait_event;     /* event we are waiting on */
        !            97:        int             suspend_count;  /* internal use only */
        !            98:        kern_return_t   wait_result;    /* outcome of wait -
        !            99:                                           may be examined by this thread
        !           100:                                           WITHOUT locking */
        !           101:        boolean_t       wake_active;    /* someone is waiting for this
        !           102:                                           thread to become suspended */
        !           103:        int             state;          /* Thread state: */
        !           104: /*
        !           105:  *     Thread states [bits or'ed]
        !           106:  */
        !           107: #define TH_WAIT                        0x01    /* thread is queued for waiting */
        !           108: #define TH_SUSP                        0x02    /* thread has been asked to stop */
        !           109: #define TH_RUN                 0x04    /* thread is running or on runq */
        !           110: #define TH_UNINT               0x08    /* thread is waiting uninteruptibly */
        !           111: #define        TH_HALTED               0x10    /* thread is halted at clean point ? */
        !           112: 
        !           113: #define TH_IDLE                        0x80    /* thread is an idle thread */
        !           114: 
        !           115: #define        TH_SCHED_STATE  (TH_WAIT|TH_SUSP|TH_RUN|TH_UNINT)
        !           116: 
        !           117: #define        TH_SWAPPED              0x0100  /* thread has no kernel stack */
        !           118: #define        TH_SW_COMING_IN         0x0200  /* thread is waiting for kernel stack */
        !           119: 
        !           120: #define        TH_SWAP_STATE   (TH_SWAPPED | TH_SW_COMING_IN)
        !           121: 
        !           122:        /* Scheduling information */
        !           123:        int             priority;       /* thread's priority */
        !           124:        int             max_priority;   /* maximum priority */
        !           125:        int             sched_pri;      /* scheduled (computed) priority */
        !           126: #if    MACH_FIXPRI
        !           127:        int             sched_data;     /* for use by policy */
        !           128:        int             policy;         /* scheduling policy */
        !           129: #endif /* MACH_FIXPRI */
        !           130:        int             depress_priority; /* depressed from this priority */
        !           131:        unsigned int    cpu_usage;      /* exp. decaying cpu usage [%cpu] */
        !           132:        unsigned int    sched_usage;    /* load-weighted cpu usage [sched] */
        !           133:        unsigned int    sched_stamp;    /* last time priority was updated */
        !           134: 
        !           135:        /* VM global variables */
        !           136: 
        !           137:        vm_offset_t     recover;        /* page fault recovery (copyin/out) */
        !           138:        boolean_t       vm_privilege;   /* Can use reserved memory? */
        !           139: 
        !           140:        /* User-visible scheduling state */
        !           141:        int             user_stop_count;        /* outstanding stops */
        !           142: 
        !           143:        /* IPC data structures */
        !           144:        struct thread *ith_next, *ith_prev;
        !           145:        mach_msg_return_t ith_state;
        !           146:        union {
        !           147:                mach_msg_size_t msize;          /* max size for recvd msg */
        !           148:                struct ipc_kmsg *kmsg;          /* received message */
        !           149:        } data;
        !           150:        mach_port_seqno_t ith_seqno;            /* seqno of recvd message */
        !           151: 
        !           152:        /* This queue is used only when destroying messages:
        !           153:           it prevents nasty recursion problems when destroying one message
        !           154:           causes other messages to be destroyed.
        !           155:           This queue should always be empty under normal circumstances.
        !           156:           See ipc_kmsg_destroy() for more details.  */
        !           157:        struct ipc_kmsg_queue ith_messages; 
        !           158: 
        !           159:        decl_simple_lock_data(, ith_lock_data)
        !           160:        struct ipc_port *ith_self;      /* not a right, doesn't hold ref */
        !           161:        struct ipc_port *ith_sself;     /* a send right */
        !           162:        struct ipc_port *ith_exception; /* a send right */
        !           163: #if    MACH_IPC_COMPAT
        !           164:        struct ipc_port *ith_reply;     /* a send right */
        !           165: #endif /* MACH_IPC_COMPAT */
        !           166: 
        !           167:        mach_port_t ith_mig_reply;      /* reply port for mig */
        !           168:        struct ipc_port *ith_rpc_reply; /* reply port for kernel RPCs */
        !           169: 
        !           170:        /* State saved when thread's stack is discarded */
        !           171:        union {
        !           172:                struct {
        !           173:                        mach_msg_header_t *msg;
        !           174:                        mach_msg_option_t option;
        !           175:                        mach_msg_size_t rcv_size;
        !           176:                        mach_msg_timeout_t timeout;
        !           177:                        mach_port_t notify;
        !           178:                        struct ipc_object *object;
        !           179:                        struct ipc_mqueue *mqueue;
        !           180:                } receive;
        !           181:                struct {
        !           182:                        struct ipc_port *port;
        !           183:                        int exc;
        !           184:                        int code;
        !           185:                        int subcode;
        !           186:                } exception;
        !           187:                void *other;            /* catch-all for other state */
        !           188:        } saved;
        !           189: 
        !           190:        /* Timing data structures */
        !           191:        timer_data_t    user_timer;     /* user mode timer */
        !           192:        timer_data_t    system_timer;   /* system mode timer */
        !           193:        timer_save_data_t user_timer_save;  /* saved user timer value */
        !           194:        timer_save_data_t system_timer_save;  /* saved sys timer val. */
        !           195:        unsigned int    cpu_delta;      /* cpu usage since last update */
        !           196:        unsigned int    sched_delta;    /* weighted cpu usage since update */
        !           197: 
        !           198:        /* Creation time stamp */
        !           199:        time_value_t    creation_time;
        !           200: 
        !           201:        /* Time-outs */
        !           202:        timer_elt_data_t timer;         /* timer for thread */
        !           203:        timer_elt_data_t depress_timer; /* timer for priority depression */
        !           204: 
        !           205:        /* Ast/Halt data structures */
        !           206:        boolean_t       active;         /* how alive is the thread */
        !           207:        int             ast;            /* ast's needed.  See ast.h */
        !           208: 
        !           209:        /* Processor data structures */
        !           210:        processor_set_t processor_set;  /* assigned processor set */
        !           211:        processor_t     bound_processor;        /* bound to processor ?*/
        !           212: 
        !           213:        sample_control_t pc_sample;
        !           214: 
        !           215: #if    MACH_HOST
        !           216:        boolean_t       may_assign;     /* may assignment change? */
        !           217:        boolean_t       assign_active;  /* someone waiting for may_assign */
        !           218: #endif /* MACH_HOST */
        !           219: 
        !           220: #if    NCPUS > 1
        !           221:        processor_t     last_processor; /* processor this last ran on */
        !           222: #endif /* NCPUS > 1 */
        !           223: 
        !           224: #if    NET_ATM
        !           225:        nw_ep_owned_t   nw_ep_waited;
        !           226: #endif /* NET_ATM */
        !           227: };
        !           228: 
        !           229: /* typedef of thread_t is in kern/kern_types.h */
        !           230: typedef struct thread_shuttle  *thread_shuttle_t;
        !           231: #define THREAD_NULL            ((thread_t) 0)
        !           232: #define THREAD_SHUTTLE_NULL    ((thread_shuttle_t)0)
        !           233: 
        !           234: #define        ith_msize       data.msize
        !           235: #define        ith_kmsg        data.kmsg
        !           236: #define        ith_wait_result wait_result
        !           237: 
        !           238: #define        ith_msg         saved.receive.msg
        !           239: #define        ith_option      saved.receive.option
        !           240: #define ith_rcv_size   saved.receive.rcv_size
        !           241: #define ith_timeout    saved.receive.timeout
        !           242: #define ith_notify     saved.receive.notify
        !           243: #define ith_object     saved.receive.object
        !           244: #define ith_mqueue     saved.receive.mqueue
        !           245: 
        !           246: #define        ith_port        saved.exception.port
        !           247: #define ith_exc                saved.exception.exc
        !           248: #define ith_exc_code   saved.exception.code
        !           249: #define ith_exc_subcode        saved.exception.subcode
        !           250: 
        !           251: #define ith_other      saved.other
        !           252: 
        !           253: #ifndef        _KERN_KERN_TYPES_H_
        !           254: typedef struct thread *thread_t;
        !           255: 
        !           256: #define THREAD_NULL    ((thread_t) 0)
        !           257: 
        !           258: typedef        mach_port_t *thread_array_t;
        !           259: #endif /* _KERN_KERN_TYPES_H_ */
        !           260: 
        !           261: 
        !           262: extern thread_t                active_threads[NCPUS];  /* active threads */
        !           263: extern vm_offset_t     active_stacks[NCPUS];   /* active kernel stacks */
        !           264: 
        !           265: #ifdef KERNEL
        !           266: /*
        !           267:  *     User routines
        !           268:  */
        !           269: 
        !           270: extern kern_return_t   thread_create(
        !           271:        task_t          parent_task,
        !           272:        thread_t        *child_thread);
        !           273: extern kern_return_t   thread_terminate(
        !           274:        thread_t        thread);
        !           275: extern kern_return_t   thread_suspend(
        !           276:        thread_t        thread);
        !           277: extern kern_return_t   thread_resume(
        !           278:        thread_t        thread);
        !           279: extern kern_return_t   thread_abort(
        !           280:        thread_t        thread);
        !           281: extern kern_return_t   thread_get_state(
        !           282:        thread_t        thread,
        !           283:        int             flavor,
        !           284:        thread_state_t  old_state,
        !           285:        natural_t       *old_state_count);
        !           286: extern kern_return_t   thread_set_state(
        !           287:        thread_t        thread,
        !           288:        int             flavor,
        !           289:        thread_state_t  new_state,
        !           290:        natural_t       new_state_count);
        !           291: extern kern_return_t   thread_get_special_port(
        !           292:        thread_t        thread,
        !           293:        int             which,
        !           294:        struct ipc_port **portp);
        !           295: extern kern_return_t   thread_set_special_port(
        !           296:        thread_t        thread,
        !           297:        int             which,
        !           298:        struct ipc_port *port);
        !           299: extern kern_return_t   thread_info(
        !           300:        thread_t        thread,
        !           301:        int             flavor,
        !           302:        thread_info_t   thread_info_out,
        !           303:        natural_t       *thread_info_count);
        !           304: extern kern_return_t   thread_assign(
        !           305:        thread_t        thread,
        !           306:        processor_set_t new_pset);
        !           307: extern kern_return_t   thread_assign_default(
        !           308:        thread_t        thread);
        !           309: #endif
        !           310: 
        !           311: /*
        !           312:  *     Kernel-only routines
        !           313:  */
        !           314: 
        !           315: extern void            thread_init(void);
        !           316: extern void            thread_reference(thread_t);
        !           317: extern void            thread_deallocate(thread_t);
        !           318: extern void            thread_hold(thread_t);
        !           319: extern kern_return_t   thread_dowait(
        !           320:        thread_t        thread,
        !           321:        boolean_t       must_halt);
        !           322: extern void            thread_release(thread_t);
        !           323: extern kern_return_t   thread_halt(
        !           324:        thread_t        thread,
        !           325:        boolean_t       must_halt);
        !           326: extern void            thread_halt_self(void);
        !           327: extern void            thread_force_terminate(thread_t);
        !           328: extern void            thread_set_own_priority(
        !           329:        int             priority);
        !           330: extern thread_t                kernel_thread(
        !           331:        task_t          task,
        !           332:        void            (*start)(void),
        !           333:        void *          arg);
        !           334: 
        !           335: extern void            reaper_thread(void);
        !           336: 
        !           337: #if    MACH_HOST
        !           338: extern void            thread_freeze(
        !           339:        thread_t        thread);
        !           340: extern void            thread_doassign(
        !           341:        thread_t        thread,
        !           342:        processor_set_t new_pset,
        !           343:        boolean_t       release_freeze);
        !           344: extern void            thread_unfreeze(
        !           345:        thread_t        thread);
        !           346: #endif /* MACH_HOST */
        !           347: 
        !           348: /*
        !           349:  *     Macro-defined routines
        !           350:  */
        !           351: 
        !           352: #define thread_pcb(th)         ((th)->pcb)
        !           353: 
        !           354: #define thread_lock(th)                simple_lock(&(th)->lock)
        !           355: #define thread_unlock(th)      simple_unlock(&(th)->lock)
        !           356: 
        !           357: #define thread_should_halt(thread)     \
        !           358:                ((thread)->ast & (AST_HALT|AST_TERMINATE))
        !           359: 
        !           360: /*
        !           361:  *     Machine specific implementations of the current thread macro
        !           362:  *     designate this by defining CURRENT_THREAD.
        !           363:  */
        !           364: #ifndef        CURRENT_THREAD
        !           365: #define current_thread()       (active_threads[cpu_number()])
        !           366: #endif /* CURRENT_THREAD */
        !           367: 
        !           368: #define        current_stack()         (active_stacks[cpu_number()])
        !           369: 
        !           370: #define        current_task()          (current_thread()->task)
        !           371: #define        current_space()         (current_task()->itk_space)
        !           372: #define        current_map()           (current_task()->map)
        !           373: 
        !           374: #endif /* _KERN_THREAD_H_ */

unix.superglobalmegacorp.com

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