1 /*
2  * Copyright (c) 2000-2018 Apple 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 /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */
29 /*
30  * Copyright (c) 1982, 1986, 1993
31  *	The Regents of the University of California.  All rights reserved.
32  *
33  * Redistribution and use in source and binary forms, with or without
34  * modification, are permitted provided that the following conditions
35  * are met:
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.
48  *
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
59  * SUCH DAMAGE.
60  *
61  *	@(#)resource.h	8.2 (Berkeley) 1/4/94
62  */
63 
64 #ifndef _SYS_RESOURCE_H_
65 #define _SYS_RESOURCE_H_
66 
67 #include <sys/appleapiopts.h>
68 #include <sys/cdefs.h>
69 #include <sys/_types.h>
70 
71 #if __DARWIN_C_LEVEL >= __DARWIN_C_FULL
72 #include <stdint.h>
73 #endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */
74 
75 #include <Availability.h>
76 
77 /* [XSI] The timeval structure shall be defined as described in
78  * <sys/time.h>
79  */
80 #include <sys/_types/_timeval.h>
81 
82 /* The id_t type shall be defined as described in <sys/types.h> */
83 #include <sys/_types/_id_t.h>
84 
85 
86 /*
87  * Resource limit type (low 63 bits, excluding the sign bit)
88  */
89 typedef __uint64_t      rlim_t;
90 
91 
92 /*****
93  * PRIORITY
94  */
95 
96 /*
97  * Possible values of the first parameter to getpriority()/setpriority(),
98  * used to indicate the type of the second parameter.
99  */
100 #define PRIO_PROCESS    0               /* Second argument is a PID */
101 #define PRIO_PGRP       1               /* Second argument is a GID */
102 #define PRIO_USER       2               /* Second argument is a UID */
103 
104 #if __DARWIN_C_LEVEL >= __DARWIN_C_FULL
105 #define PRIO_DARWIN_THREAD      3               /* Second argument is always 0 (current thread) */
106 #define PRIO_DARWIN_PROCESS     4               /* Second argument is a PID */
107 
108 
109 /*
110  * Range limitations for the value of the third parameter to setpriority().
111  */
112 #define PRIO_MIN        -20
113 #define PRIO_MAX        20
114 
115 /*
116  * use PRIO_DARWIN_BG to set the current thread into "background" state
117  * which lowers CPU, disk IO, and networking priorites until thread terminates
118  * or "background" state is revoked
119  */
120 #define PRIO_DARWIN_BG 0x1000
121 
122 /*
123  * use PRIO_DARWIN_NONUI to restrict a process's ability to make calls to
124  * the GPU. (deprecated)
125  */
126 #define PRIO_DARWIN_NONUI 0x1001
127 
128 #endif  /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */
129 
130 
131 
132 /*****
133  * RESOURCE USAGE
134  */
135 
136 /*
137  * Possible values of the first parameter to getrusage(), used to indicate
138  * the scope of the information to be returned.
139  */
140 #define RUSAGE_SELF     0               /* Current process information */
141 #define RUSAGE_CHILDREN -1              /* Current process' children */
142 
143 /*
144  * A structure representing an accounting of resource utilization.  The
145  * address of an instance of this structure is the second parameter to
146  * getrusage().
147  *
148  * Note: All values other than ru_utime and ru_stime are implementaiton
149  *       defined and subject to change in a future release.  Their use
150  *       is discouraged for standards compliant programs.
151  */
152 struct  rusage {
153 	struct timeval ru_utime;        /* user time used (PL) */
154 	struct timeval ru_stime;        /* system time used (PL) */
155 #if __DARWIN_C_LEVEL < __DARWIN_C_FULL
156 	long    ru_opaque[14];          /* implementation defined */
157 #else
158 	/*
159 	 * Informational aliases for source compatibility with programs
160 	 * that need more information than that provided by standards,
161 	 * and which do not mind being OS-dependent.
162 	 */
163 	long    ru_maxrss;              /* max resident set size (PL) */
164 #define ru_first        ru_ixrss        /* internal: ruadd() range start */
165 	long    ru_ixrss;               /* integral shared memory size (NU) */
166 	long    ru_idrss;               /* integral unshared data (NU)  */
167 	long    ru_isrss;               /* integral unshared stack (NU) */
168 	long    ru_minflt;              /* page reclaims (NU) */
169 	long    ru_majflt;              /* page faults (NU) */
170 	long    ru_nswap;               /* swaps (NU) */
171 	long    ru_inblock;             /* block input operations (atomic) */
172 	long    ru_oublock;             /* block output operations (atomic) */
173 	long    ru_msgsnd;              /* messages sent (atomic) */
174 	long    ru_msgrcv;              /* messages received (atomic) */
175 	long    ru_nsignals;            /* signals received (atomic) */
176 	long    ru_nvcsw;               /* voluntary context switches (atomic) */
177 	long    ru_nivcsw;              /* involuntary " */
178 #define ru_last         ru_nivcsw       /* internal: ruadd() range end */
179 #endif  /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */
180 };
181 
182 #if __DARWIN_C_LEVEL >= __DARWIN_C_FULL
183 /*
184  * Flavors for proc_pid_rusage().
185  */
186 #define RUSAGE_INFO_V0  0
187 #define RUSAGE_INFO_V1  1
188 #define RUSAGE_INFO_V2  2
189 #define RUSAGE_INFO_V3  3
190 #define RUSAGE_INFO_V4  4
191 #define RUSAGE_INFO_V5  5
192 #define RUSAGE_INFO_CURRENT     RUSAGE_INFO_V5
193 
194 /*
195  * Flags for RUSAGE_INFO_V5
196  */
197 #define RU_PROC_RUNS_RESLIDE    0x00000001      /* proc has reslid shared cache */
198 
199 typedef void *rusage_info_t;
200 
201 struct rusage_info_v0 {
202 	uint8_t  ri_uuid[16];
203 	uint64_t ri_user_time;
204 	uint64_t ri_system_time;
205 	uint64_t ri_pkg_idle_wkups;
206 	uint64_t ri_interrupt_wkups;
207 	uint64_t ri_pageins;
208 	uint64_t ri_wired_size;
209 	uint64_t ri_resident_size;
210 	uint64_t ri_phys_footprint;
211 	uint64_t ri_proc_start_abstime;
212 	uint64_t ri_proc_exit_abstime;
213 };
214 
215 struct rusage_info_v1 {
216 	uint8_t  ri_uuid[16];
217 	uint64_t ri_user_time;
218 	uint64_t ri_system_time;
219 	uint64_t ri_pkg_idle_wkups;
220 	uint64_t ri_interrupt_wkups;
221 	uint64_t ri_pageins;
222 	uint64_t ri_wired_size;
223 	uint64_t ri_resident_size;
224 	uint64_t ri_phys_footprint;
225 	uint64_t ri_proc_start_abstime;
226 	uint64_t ri_proc_exit_abstime;
227 	uint64_t ri_child_user_time;
228 	uint64_t ri_child_system_time;
229 	uint64_t ri_child_pkg_idle_wkups;
230 	uint64_t ri_child_interrupt_wkups;
231 	uint64_t ri_child_pageins;
232 	uint64_t ri_child_elapsed_abstime;
233 };
234 
235 struct rusage_info_v2 {
236 	uint8_t  ri_uuid[16];
237 	uint64_t ri_user_time;
238 	uint64_t ri_system_time;
239 	uint64_t ri_pkg_idle_wkups;
240 	uint64_t ri_interrupt_wkups;
241 	uint64_t ri_pageins;
242 	uint64_t ri_wired_size;
243 	uint64_t ri_resident_size;
244 	uint64_t ri_phys_footprint;
245 	uint64_t ri_proc_start_abstime;
246 	uint64_t ri_proc_exit_abstime;
247 	uint64_t ri_child_user_time;
248 	uint64_t ri_child_system_time;
249 	uint64_t ri_child_pkg_idle_wkups;
250 	uint64_t ri_child_interrupt_wkups;
251 	uint64_t ri_child_pageins;
252 	uint64_t ri_child_elapsed_abstime;
253 	uint64_t ri_diskio_bytesread;
254 	uint64_t ri_diskio_byteswritten;
255 };
256 
257 struct rusage_info_v3 {
258 	uint8_t  ri_uuid[16];
259 	uint64_t ri_user_time;
260 	uint64_t ri_system_time;
261 	uint64_t ri_pkg_idle_wkups;
262 	uint64_t ri_interrupt_wkups;
263 	uint64_t ri_pageins;
264 	uint64_t ri_wired_size;
265 	uint64_t ri_resident_size;
266 	uint64_t ri_phys_footprint;
267 	uint64_t ri_proc_start_abstime;
268 	uint64_t ri_proc_exit_abstime;
269 	uint64_t ri_child_user_time;
270 	uint64_t ri_child_system_time;
271 	uint64_t ri_child_pkg_idle_wkups;
272 	uint64_t ri_child_interrupt_wkups;
273 	uint64_t ri_child_pageins;
274 	uint64_t ri_child_elapsed_abstime;
275 	uint64_t ri_diskio_bytesread;
276 	uint64_t ri_diskio_byteswritten;
277 	uint64_t ri_cpu_time_qos_default;
278 	uint64_t ri_cpu_time_qos_maintenance;
279 	uint64_t ri_cpu_time_qos_background;
280 	uint64_t ri_cpu_time_qos_utility;
281 	uint64_t ri_cpu_time_qos_legacy;
282 	uint64_t ri_cpu_time_qos_user_initiated;
283 	uint64_t ri_cpu_time_qos_user_interactive;
284 	uint64_t ri_billed_system_time;
285 	uint64_t ri_serviced_system_time;
286 };
287 
288 struct rusage_info_v4 {
289 	uint8_t  ri_uuid[16];
290 	uint64_t ri_user_time;
291 	uint64_t ri_system_time;
292 	uint64_t ri_pkg_idle_wkups;
293 	uint64_t ri_interrupt_wkups;
294 	uint64_t ri_pageins;
295 	uint64_t ri_wired_size;
296 	uint64_t ri_resident_size;
297 	uint64_t ri_phys_footprint;
298 	uint64_t ri_proc_start_abstime;
299 	uint64_t ri_proc_exit_abstime;
300 	uint64_t ri_child_user_time;
301 	uint64_t ri_child_system_time;
302 	uint64_t ri_child_pkg_idle_wkups;
303 	uint64_t ri_child_interrupt_wkups;
304 	uint64_t ri_child_pageins;
305 	uint64_t ri_child_elapsed_abstime;
306 	uint64_t ri_diskio_bytesread;
307 	uint64_t ri_diskio_byteswritten;
308 	uint64_t ri_cpu_time_qos_default;
309 	uint64_t ri_cpu_time_qos_maintenance;
310 	uint64_t ri_cpu_time_qos_background;
311 	uint64_t ri_cpu_time_qos_utility;
312 	uint64_t ri_cpu_time_qos_legacy;
313 	uint64_t ri_cpu_time_qos_user_initiated;
314 	uint64_t ri_cpu_time_qos_user_interactive;
315 	uint64_t ri_billed_system_time;
316 	uint64_t ri_serviced_system_time;
317 	uint64_t ri_logical_writes;
318 	uint64_t ri_lifetime_max_phys_footprint;
319 	uint64_t ri_instructions;
320 	uint64_t ri_cycles;
321 	uint64_t ri_billed_energy;
322 	uint64_t ri_serviced_energy;
323 	uint64_t ri_interval_max_phys_footprint;
324 	uint64_t ri_runnable_time;
325 };
326 
327 struct rusage_info_v5 {
328 	uint8_t  ri_uuid[16];
329 	uint64_t ri_user_time;
330 	uint64_t ri_system_time;
331 	uint64_t ri_pkg_idle_wkups;
332 	uint64_t ri_interrupt_wkups;
333 	uint64_t ri_pageins;
334 	uint64_t ri_wired_size;
335 	uint64_t ri_resident_size;
336 	uint64_t ri_phys_footprint;
337 	uint64_t ri_proc_start_abstime;
338 	uint64_t ri_proc_exit_abstime;
339 	uint64_t ri_child_user_time;
340 	uint64_t ri_child_system_time;
341 	uint64_t ri_child_pkg_idle_wkups;
342 	uint64_t ri_child_interrupt_wkups;
343 	uint64_t ri_child_pageins;
344 	uint64_t ri_child_elapsed_abstime;
345 	uint64_t ri_diskio_bytesread;
346 	uint64_t ri_diskio_byteswritten;
347 	uint64_t ri_cpu_time_qos_default;
348 	uint64_t ri_cpu_time_qos_maintenance;
349 	uint64_t ri_cpu_time_qos_background;
350 	uint64_t ri_cpu_time_qos_utility;
351 	uint64_t ri_cpu_time_qos_legacy;
352 	uint64_t ri_cpu_time_qos_user_initiated;
353 	uint64_t ri_cpu_time_qos_user_interactive;
354 	uint64_t ri_billed_system_time;
355 	uint64_t ri_serviced_system_time;
356 	uint64_t ri_logical_writes;
357 	uint64_t ri_lifetime_max_phys_footprint;
358 	uint64_t ri_instructions;
359 	uint64_t ri_cycles;
360 	uint64_t ri_billed_energy;
361 	uint64_t ri_serviced_energy;
362 	uint64_t ri_interval_max_phys_footprint;
363 	uint64_t ri_runnable_time;
364 	uint64_t ri_flags;
365 };
366 
367 typedef struct rusage_info_v5 rusage_info_current;
368 
369 #endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */
370 
371 
372 
373 /*****
374  * RESOURCE LIMITS
375  */
376 
377 /*
378  * Symbolic constants for resource limits; since all limits are representable
379  * as a type rlim_t, we are permitted to define RLIM_SAVED_* in terms of
380  * RLIM_INFINITY.
381  */
382 #define RLIM_INFINITY   (((__uint64_t)1 << 63) - 1)     /* no limit */
383 #define RLIM_SAVED_MAX  RLIM_INFINITY   /* Unrepresentable hard limit */
384 #define RLIM_SAVED_CUR  RLIM_INFINITY   /* Unrepresentable soft limit */
385 
386 /*
387  * Possible values of the first parameter to getrlimit()/setrlimit(), to
388  * indicate for which resource the operation is being performed.
389  */
390 #define RLIMIT_CPU      0               /* cpu time per process */
391 #define RLIMIT_FSIZE    1               /* file size */
392 #define RLIMIT_DATA     2               /* data segment size */
393 #define RLIMIT_STACK    3               /* stack size */
394 #define RLIMIT_CORE     4               /* core file size */
395 #define RLIMIT_AS       5               /* address space (resident set size) */
396 #if __DARWIN_C_LEVEL >= __DARWIN_C_FULL
397 #define RLIMIT_RSS      RLIMIT_AS       /* source compatibility alias */
398 #define RLIMIT_MEMLOCK  6               /* locked-in-memory address space */
399 #define RLIMIT_NPROC    7               /* number of processes */
400 #endif  /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */
401 #define RLIMIT_NOFILE   8               /* number of open files */
402 #if __DARWIN_C_LEVEL >= __DARWIN_C_FULL
403 #define RLIM_NLIMITS    9               /* total number of resource limits */
404 #endif  /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */
405 #define _RLIMIT_POSIX_FLAG      0x1000  /* Set bit for strict POSIX */
406 
407 /*
408  * A structure representing a resource limit.  The address of an instance
409  * of this structure is the second parameter to getrlimit()/setrlimit().
410  */
411 struct rlimit {
412 	rlim_t  rlim_cur;               /* current (soft) limit */
413 	rlim_t  rlim_max;               /* maximum value for rlim_cur */
414 };
415 
416 #if __DARWIN_C_LEVEL >= __DARWIN_C_FULL
417 /*
418  * proc_rlimit_control()
419  *
420  * Resource limit flavors
421  */
422 #define RLIMIT_WAKEUPS_MONITOR          0x1 /* Configure the wakeups monitor. */
423 #define RLIMIT_CPU_USAGE_MONITOR        0x2 /* Configure the CPU usage monitor. */
424 #define RLIMIT_THREAD_CPULIMITS         0x3 /* Configure a blocking, per-thread, CPU limits. */
425 #define RLIMIT_FOOTPRINT_INTERVAL       0x4 /* Configure memory footprint interval tracking */
426 
427 /*
428  * Flags for wakeups monitor control.
429  */
430 #define WAKEMON_ENABLE                  0x01
431 #define WAKEMON_DISABLE                 0x02
432 #define WAKEMON_GET_PARAMS              0x04
433 #define WAKEMON_SET_DEFAULTS            0x08
434 #define WAKEMON_MAKE_FATAL              0x10 /* Configure the task so that violations are fatal. */
435 
436 /*
437  * Flags for CPU usage monitor control.
438  */
439 #define CPUMON_MAKE_FATAL               0x1000
440 
441 /*
442  * Flags for memory footprint interval tracking.
443  */
444 #define FOOTPRINT_INTERVAL_RESET        0x1 /* Reset the footprint interval counter to zero */
445 
446 struct proc_rlimit_control_wakeupmon {
447 	uint32_t wm_flags;
448 	int32_t wm_rate;
449 };
450 
451 
452 
453 /* I/O type */
454 #define IOPOL_TYPE_DISK 0
455 #define IOPOL_TYPE_VFS_ATIME_UPDATES 2
456 #define IOPOL_TYPE_VFS_MATERIALIZE_DATALESS_FILES 3
457 #define IOPOL_TYPE_VFS_STATFS_NO_DATA_VOLUME 4
458 #define IOPOL_TYPE_VFS_TRIGGER_RESOLVE 5
459 #define IOPOL_TYPE_VFS_IGNORE_CONTENT_PROTECTION 6
460 #define IOPOL_TYPE_VFS_IGNORE_PERMISSIONS 7
461 #define IOPOL_TYPE_VFS_SKIP_MTIME_UPDATE 8
462 
463 /* scope */
464 #define IOPOL_SCOPE_PROCESS   0
465 #define IOPOL_SCOPE_THREAD    1
466 #define IOPOL_SCOPE_DARWIN_BG 2
467 
468 /* I/O Priority */
469 #define IOPOL_DEFAULT           0
470 #define IOPOL_IMPORTANT         1
471 #define IOPOL_PASSIVE           2
472 #define IOPOL_THROTTLE          3
473 #define IOPOL_UTILITY           4
474 #define IOPOL_STANDARD          5
475 
476 /* compatibility with older names */
477 #define IOPOL_APPLICATION       IOPOL_STANDARD
478 #define IOPOL_NORMAL            IOPOL_IMPORTANT
479 
480 
481 #define IOPOL_ATIME_UPDATES_DEFAULT     0
482 #define IOPOL_ATIME_UPDATES_OFF         1
483 
484 #define IOPOL_MATERIALIZE_DATALESS_FILES_DEFAULT 0
485 #define IOPOL_MATERIALIZE_DATALESS_FILES_OFF     1
486 #define IOPOL_MATERIALIZE_DATALESS_FILES_ON      2
487 
488 #define IOPOL_VFS_STATFS_NO_DATA_VOLUME_DEFAULT 0
489 #define IOPOL_VFS_STATFS_FORCE_NO_DATA_VOLUME   1
490 
491 #define IOPOL_VFS_TRIGGER_RESOLVE_DEFAULT 0
492 #define IOPOL_VFS_TRIGGER_RESOLVE_OFF     1
493 
494 #define IOPOL_VFS_CONTENT_PROTECTION_DEFAULT 0
495 #define IOPOL_VFS_CONTENT_PROTECTION_IGNORE  1
496 
497 #define IOPOL_VFS_IGNORE_PERMISSIONS_OFF 0
498 #define IOPOL_VFS_IGNORE_PERMISSIONS_ON  1
499 
500 #define IOPOL_VFS_SKIP_MTIME_UPDATE_OFF 0
501 #define IOPOL_VFS_SKIP_MTIME_UPDATE_ON 1
502 
503 #endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */
504 
505 
506 __BEGIN_DECLS
507 int     getpriority(int, id_t);
508 #if __DARWIN_C_LEVEL >= __DARWIN_C_FULL
509 int     getiopolicy_np(int, int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
510 #endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */
511 int     getrlimit(int, struct rlimit *) __DARWIN_ALIAS(getrlimit);
512 int     getrusage(int, struct rusage *);
513 int     setpriority(int, id_t, int);
514 #if __DARWIN_C_LEVEL >= __DARWIN_C_FULL
515 int     setiopolicy_np(int, int, int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
516 #endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */
517 int     setrlimit(int, const struct rlimit *) __DARWIN_ALIAS(setrlimit);
518 __END_DECLS
519 
520 #endif  /* !_SYS_RESOURCE_H_ */