1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
|
/*
* Mach Operating System
* Copyright (c) 1993-1988 Carnegie Mellon University
* All Rights Reserved.
*
* Permission to use, copy, modify and distribute this software and its
* documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
*
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
*
* Carnegie Mellon requests users of this software to return to
*
* Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
* School of Computer Science
* Carnegie Mellon University
* Pittsburgh PA 15213-3890
*
* any improvements or extensions that they make and grant Carnegie Mellon
* the rights to redistribute these changes.
*/
/*
* File: task.h
* Author: Avadis Tevanian, Jr.
*
* This file contains the structure definitions for tasks.
*
*/
#ifndef _KERN_TASK_H_
#define _KERN_TASK_H_
#include <mach/boolean.h>
#include <mach/port.h>
#include <mach/time_value.h>
#include <mach/mach_param.h>
#include <mach/task_info.h>
#include <kern/kern_types.h>
#include <kern/lock.h>
#include <kern/queue.h>
#include <kern/pc_sample.h>
#include <kern/processor.h>
#include <kern/syscall_emulation.h>
#include <vm/vm_map.h>
struct task {
/* Synchronization/destruction information */
decl_simple_lock_data(,lock) /* Task's lock */
int ref_count; /* Number of references to me */
boolean_t active; /* Task has not been terminated */
/* Miscellaneous */
vm_map_t map; /* Address space description */
queue_chain_t pset_tasks; /* list of tasks assigned to pset */
int suspend_count; /* Internal scheduling only */
/* Thread information */
queue_head_t thread_list; /* list of threads */
int thread_count; /* number of threads */
processor_set_t processor_set; /* processor set for new threads */
boolean_t may_assign; /* can assigned pset be changed? */
boolean_t assign_active; /* waiting for may_assign */
/* User-visible scheduling information */
int user_stop_count; /* outstanding stops */
int priority; /* for new threads */
/* Statistics */
time_value_t total_user_time;
/* total user time for dead threads */
time_value_t total_system_time;
/* total system time for dead threads */
time_value_t creation_time; /* time stamp at creation */
/* IPC structures */
decl_simple_lock_data(, itk_lock_data)
struct ipc_port *itk_self; /* not a right, doesn't hold ref */
struct ipc_port *itk_sself; /* a send right */
struct ipc_port *itk_exception; /* a send right */
struct ipc_port *itk_bootstrap; /* a send right */
struct ipc_port *itk_registered[TASK_PORT_REGISTER_MAX];
/* all send rights */
struct ipc_space *itk_space;
/* User space system call emulation support */
struct eml_dispatch *eml_dispatch;
sample_control_t pc_sample;
#if FAST_TAS
#define TASK_FAST_TAS_NRAS 8
vm_offset_t fast_tas_base[TASK_FAST_TAS_NRAS];
vm_offset_t fast_tas_end[TASK_FAST_TAS_NRAS];
#endif /* FAST_TAS */
};
#define task_lock(task) simple_lock(&(task)->lock)
#define task_unlock(task) simple_unlock(&(task)->lock)
#define itk_lock_init(task) simple_lock_init(&(task)->itk_lock_data)
#define itk_lock(task) simple_lock(&(task)->itk_lock_data)
#define itk_unlock(task) simple_unlock(&(task)->itk_lock_data)
/*
* Exported routines/macros
*/
extern kern_return_t task_create(
task_t parent_task,
boolean_t inherit_memory,
task_t *child_task);
extern kern_return_t task_terminate(
task_t task);
extern kern_return_t task_suspend(
task_t task);
extern kern_return_t task_resume(
task_t task);
extern kern_return_t task_threads(
task_t task,
thread_array_t *thread_list,
natural_t *count);
extern kern_return_t task_info(
task_t task,
int flavor,
task_info_t task_info_out,
natural_t *task_info_count);
extern kern_return_t task_get_special_port(
task_t task,
int which,
struct ipc_port **portp);
extern kern_return_t task_set_special_port(
task_t task,
int which,
struct ipc_port *port);
extern kern_return_t task_assign(
task_t task,
processor_set_t new_pset,
boolean_t assign_threads);
extern kern_return_t task_assign_default(
task_t task,
boolean_t assign_threads);
/*
* Internal only routines
*/
extern void task_init(void);
extern void task_reference(task_t);
extern void task_deallocate(task_t);
extern kern_return_t task_hold(task_t);
extern kern_return_t task_dowait(task_t, boolean_t);
extern kern_return_t task_release(task_t);
extern task_t kernel_task_create(task_t, vm_size_t);
extern task_t kernel_task;
#endif /* _KERN_TASK_H_ */
|