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