|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 21: */ ! 22: /* ! 23: * @OSF_FREE_COPYRIGHT@ ! 24: */ ! 25: /* ! 26: * Mach Operating System ! 27: * Copyright (c) 1991,1990,1989,1988 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: */ ! 52: /* ! 53: * File: task.h ! 54: * Author: Avadis Tevanian, Jr. ! 55: * ! 56: * This file contains the structure definitions for tasks. ! 57: * ! 58: */ ! 59: /* ! 60: * Copyright (c) 1993 The University of Utah and ! 61: * the Computer Systems Laboratory (CSL). All rights reserved. ! 62: * ! 63: * Permission to use, copy, modify and distribute this software and its ! 64: * documentation is hereby granted, provided that both the copyright ! 65: * notice and this permission notice appear in all copies of the ! 66: * software, derivative works or modified versions, and any portions ! 67: * thereof, and that both notices appear in supporting documentation. ! 68: * ! 69: * THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS ! 70: * IS" CONDITION. THE UNIVERSITY OF UTAH AND CSL DISCLAIM ANY LIABILITY OF ! 71: * ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. ! 72: * ! 73: * CSL requests users of this software to return to [email protected] any ! 74: * improvements that they make and grant CSL redistribution rights. ! 75: * ! 76: */ ! 77: ! 78: #ifndef _KERN_TASK_H_ ! 79: #define _KERN_TASK_H_ ! 80: ! 81: #include <kern/kern_types.h> ! 82: #include <mach/mach_types.h> ! 83: #include <vm/pmap.h> ! 84: ! 85: #ifdef MACH_KERNEL_PRIVATE ! 86: #include <mach/boolean.h> ! 87: #include <mach/port.h> ! 88: #include <mach/time_value.h> ! 89: #include <mach/message.h> ! 90: #include <mach/mach_param.h> ! 91: #include <mach/task_info.h> ! 92: #include <mach/exception_types.h> ! 93: #include <mach_prof.h> ! 94: #include <machine/task.h> ! 95: #include <kern/queue.h> ! 96: #include <kern/lock.h> ! 97: #include <kern/syscall_emulation.h> ! 98: #include <norma_task.h> ! 99: #include <mach_host.h> ! 100: #include <fast_tas.h> ! 101: #include <task_swapper.h> ! 102: #include <kern/thread_act.h> ! 103: ! 104: typedef struct task { ! 105: /* Synchronization/destruction information */ ! 106: decl_mutex_data(,lock) /* Task's lock */ ! 107: int ref_count; /* Number of references to me */ ! 108: boolean_t active; /* Task has not been terminated */ ! 109: boolean_t kernel_loaded; /* Created with kernel_task_create() */ ! 110: ! 111: /* Miscellaneous */ ! 112: vm_map_t map; /* Address space description */ ! 113: queue_chain_t pset_tasks; /* list of tasks assigned to pset */ ! 114: void *user_data; /* Arbitrary data settable via IPC */ ! 115: int suspend_count; /* Internal scheduling only */ ! 116: ! 117: #if TASK_SWAPPER ! 118: /* Task swapper data */ ! 119: unsigned short swap_state; /* swap state (e.g. IN/OUT) */ ! 120: unsigned short swap_flags; /* swap flags (e.g. MAKE_UNSWAPP) */ ! 121: unsigned int swap_stamp; /* when last swapped */ ! 122: unsigned long swap_rss; /* size (pages) when last swapped */ ! 123: int swap_ast_waiting; /* number of threads that have not */ ! 124: /* reached a clean point and halted */ ! 125: int swap_nswap; /* number of times this task swapped */ ! 126: queue_chain_t swapped_tasks; /* list of non-resident tasks */ ! 127: #endif /* TASK_SWAPPER */ ! 128: ! 129: /* Active activations in this task */ ! 130: int thr_act_count; ! 131: queue_head_t thr_acts; /* list of thread_activations */ ! 132: int res_act_count; ! 133: mutex_t act_list_lock; /* XXX act_list lock */ ! 134: ! 135: processor_set_t processor_set; /* processor set for new threads */ ! 136: #if MACH_HOST ! 137: boolean_t may_assign; /* can assigned pset be changed? */ ! 138: boolean_t assign_active; /* waiting for may_assign */ ! 139: #endif /* MACH_HOST */ ! 140: ! 141: /* User-visible scheduling information */ ! 142: int user_stop_count; /* outstanding stops */ ! 143: /*** ??? should `user_stop_count' be moved, too? ***/ ! 144: int policy; /* scheduling policy */ ! 145: sp_attributes_t sp_attributes; /* ptr to sched parameters */ ! 146: ! 147: /* Task security token */ ! 148: security_token_t sec_token; ! 149: ! 150: /* Statistics */ ! 151: time_value_t total_user_time; ! 152: /* total user time for dead threads */ ! 153: time_value_t total_system_time; ! 154: /* total system time for dead threads */ ! 155: ! 156: #if MACH_PROF ! 157: boolean_t task_profiled; /* is task being profiled ? */ ! 158: struct prof_data *profil_buffer;/* profile struct if so */ ! 159: #endif /* MACH_PROF */ ! 160: ! 161: /* IPC structures */ ! 162: decl_mutex_data(,itk_lock_data) ! 163: struct ipc_port *itk_self; /* not a right, doesn't hold ref */ ! 164: struct ipc_port *itk_sself; /* a send right */ ! 165: struct exception_action exc_actions[EXC_TYPES_COUNT]; ! 166: /* a send right each valid element */ ! 167: struct ipc_port *itk_bootstrap; /* a send right */ ! 168: struct ipc_port *itk_registered[TASK_PORT_REGISTER_MAX]; ! 169: /* all send rights */ ! 170: ! 171: struct ipc_space *itk_space; ! 172: ! 173: /* RPC subsystem information */ ! 174: queue_head_t subsystem_list; /* list of subsystems */ ! 175: int subsystem_count;/* number of subsystems */ ! 176: ! 177: /* Synchronizer ownership information */ ! 178: queue_head_t semaphore_list; /* list of owned semaphores */ ! 179: queue_head_t lock_set_list; /* list of owned lock sets */ ! 180: int semaphores_owned; /* number of semaphores owned */ ! 181: int lock_sets_owned; /* number of lock sets owned */ ! 182: ! 183: /* User space system call emulation support */ ! 184: struct eml_dispatch *eml_dispatch; ! 185: ! 186: /* Ledgers */ ! 187: struct ipc_port *wired_ledger_port; ! 188: struct ipc_port *paged_ledger_port; ! 189: ! 190: #if NORMA_TASK ! 191: long child_node; /* if != -1, node for new children */ ! 192: #endif /* NORMA_TASK */ ! 193: #if FAST_TAS ! 194: vm_offset_t fast_tas_base; ! 195: vm_offset_t fast_tas_end; ! 196: #endif /* FAST_TAS */ ! 197: MACHINE_TASK ! 198: integer_t faults; /* faults counter */ ! 199: integer_t pageins; /* pageins counter */ ! 200: integer_t cow_faults; /* copy on write fault counter */ ! 201: integer_t messages_sent; /* messages sent counter */ ! 202: integer_t messages_received; /* messages received counter */ ! 203: integer_t syscalls_mach; /* mach system call counter */ ! 204: integer_t syscalls_unix; /* unix system call counter */ ! 205: integer_t csw; /* context switch counter */ ! 206: #ifdef MACH_BSD ! 207: void *bsd_info; ! 208: #endif ! 209: } Task; ! 210: ! 211: ! 212: #define task_lock(task) mutex_lock(&(task)->lock) ! 213: #define task_lock_try(task) mutex_try(&(task)->lock) ! 214: #define task_unlock(task) mutex_unlock(&(task)->lock) ! 215: ! 216: #define itk_lock_init(task) mutex_init(&(task)->itk_lock_data, \ ! 217: ETAP_THREAD_TASK_ITK) ! 218: #define itk_lock(task) mutex_lock(&(task)->itk_lock_data) ! 219: #define itk_unlock(task) mutex_unlock(&(task)->itk_lock_data) ! 220: ! 221: /* ! 222: * Internal only routines ! 223: */ ! 224: ! 225: /* Initialize task module */ ! 226: extern void task_init(void); ! 227: ! 228: /* task create */ ! 229: extern kern_return_t task_create_local( ! 230: task_t parent_task, ! 231: boolean_t inherit_memory, ! 232: boolean_t kernel_loaded, ! 233: task_t *child_task); /* OUT */ ! 234: ! 235: /* Set tasks max priority (does not affect threads within task) */ ! 236: extern kern_return_t task_max_priority( ! 237: task_t task, ! 238: processor_set_t pset, ! 239: int max_priority); ! 240: ! 241: #if MACH_HOST ! 242: /* Freeze and unfreeze task from being reassigned processor sets */ ! 243: extern void task_freeze( ! 244: task_t task); ! 245: ! 246: extern void task_unfreeze( ! 247: task_t task); ! 248: #endif /* MACH_HOST */ ! 249: ! 250: extern void consider_task_collect(void); ! 251: ! 252: #define current_task_fast() (current_act_fast()->task) ! 253: #define current_task() current_task_fast() ! 254: ! 255: #else /* !MACH_KERNEL_PRIVATE */ ! 256: ! 257: extern task_t current_task(void); ! 258: ! 259: #endif /* !MACH_KERNEL_PRIVATE */ ! 260: ! 261: extern task_t kernel_task; ! 262: extern boolean_t is_kerneltask(task_t); ! 263: ! 264: /* Stop all other threads in a task */ ! 265: extern kern_return_t task_halt( ! 266: task_t task); ! 267: ! 268: /* Take reference on task (make sure it doesn't go away) */ ! 269: extern void task_reference(task_t task); ! 270: ! 271: /* Remove reference to task */ ! 272: extern void task_deallocate(task_t task); ! 273: ! 274: /* JMM - should just be temporary (implementation in bsd_kern still) */ ! 275: extern void *get_bsdtask_info(task_t); ! 276: extern void set_bsdtask_info(task_t,void *); ! 277: extern vm_map_t get_task_map(task_t); ! 278: extern void set_task_map(task_t, vm_map_t); ! 279: extern pmap_t get_task_pmap(task_t); ! 280: #endif /* _KERN_TASK_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.