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 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
|
/*
* 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 <mach_debug/mach_debug_types.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_types.h>
#include <machine/task.h>
/*
* Task name buffer size. The size is chosen so that struct task fits
* into three cache lines. The size of a cache line on a typical CPU
* is 64 bytes.
*/
#define TASK_NAME_SIZE 32
struct task {
/* Synchronization/destruction information */
decl_simple_lock_data(,lock) /* Task's lock */
int ref_count; /* Number of references to me */
/* Flags */
unsigned int active:1, /* Task has not been terminated */
/* boolean_t */ may_assign:1, /* can assigned pset be changed? */
assign_active:1; /* waiting for may_assign */
/* 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 */
/* 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 */
/* Hardware specific data. */
machine_task_t machine;
/* Statistics */
natural_t faults; /* page faults counter */
natural_t zero_fills; /* zero fill pages counter */
natural_t reactivations; /* reactivated pages counter */
natural_t pageins; /* actual pageins couter */
natural_t cow_faults; /* copy-on-write faults counter */
natural_t messages_sent; /* messages sent counter */
natural_t messages_received; /* messages received counter */
char name[TASK_NAME_SIZE];
};
#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_create_kernel(
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);
extern kern_return_t task_set_name(
task_t task,
kernel_debug_name_t name);
extern void consider_task_collect(void);
/*
* Internal only routines
*/
extern void task_init(void);
extern void task_reference(task_t);
extern void task_deallocate(task_t);
extern void task_hold_locked(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;
#endif /* _KERN_TASK_H_ */
|