1 /* 2 * Copyright (c) 2000-2005, 2015 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28 /* 29 * @OSF_COPYRIGHT@ 30 */ 31 /* 32 * Mach Operating System 33 * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University 34 * All Rights Reserved. 35 * 36 * Permission to use, copy, modify and distribute this software and its 37 * documentation is hereby granted, provided that both the copyright 38 * notice and this permission notice appear in all copies of the 39 * software, derivative works or modified versions, and any portions 40 * thereof, and that both notices appear in supporting documentation. 41 * 42 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 43 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR 44 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 45 * 46 * Carnegie Mellon requests users of this software to return to 47 * 48 * Software Distribution Coordinator or [email protected] 49 * School of Computer Science 50 * Carnegie Mellon University 51 * Pittsburgh PA 15213-3890 52 * 53 * any improvements or extensions that they make and grant Carnegie Mellon 54 * the rights to redistribute these changes. 55 */ 56 /* 57 */ 58 /* 59 * File: mach/thread_info 60 * 61 * Thread information structure and definitions. 62 * 63 * The defintions in this file are exported to the user. The kernel 64 * will translate its internal data structures to these structures 65 * as appropriate. 66 * 67 */ 68 69 #ifndef _MACH_THREAD_INFO_H_ 70 #define _MACH_THREAD_INFO_H_ 71 72 #include <mach/boolean.h> 73 #include <mach/policy.h> 74 #include <mach/time_value.h> 75 #include <mach/message.h> 76 #include <mach/machine/vm_types.h> 77 78 /* 79 * Generic information structure to allow for expansion. 80 */ 81 typedef natural_t thread_flavor_t; 82 typedef integer_t *thread_info_t; /* varying array of int */ 83 84 #define THREAD_INFO_MAX (32) /* maximum array size */ 85 typedef integer_t thread_info_data_t[THREAD_INFO_MAX]; 86 87 /* 88 * Currently defined information. 89 */ 90 #define THREAD_BASIC_INFO 3 /* basic information */ 91 92 struct thread_basic_info { 93 time_value_t user_time; /* user run time */ 94 time_value_t system_time; /* system run time */ 95 integer_t cpu_usage; /* scaled cpu usage percentage */ 96 policy_t policy; /* scheduling policy in effect */ 97 integer_t run_state; /* run state (see below) */ 98 integer_t flags; /* various flags (see below) */ 99 integer_t suspend_count; /* suspend count for thread */ 100 integer_t sleep_time; /* number of seconds that thread 101 * has been sleeping */ 102 }; 103 104 typedef struct thread_basic_info thread_basic_info_data_t; 105 typedef struct thread_basic_info *thread_basic_info_t; 106 #define THREAD_BASIC_INFO_COUNT ((mach_msg_type_number_t) \ 107 (sizeof(thread_basic_info_data_t) / sizeof(natural_t))) 108 109 #define THREAD_IDENTIFIER_INFO 4 /* thread id and other information */ 110 111 struct thread_identifier_info { 112 uint64_t thread_id; /* system-wide unique 64-bit thread id */ 113 uint64_t thread_handle; /* handle to be used by libproc */ 114 uint64_t dispatch_qaddr; /* libdispatch queue address */ 115 }; 116 117 typedef struct thread_identifier_info thread_identifier_info_data_t; 118 typedef struct thread_identifier_info *thread_identifier_info_t; 119 #define THREAD_IDENTIFIER_INFO_COUNT ((mach_msg_type_number_t) \ 120 (sizeof(thread_identifier_info_data_t) / sizeof(natural_t))) 121 122 /* 123 * Scale factor for usage field. 124 */ 125 126 #define TH_USAGE_SCALE 1000 127 128 /* 129 * Thread run states (state field). 130 */ 131 132 #define TH_STATE_RUNNING 1 /* thread is running normally */ 133 #define TH_STATE_STOPPED 2 /* thread is stopped */ 134 #define TH_STATE_WAITING 3 /* thread is waiting normally */ 135 #define TH_STATE_UNINTERRUPTIBLE 4 /* thread is in an uninterruptible 136 * wait */ 137 #define TH_STATE_HALTED 5 /* thread is halted at a 138 * clean point */ 139 140 /* 141 * Thread flags (flags field). 142 */ 143 #define TH_FLAGS_SWAPPED 0x1 /* thread is swapped out */ 144 #define TH_FLAGS_IDLE 0x2 /* thread is an idle thread */ 145 #define TH_FLAGS_GLOBAL_FORCED_IDLE 0x4 /* thread performs global forced idle */ 146 147 /* 148 * Thread extended info (returns same info as proc_pidinfo(...,PROC_PIDTHREADINFO,...) 149 */ 150 #define THREAD_EXTENDED_INFO 5 151 #define MAXTHREADNAMESIZE 64 152 struct thread_extended_info { // same as proc_threadinfo (from proc_info.h) & proc_threadinfo_internal (from bsd_taskinfo.h) 153 uint64_t pth_user_time; /* user run time */ 154 uint64_t pth_system_time; /* system run time */ 155 int32_t pth_cpu_usage; /* scaled cpu usage percentage */ 156 int32_t pth_policy; /* scheduling policy in effect */ 157 int32_t pth_run_state; /* run state (see below) */ 158 int32_t pth_flags; /* various flags (see below) */ 159 int32_t pth_sleep_time; /* number of seconds that thread */ 160 int32_t pth_curpri; /* cur priority*/ 161 int32_t pth_priority; /* priority*/ 162 int32_t pth_maxpriority; /* max priority*/ 163 char pth_name[MAXTHREADNAMESIZE]; /* thread name, if any */ 164 }; 165 typedef struct thread_extended_info thread_extended_info_data_t; 166 typedef struct thread_extended_info * thread_extended_info_t; 167 #define THREAD_EXTENDED_INFO_COUNT ((mach_msg_type_number_t) \ 168 (sizeof(thread_extended_info_data_t) / sizeof (natural_t))) 169 170 #define THREAD_DEBUG_INFO_INTERNAL 6 /* for kernel development internal info */ 171 172 #if PRIVATE 173 struct thread_debug_info_internal { 174 uint64_t page_creation_count; 175 }; 176 177 typedef struct thread_debug_info_internal *thread_debug_info_internal_t; 178 typedef struct thread_debug_info_internal thread_debug_info_internal_data_t; 179 180 #define THREAD_DEBUG_INFO_INTERNAL_COUNT ((mach_msg_type_number_t) \ 181 (sizeof (thread_debug_info_internal_data_t) / sizeof (natural_t))) 182 183 #endif /* PRIVATE */ 184 185 #define IO_NUM_PRIORITIES 4 186 187 #define UPDATE_IO_STATS(info, size) \ 188 { \ 189 info.count++; \ 190 info.size += size; \ 191 } 192 193 #define UPDATE_IO_STATS_ATOMIC(info, io_size) \ 194 { \ 195 OSIncrementAtomic64((SInt64 *)&(info.count)); \ 196 OSAddAtomic64(io_size, (SInt64 *)&(info.size)); \ 197 } 198 199 struct io_stat_entry { 200 uint64_t count; 201 uint64_t size; 202 }; 203 204 struct io_stat_info { 205 struct io_stat_entry disk_reads; 206 struct io_stat_entry io_priority[IO_NUM_PRIORITIES]; 207 struct io_stat_entry paging; 208 struct io_stat_entry metadata; 209 struct io_stat_entry total_io; 210 }; 211 212 typedef struct io_stat_info *io_stat_info_t; 213 214 #if KERNEL_PRIVATE 215 __BEGIN_DECLS 216 void thread_group_join_io_storage(void); 217 void thread_group_join_perf_controller(void); 218 __END_DECLS 219 #endif 220 221 /* 222 * Obsolete interfaces. 223 */ 224 225 #define THREAD_SCHED_TIMESHARE_INFO 10 226 #define THREAD_SCHED_RR_INFO 11 227 #define THREAD_SCHED_FIFO_INFO 12 228 229 #endif /* _MACH_THREAD_INFO_H_ */ 230