123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- #+build linux, darwin, netbsd, openbsd, freebsd
- package posix
- import "core:c"
- when ODIN_OS == .Darwin {
- foreign import lib "system:System.framework"
- } else {
- foreign import lib "system:c"
- }
- // sys/resource.h - definitions XSI resource operations
- foreign lib {
- /*
- Gets the nice value of the process, process group or user given.
- Note that a nice value can be -1, so checking for an error would mean clearing errno, doing the
- call and then checking that this returns -1 and it has an errno.
- Returns: -1 (setting errno) on failure, the value otherwise
- Example:
- pid := posix.getpid()
- posix.set_errno(.NONE)
- prio := posix.getpriority(.PROCESS, pid)
- if err := posix.errno(); prio == -1 && err != .NONE {
- // Handle error...
- }
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/getpriority.html ]]
- */
- getpriority :: proc(which: Which_Prio, who: id_t) -> c.int ---
- /*
- Sets the nice value of the process, process group or user given.
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/getpriority.html ]]
- */
- setpriority :: proc(which: Which_Prio, who: id_t, value: c.int) -> result ---
- /*
- Get a resource limit.
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/getrlimit.html ]]
- */
- getrlimit :: proc(resource: Resource, rlp: ^rlimit) -> result ---
- /*
- Set a resource limit.
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/getrlimit.html ]]
- */
- setrlimit :: proc(resource: Resource, rlp: ^rlimit) -> result ---
- /*
- Get resource usage.
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/getrusage.html ]]
- */
- @(link_name=LGETRUSAGE)
- getrusage :: proc(who: Which_Usage, rusage: ^rusage) -> result ---
- }
- Which_Prio :: enum c.int {
- PROCESS = PRIO_PROCESS,
- PGRP = PRIO_PGRP,
- USER = PRIO_USER,
- }
- Which_Usage :: enum c.int {
- SELF = RUSAGE_SELF,
- CHILDREN = RUSAGE_CHILDREN,
- }
- Resource :: enum c.int {
- // Maximum byte size of a core file that may be created by a process.
- CORE = RLIMIT_CORE,
- // Maximum amount of CPU time, in seconds, used by a process.
- CPU = RLIMIT_CPU,
- // Maximum size of data segment of the process, in bytes.
- DATA = RLIMIT_DATA,
- // Maximum size of a file, in bytes, that may be created by a process.
- FSIZE = RLIMIT_FSIZE,
- // A number one greater than the maximum value that the system may assign to a newly-created descriptor.
- NOFILE = RLIMIT_NOFILE,
- // The maximum size of the initial thread's stack, in bytes.
- STACK = RLIMIT_STACK,
- // Maximum size of total available memory of the process, in bytes.
- AS = RLIMIT_AS,
- }
- when ODIN_OS == .NetBSD {
- @(private) LGETRUSAGE :: "__getrusage50"
- } else {
- @(private) LGETRUSAGE :: "getrusage"
- }
- when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux {
- PRIO_PROCESS :: 0
- PRIO_PGRP :: 1
- PRIO_USER :: 2
- rlim_t :: distinct c.uint64_t
- RLIM_INFINITY :: ~rlim_t(0) when ODIN_OS == .Linux else (rlim_t(1) << 63) - 1
- RLIM_SAVED_MAX :: RLIM_INFINITY
- RLIM_SAVED_CUR :: RLIM_INFINITY
- RUSAGE_SELF :: 0
- RUSAGE_CHILDREN :: -1
- rlimit :: struct {
- rlim_cur: rlim_t, /* [PSX] the current (soft) limit */
- rlim_max: rlim_t, /* [PSX] the hard limit */
- }
- rusage :: struct {
- ru_utime: timeval, /* [PSX] user time used */
- ru_stime: timeval, /* [PSX] system time used */
- // Informational aliases for source compatibility with programs
- // that need more information than that provided by standards,
- // and which do not mind being OS-dependent.
- ru_maxrss: c.long, /* max resident set size (PL) */
- ru_ixrss: c.long, /* integral shared memory size (NU) */
- ru_idrss: c.long, /* integral unshared data (NU) */
- ru_isrss: c.long, /* integral unshared stack (NU) */
- ru_minflt: c.long, /* page reclaims (NU) */
- ru_majflt: c.long, /* page faults (NU) */
- ru_nswap: c.long, /* swaps (NU) */
- ru_inblock: c.long, /* block input operations (atomic) */
- ru_outblock: c.long, /* block output operations (atomic) */
- ru_msgsnd: c.long, /* messages sent (atomic) */
- ru_msgrcv: c.long, /* messages received (atomic) */
- ru_nsignals: c.long, /* signals received (atomic) */
- ru_nvcsw: c.long, /* voluntary context switches (atomic) */
- ru_nivcsw: c.long, /* involuntary " */
- }
- RLIMIT_CORE :: 4
- RLIMIT_CPU :: 0
- RLIMIT_DATA :: 2
- RLIMIT_FSIZE :: 1
- RLIMIT_NOFILE :: 7 when ODIN_OS == .Linux else 8
- RLIMIT_STACK :: 3
- when ODIN_OS == .Linux {
- RLIMIT_AS :: 9
- } else when ODIN_OS == .Darwin || ODIN_OS == .OpenBSD {
- RLIMIT_AS :: 5
- } else {
- RLIMIT_AS :: 10
- }
- }
|