+#define RUSAGE_INFO_V0 0
+#define RUSAGE_INFO_V1 1
+#define RUSAGE_INFO_V2 2
+#define RUSAGE_INFO_V3 3
+#define RUSAGE_INFO_V4 4
+#define RUSAGE_INFO_CURRENT RUSAGE_INFO_V4
+
+typedef void *rusage_info_t;
+
+struct rusage_info_v0 {
+ uint8_t ri_uuid[16];
+ uint64_t ri_user_time;
+ uint64_t ri_system_time;
+ uint64_t ri_pkg_idle_wkups;
+ uint64_t ri_interrupt_wkups;
+ uint64_t ri_pageins;
+ uint64_t ri_wired_size;
+ uint64_t ri_resident_size;
+ uint64_t ri_phys_footprint;
+ uint64_t ri_proc_start_abstime;
+ uint64_t ri_proc_exit_abstime;
+};
+
+struct rusage_info_v1 {
+ uint8_t ri_uuid[16];
+ uint64_t ri_user_time;
+ uint64_t ri_system_time;
+ uint64_t ri_pkg_idle_wkups;
+ uint64_t ri_interrupt_wkups;
+ uint64_t ri_pageins;
+ uint64_t ri_wired_size;
+ uint64_t ri_resident_size;
+ uint64_t ri_phys_footprint;
+ uint64_t ri_proc_start_abstime;
+ uint64_t ri_proc_exit_abstime;
+ uint64_t ri_child_user_time;
+ uint64_t ri_child_system_time;
+ uint64_t ri_child_pkg_idle_wkups;
+ uint64_t ri_child_interrupt_wkups;
+ uint64_t ri_child_pageins;
+ uint64_t ri_child_elapsed_abstime;
+};
+
+struct rusage_info_v2 {
+ uint8_t ri_uuid[16];
+ uint64_t ri_user_time;
+ uint64_t ri_system_time;
+ uint64_t ri_pkg_idle_wkups;
+ uint64_t ri_interrupt_wkups;
+ uint64_t ri_pageins;
+ uint64_t ri_wired_size;
+ uint64_t ri_resident_size;
+ uint64_t ri_phys_footprint;
+ uint64_t ri_proc_start_abstime;
+ uint64_t ri_proc_exit_abstime;
+ uint64_t ri_child_user_time;
+ uint64_t ri_child_system_time;
+ uint64_t ri_child_pkg_idle_wkups;
+ uint64_t ri_child_interrupt_wkups;
+ uint64_t ri_child_pageins;
+ uint64_t ri_child_elapsed_abstime;
+ uint64_t ri_diskio_bytesread;
+ uint64_t ri_diskio_byteswritten;
+};
+
+struct rusage_info_v3 {
+ uint8_t ri_uuid[16];
+ uint64_t ri_user_time;
+ uint64_t ri_system_time;
+ uint64_t ri_pkg_idle_wkups;
+ uint64_t ri_interrupt_wkups;
+ uint64_t ri_pageins;
+ uint64_t ri_wired_size;
+ uint64_t ri_resident_size;
+ uint64_t ri_phys_footprint;
+ uint64_t ri_proc_start_abstime;
+ uint64_t ri_proc_exit_abstime;
+ uint64_t ri_child_user_time;
+ uint64_t ri_child_system_time;
+ uint64_t ri_child_pkg_idle_wkups;
+ uint64_t ri_child_interrupt_wkups;
+ uint64_t ri_child_pageins;
+ uint64_t ri_child_elapsed_abstime;
+ uint64_t ri_diskio_bytesread;
+ uint64_t ri_diskio_byteswritten;
+ uint64_t ri_cpu_time_qos_default;
+ uint64_t ri_cpu_time_qos_maintenance;
+ uint64_t ri_cpu_time_qos_background;
+ uint64_t ri_cpu_time_qos_utility;
+ uint64_t ri_cpu_time_qos_legacy;
+ uint64_t ri_cpu_time_qos_user_initiated;
+ uint64_t ri_cpu_time_qos_user_interactive;
+ uint64_t ri_billed_system_time;
+ uint64_t ri_serviced_system_time;
+};
+
+struct rusage_info_v4 {
+ uint8_t ri_uuid[16];
+ uint64_t ri_user_time;
+ uint64_t ri_system_time;
+ uint64_t ri_pkg_idle_wkups;
+ uint64_t ri_interrupt_wkups;
+ uint64_t ri_pageins;
+ uint64_t ri_wired_size;
+ uint64_t ri_resident_size;
+ uint64_t ri_phys_footprint;
+ uint64_t ri_proc_start_abstime;
+ uint64_t ri_proc_exit_abstime;
+ uint64_t ri_child_user_time;
+ uint64_t ri_child_system_time;
+ uint64_t ri_child_pkg_idle_wkups;
+ uint64_t ri_child_interrupt_wkups;
+ uint64_t ri_child_pageins;
+ uint64_t ri_child_elapsed_abstime;
+ uint64_t ri_diskio_bytesread;
+ uint64_t ri_diskio_byteswritten;
+ uint64_t ri_cpu_time_qos_default;
+ uint64_t ri_cpu_time_qos_maintenance;
+ uint64_t ri_cpu_time_qos_background;
+ uint64_t ri_cpu_time_qos_utility;
+ uint64_t ri_cpu_time_qos_legacy;
+ uint64_t ri_cpu_time_qos_user_initiated;
+ uint64_t ri_cpu_time_qos_user_interactive;
+ uint64_t ri_billed_system_time;
+ uint64_t ri_serviced_system_time;
+ uint64_t ri_logical_writes;
+ uint64_t ri_lifetime_max_phys_footprint;
+ uint64_t ri_instructions;
+ uint64_t ri_cycles;
+ uint64_t ri_billed_energy;
+ uint64_t ri_serviced_energy;
+ // We're reserving 2 counters for future extension
+ uint64_t ri_unused[2];
+};
+
+typedef struct rusage_info_v4 rusage_info_current;
+
+#endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */
+
+#ifdef KERNEL
+
+struct rusage_superset {
+ struct rusage ru;
+ rusage_info_current ri;
+};
+
+struct rusage_info_child {
+ uint64_t ri_child_user_time;
+ uint64_t ri_child_system_time;
+ uint64_t ri_child_pkg_idle_wkups;
+ uint64_t ri_child_interrupt_wkups;
+ uint64_t ri_child_pageins;
+ uint64_t ri_child_elapsed_abstime;
+};
+
+struct user64_rusage {
+ struct user64_timeval ru_utime; /* user time used */
+ struct user64_timeval ru_stime; /* system time used */
+ user64_long_t ru_maxrss; /* max resident set size */
+ user64_long_t ru_ixrss; /* integral shared memory size */
+ user64_long_t ru_idrss; /* integral unshared data " */
+ user64_long_t ru_isrss; /* integral unshared stack " */
+ user64_long_t ru_minflt; /* page reclaims */
+ user64_long_t ru_majflt; /* page faults */
+ user64_long_t ru_nswap; /* swaps */
+ user64_long_t ru_inblock; /* block input operations */
+ user64_long_t ru_oublock; /* block output operations */
+ user64_long_t ru_msgsnd; /* messages sent */
+ user64_long_t ru_msgrcv; /* messages received */
+ user64_long_t ru_nsignals; /* signals received */
+ user64_long_t ru_nvcsw; /* voluntary context switches */
+ user64_long_t ru_nivcsw; /* involuntary " */
+};
+
+struct user32_rusage {
+ struct user32_timeval ru_utime; /* user time used */
+ struct user32_timeval ru_stime; /* system time used */
+ user32_long_t ru_maxrss; /* max resident set size */
+ user32_long_t ru_ixrss; /* integral shared memory size */
+ user32_long_t ru_idrss; /* integral unshared data " */
+ user32_long_t ru_isrss; /* integral unshared stack " */
+ user32_long_t ru_minflt; /* page reclaims */
+ user32_long_t ru_majflt; /* page faults */
+ user32_long_t ru_nswap; /* swaps */
+ user32_long_t ru_inblock; /* block input operations */
+ user32_long_t ru_oublock; /* block output operations */
+ user32_long_t ru_msgsnd; /* messages sent */
+ user32_long_t ru_msgrcv; /* messages received */
+ user32_long_t ru_nsignals; /* signals received */
+ user32_long_t ru_nvcsw; /* voluntary context switches */
+ user32_long_t ru_nivcsw; /* involuntary " */
+};
+
+#endif /* KERNEL */
+
+
+/*****
+ * RESOURCE LIMITS
+ */
+
+/*
+ * Symbolic constants for resource limits; since all limits are representable
+ * as a type rlim_t, we are permitted to define RLIM_SAVED_* in terms of
+ * RLIM_INFINITY.
+ */
+#define RLIM_INFINITY (((__uint64_t)1 << 63) - 1) /* no limit */
+#define RLIM_SAVED_MAX RLIM_INFINITY /* Unrepresentable hard limit */
+#define RLIM_SAVED_CUR RLIM_INFINITY /* Unrepresentable soft limit */
+
+/*
+ * Possible values of the first parameter to getrlimit()/setrlimit(), to
+ * indicate for which resource the operation is being performed.
+ */
+#define RLIMIT_CPU 0 /* cpu time per process */
+#define RLIMIT_FSIZE 1 /* file size */
+#define RLIMIT_DATA 2 /* data segment size */