2  * Copyright (c) 2000-2008 Apple Inc. All rights reserved. 
   4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 
   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. 
  15  * Please obtain a copy of the License at 
  16  * http://www.opensource.apple.com/apsl/ and read it before using this file. 
  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. 
  26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 
  28 /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */ 
  30  * Copyright (c) 1982, 1986, 1993 
  31  *      The Regents of the University of California.  All rights reserved. 
  33  * Redistribution and use in source and binary forms, with or without 
  34  * modification, are permitted provided that the following conditions 
  36  * 1. Redistributions of source code must retain the above copyright 
  37  *    notice, this list of conditions and the following disclaimer. 
  38  * 2. Redistributions in binary form must reproduce the above copyright 
  39  *    notice, this list of conditions and the following disclaimer in the 
  40  *    documentation and/or other materials provided with the distribution. 
  41  * 3. All advertising materials mentioning features or use of this software 
  42  *    must display the following acknowledgement: 
  43  *      This product includes software developed by the University of 
  44  *      California, Berkeley and its contributors. 
  45  * 4. Neither the name of the University nor the names of its contributors 
  46  *    may be used to endorse or promote products derived from this software 
  47  *    without specific prior written permission. 
  49  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 
  50  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
  51  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
  52  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 
  53  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
  54  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
  55  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
  56  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
  57  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
  58  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
  61  *      @(#)resource.h  8.2 (Berkeley) 1/4/94 
  64 #ifndef _SYS_RESOURCE_H_ 
  65 #define _SYS_RESOURCE_H_ 
  67 #include <sys/appleapiopts.h> 
  68 #include <sys/cdefs.h> 
  69 #include <sys/_types.h> 
  71 #if __DARWIN_C_LEVEL >= __DARWIN_C_FULL 
  73 #endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ 
  76 #include <Availability.h> 
  79 /* [XSI] The timeval structure shall be defined as described in 
  82 #include <sys/_types/_timeval.h> 
  84 #include <sys/_types/_user32_timeval.h> 
  85 #include <sys/_types/_user64_timeval.h> 
  88 /* The id_t type shall be defined as described in <sys/types.h> */ 
  89 #include <sys/_types/_id_t.h> 
  93  * Resource limit type (low 63 bits, excluding the sign bit) 
  95 typedef __uint64_t      rlim_t
; 
 103  * Possible values of the first parameter to getpriority()/setpriority(), 
 104  * used to indicate the type of the second parameter. 
 106 #define PRIO_PROCESS    0               /* Second argument is a PID */ 
 107 #define PRIO_PGRP       1               /* Second argument is a GID */ 
 108 #define PRIO_USER       2               /* Second argument is a UID */ 
 110 #if __DARWIN_C_LEVEL >= __DARWIN_C_FULL 
 111 #define PRIO_DARWIN_THREAD      3               /* Second argument is always 0 (current thread) */ 
 112 #define PRIO_DARWIN_PROCESS     4               /* Second argument is a PID */ 
 116 #define PRIO_DARWIN_GPU         5               /* Second argument is a PID */ 
 118 #define PRIO_DARWIN_GPU_ALLOW   0x1 
 119 #define PRIO_DARWIN_GPU_DENY    0x2 
 121 #define PRIO_DARWIN_ROLE        6               /* Second argument is a PID */ 
 123 #define PRIO_DARWIN_ROLE_DEFAULT        0x0     /* Reset to default state */ 
 124 #define PRIO_DARWIN_ROLE_UI_FOCAL       0x1     /* On  screen,     focal UI */ 
 125 #define PRIO_DARWIN_ROLE_UI             0x2     /* On  screen UI,  focal unknown */ 
 126 #define PRIO_DARWIN_ROLE_NON_UI         0x3     /* Off screen, non-focal UI */ 
 127 #define PRIO_DARWIN_ROLE_UI_NON_FOCAL   0x4     /* On  screen, non-focal UI */ 
 128 #define PRIO_DARWIN_ROLE_TAL_LAUNCH     0x5     /* Throttled-launch (for OS X TAL resume) */ 
 133  * Range limitations for the value of the third parameter to setpriority(). 
 139  * use PRIO_DARWIN_BG to set the current thread into "background" state 
 140  * which lowers CPU, disk IO, and networking priorites until thread terminates 
 141  * or "background" state is revoked 
 143 #define PRIO_DARWIN_BG 0x1000 
 146  * use PRIO_DARWIN_NONUI to restrict a process's ability to make calls to 
 147  * the GPU. (deprecated) 
 149 #define PRIO_DARWIN_NONUI 0x1001 
 151 #endif  /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ 
 160  * Possible values of the first parameter to getrusage(), used to indicate 
 161  * the scope of the information to be returned. 
 163 #define RUSAGE_SELF     0               /* Current process information */ 
 164 #define RUSAGE_CHILDREN -1              /* Current process' children */ 
 167  * A structure representing an accounting of resource utilization.  The 
 168  * address of an instance of this structure is the second parameter to 
 171  * Note: All values other than ru_utime and ru_stime are implementaiton 
 172  *       defined and subject to change in a future release.  Their use 
 173  *       is discouraged for standards compliant programs. 
 176         struct timeval ru_utime
;        /* user time used (PL) */ 
 177         struct timeval ru_stime
;        /* system time used (PL) */ 
 178 #if __DARWIN_C_LEVEL < __DARWIN_C_FULL 
 179         long    ru_opaque
[14];          /* implementation defined */ 
 182          * Informational aliases for source compatibility with programs 
 183          * that need more information than that provided by standards, 
 184          * and which do not mind being OS-dependent. 
 186         long    ru_maxrss
;              /* max resident set size (PL) */ 
 187 #define ru_first        ru_ixrss        /* internal: ruadd() range start */ 
 188         long    ru_ixrss
;               /* integral shared memory size (NU) */ 
 189         long    ru_idrss
;               /* integral unshared data (NU)  */ 
 190         long    ru_isrss
;               /* integral unshared stack (NU) */ 
 191         long    ru_minflt
;              /* page reclaims (NU) */ 
 192         long    ru_majflt
;              /* page faults (NU) */ 
 193         long    ru_nswap
;               /* swaps (NU) */ 
 194         long    ru_inblock
;             /* block input operations (atomic) */ 
 195         long    ru_oublock
;             /* block output operations (atomic) */ 
 196         long    ru_msgsnd
;              /* messages sent (atomic) */ 
 197         long    ru_msgrcv
;              /* messages received (atomic) */ 
 198         long    ru_nsignals
;            /* signals received (atomic) */ 
 199         long    ru_nvcsw
;               /* voluntary context switches (atomic) */ 
 200         long    ru_nivcsw
;              /* involuntary " */ 
 201 #define ru_last         ru_nivcsw       /* internal: ruadd() range end */ 
 202 #endif  /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ 
 205 #if __DARWIN_C_LEVEL >= __DARWIN_C_FULL 
 207  * Flavors for proc_pid_rusage(). 
 209 #define RUSAGE_INFO_V0  0 
 210 #define RUSAGE_INFO_V1  1 
 211 #define RUSAGE_INFO_V2  2 
 212 #define RUSAGE_INFO_V3  3 
 213 #define RUSAGE_INFO_CURRENT RUSAGE_INFO_V3 
 215 typedef void *rusage_info_t
; 
 217 struct rusage_info_v0 
{ 
 219         uint64_t ri_user_time
; 
 220         uint64_t ri_system_time
; 
 221         uint64_t ri_pkg_idle_wkups
; 
 222         uint64_t ri_interrupt_wkups
; 
 224         uint64_t ri_wired_size
; 
 225         uint64_t ri_resident_size
;       
 226         uint64_t ri_phys_footprint
; 
 227         uint64_t ri_proc_start_abstime
; 
 228         uint64_t ri_proc_exit_abstime
; 
 231 struct rusage_info_v1 
{ 
 233         uint64_t ri_user_time
; 
 234         uint64_t ri_system_time
; 
 235         uint64_t ri_pkg_idle_wkups
; 
 236         uint64_t ri_interrupt_wkups
; 
 238         uint64_t ri_wired_size
; 
 239         uint64_t ri_resident_size
;       
 240         uint64_t ri_phys_footprint
; 
 241         uint64_t ri_proc_start_abstime
; 
 242         uint64_t ri_proc_exit_abstime
; 
 243         uint64_t ri_child_user_time
; 
 244         uint64_t ri_child_system_time
; 
 245         uint64_t ri_child_pkg_idle_wkups
; 
 246         uint64_t ri_child_interrupt_wkups
; 
 247         uint64_t ri_child_pageins
; 
 248         uint64_t ri_child_elapsed_abstime
; 
 251 struct rusage_info_v2 
{ 
 253         uint64_t ri_user_time
; 
 254         uint64_t ri_system_time
; 
 255         uint64_t ri_pkg_idle_wkups
; 
 256         uint64_t ri_interrupt_wkups
; 
 258         uint64_t ri_wired_size
; 
 259         uint64_t ri_resident_size
;       
 260         uint64_t ri_phys_footprint
; 
 261         uint64_t ri_proc_start_abstime
; 
 262         uint64_t ri_proc_exit_abstime
; 
 263         uint64_t ri_child_user_time
; 
 264         uint64_t ri_child_system_time
; 
 265         uint64_t ri_child_pkg_idle_wkups
; 
 266         uint64_t ri_child_interrupt_wkups
; 
 267         uint64_t ri_child_pageins
; 
 268         uint64_t ri_child_elapsed_abstime
; 
 269         uint64_t ri_diskio_bytesread
; 
 270         uint64_t ri_diskio_byteswritten
; 
 273 struct rusage_info_v3 
{ 
 275         uint64_t ri_user_time
; 
 276         uint64_t ri_system_time
; 
 277         uint64_t ri_pkg_idle_wkups
; 
 278         uint64_t ri_interrupt_wkups
; 
 280         uint64_t ri_wired_size
; 
 281         uint64_t ri_resident_size
;       
 282         uint64_t ri_phys_footprint
; 
 283         uint64_t ri_proc_start_abstime
; 
 284         uint64_t ri_proc_exit_abstime
; 
 285         uint64_t ri_child_user_time
; 
 286         uint64_t ri_child_system_time
; 
 287         uint64_t ri_child_pkg_idle_wkups
; 
 288         uint64_t ri_child_interrupt_wkups
; 
 289         uint64_t ri_child_pageins
; 
 290         uint64_t ri_child_elapsed_abstime
; 
 291         uint64_t ri_diskio_bytesread
; 
 292         uint64_t ri_diskio_byteswritten
; 
 293         uint64_t ri_cpu_time_qos_default
; 
 294         uint64_t ri_cpu_time_qos_maintenance
; 
 295         uint64_t ri_cpu_time_qos_background
; 
 296         uint64_t ri_cpu_time_qos_utility
; 
 297         uint64_t ri_cpu_time_qos_legacy
; 
 298         uint64_t ri_cpu_time_qos_user_initiated
; 
 299         uint64_t ri_cpu_time_qos_user_interactive
; 
 300         uint64_t ri_billed_system_time
; 
 301         uint64_t ri_serviced_system_time
; 
 304 typedef struct rusage_info_v3 rusage_info_current
; 
 306 #endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ 
 310 struct rusage_superset 
{ 
 312         rusage_info_current     ri
; 
 315 struct rusage_info_child 
{ 
 316         uint64_t ri_child_user_time
; 
 317         uint64_t ri_child_system_time
; 
 318         uint64_t ri_child_pkg_idle_wkups
; 
 319         uint64_t ri_child_interrupt_wkups
; 
 320         uint64_t ri_child_pageins
; 
 321         uint64_t ri_child_elapsed_abstime
; 
 324 struct  user64_rusage 
{ 
 325         struct user64_timeval ru_utime
; /* user time used */ 
 326         struct user64_timeval ru_stime
; /* system time used */ 
 327         user64_long_t   ru_maxrss
;              /* max resident set size */ 
 328         user64_long_t   ru_ixrss
;               /* integral shared memory size */ 
 329         user64_long_t   ru_idrss
;               /* integral unshared data " */ 
 330         user64_long_t   ru_isrss
;               /* integral unshared stack " */ 
 331         user64_long_t   ru_minflt
;              /* page reclaims */ 
 332         user64_long_t   ru_majflt
;              /* page faults */ 
 333         user64_long_t   ru_nswap
;               /* swaps */ 
 334         user64_long_t   ru_inblock
;             /* block input operations */ 
 335         user64_long_t   ru_oublock
;             /* block output operations */ 
 336         user64_long_t   ru_msgsnd
;              /* messages sent */ 
 337         user64_long_t   ru_msgrcv
;              /* messages received */ 
 338         user64_long_t   ru_nsignals
;    /* signals received */ 
 339         user64_long_t   ru_nvcsw
;               /* voluntary context switches */ 
 340         user64_long_t   ru_nivcsw
;              /* involuntary " */ 
 343 struct  user32_rusage 
{ 
 344         struct user32_timeval ru_utime
; /* user time used */ 
 345         struct user32_timeval ru_stime
; /* system time used */ 
 346         user32_long_t   ru_maxrss
;              /* max resident set size */ 
 347         user32_long_t   ru_ixrss
;               /* integral shared memory size */ 
 348         user32_long_t   ru_idrss
;               /* integral unshared data " */ 
 349         user32_long_t   ru_isrss
;               /* integral unshared stack " */ 
 350         user32_long_t   ru_minflt
;              /* page reclaims */ 
 351         user32_long_t   ru_majflt
;              /* page faults */ 
 352         user32_long_t   ru_nswap
;               /* swaps */ 
 353         user32_long_t   ru_inblock
;             /* block input operations */ 
 354         user32_long_t   ru_oublock
;             /* block output operations */ 
 355         user32_long_t   ru_msgsnd
;              /* messages sent */ 
 356         user32_long_t   ru_msgrcv
;              /* messages received */ 
 357         user32_long_t   ru_nsignals
;    /* signals received */ 
 358         user32_long_t   ru_nvcsw
;               /* voluntary context switches */ 
 359         user32_long_t   ru_nivcsw
;              /* involuntary " */ 
 370  * Symbolic constants for resource limits; since all limits are representable 
 371  * as a type rlim_t, we are permitted to define RLIM_SAVED_* in terms of 
 374 #define RLIM_INFINITY   (((__uint64_t)1 << 63) - 1)     /* no limit */ 
 375 #define RLIM_SAVED_MAX  RLIM_INFINITY   /* Unrepresentable hard limit */ 
 376 #define RLIM_SAVED_CUR  RLIM_INFINITY   /* Unrepresentable soft limit */ 
 379  * Possible values of the first parameter to getrlimit()/setrlimit(), to 
 380  * indicate for which resource the operation is being performed. 
 382 #define RLIMIT_CPU      0               /* cpu time per process */ 
 383 #define RLIMIT_FSIZE    1               /* file size */ 
 384 #define RLIMIT_DATA     2               /* data segment size */ 
 385 #define RLIMIT_STACK    3               /* stack size */ 
 386 #define RLIMIT_CORE     4               /* core file size */ 
 387 #define RLIMIT_AS       5               /* address space (resident set size) */ 
 388 #if __DARWIN_C_LEVEL >= __DARWIN_C_FULL 
 389 #define RLIMIT_RSS      RLIMIT_AS       /* source compatibility alias */ 
 390 #define RLIMIT_MEMLOCK  6               /* locked-in-memory address space */ 
 391 #define RLIMIT_NPROC    7               /* number of processes */ 
 392 #endif  /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ 
 393 #define RLIMIT_NOFILE   8               /* number of open files */ 
 394 #if __DARWIN_C_LEVEL >= __DARWIN_C_FULL 
 395 #define RLIM_NLIMITS    9               /* total number of resource limits */ 
 396 #endif  /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ 
 397 #define _RLIMIT_POSIX_FLAG      0x1000  /* Set bit for strict POSIX */ 
 400  * A structure representing a resource limit.  The address of an instance 
 401  * of this structure is the second parameter to getrlimit()/setrlimit(). 
 404         rlim_t  rlim_cur
;               /* current (soft) limit */ 
 405         rlim_t  rlim_max
;               /* maximum value for rlim_cur */ 
 408 #if __DARWIN_C_LEVEL >= __DARWIN_C_FULL 
 410  * proc_rlimit_control() 
 412  * Resource limit flavors 
 414 #define RLIMIT_WAKEUPS_MONITOR          0x1 /* Configure the wakeups monitor. */ 
 415 #define RLIMIT_CPU_USAGE_MONITOR        0x2 /* Configure the CPU usage monitor. */ 
 416 #define RLIMIT_THREAD_CPULIMITS         0x3 /* Configure a blocking, per-thread, CPU limits. */ 
 419  * Flags for wakeups monitor control. 
 421 #define WAKEMON_ENABLE                  0x01 
 422 #define WAKEMON_DISABLE                 0x02 
 423 #define WAKEMON_GET_PARAMS              0x04 
 424 #define WAKEMON_SET_DEFAULTS            0x08 
 425 #define WAKEMON_MAKE_FATAL              0x10 /* Configure the task so that violations are fatal. */ 
 427  * Flags for CPU usage monitor control. 
 429 #define CPUMON_MAKE_FATAL               0x1000 
 431 struct proc_rlimit_control_wakeupmon 
{ 
 438  * Flags for I/O monitor control. 
 440 #define IOMON_ENABLE                    0x01 
 441 #define IOMON_DISABLE                   0x02 
 447 #define IOPOL_TYPE_DISK 0 
 449 #define IOPOL_TYPE_VFS_HFS_CASE_SENSITIVITY 1 
 453 #define IOPOL_SCOPE_PROCESS   0 
 454 #define IOPOL_SCOPE_THREAD    1 
 455 #define IOPOL_SCOPE_DARWIN_BG 2 
 458 #define IOPOL_DEFAULT           0 
 459 #define IOPOL_IMPORTANT         1 
 460 #define IOPOL_PASSIVE           2 
 461 #define IOPOL_THROTTLE          3 
 462 #define IOPOL_UTILITY           4 
 463 #define IOPOL_STANDARD          5 
 465 /* compatibility with older names */ 
 466 #define IOPOL_APPLICATION       IOPOL_STANDARD 
 467 #define IOPOL_NORMAL            IOPOL_IMPORTANT 
 470 #define IOPOL_VFS_HFS_CASE_SENSITIVITY_DEFAULT  0 
 471 #define IOPOL_VFS_HFS_CASE_SENSITIVITY_FORCE_CASE_SENSITIVE     1 
 476  * Structures for use in communicating via iopolicysys() between Libc and the 
 477  * kernel.  Not to be used by user programs directly. 
 481  * the command to iopolicysys() 
 483 #define IOPOL_CMD_GET           0x00000001      /* Get I/O policy */ 
 484 #define IOPOL_CMD_SET           0x00000002      /* Set I/O policy */ 
 487  * Second parameter to iopolicysys() 
 489 struct _iopol_param_t 
{ 
 490         int iop_scope
;  /* current process or a thread */ 
 496 #endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ 
 501 int     getpriority(int, id_t
); 
 502 #if __DARWIN_C_LEVEL >= __DARWIN_C_FULL 
 503 int     getiopolicy_np(int, int) __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
); 
 504 #endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ 
 505 int     getrlimit(int, struct rlimit 
*) __DARWIN_ALIAS(getrlimit
); 
 506 int     getrusage(int, struct rusage 
*); 
 507 int     setpriority(int, id_t
, int); 
 508 #if __DARWIN_C_LEVEL >= __DARWIN_C_FULL 
 509 int     setiopolicy_np(int, int, int) __OSX_AVAILABLE_STARTING(__MAC_10_5
, __IPHONE_2_0
); 
 510 #endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ 
 511 int     setrlimit(int, const struct rlimit 
*) __DARWIN_ALIAS(setrlimit
); 
 515 #endif  /* !_SYS_RESOURCE_H_ */