123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- #+build linux, darwin, netbsd, openbsd, freebsd
- package posix
- import "core:c"
- when ODIN_OS == .Darwin {
- foreign import lib "system:System"
- } else {
- foreign import lib "system:c"
- }
- // sys/shm.h = XSI shared memory facility
- foreign lib {
- /*
- Attaches the shared memory segment associated with the identifier
- into the address space of the calling process.
- Returns: nil (setting errno) on failure, the address otherwise
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/shmat.html ]]
- */
- shmat :: proc(shmid: FD, shmaddr: rawptr, shmflag: SHM_Flags) -> rawptr ---
- /*
- Provides various shared memory operation as specified by the given cmd.
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/shmctl.html ]]
- */
- @(link_name=LSHMCTL)
- shmctl :: proc(shmid: FD, cmd: IPC_Cmd, buf: ^shmid_ds) -> result ---
- /*
- Detaches the shared memory segment located at the address specified.
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/shmdt.html ]]
- */
- shmdt :: proc(shmaddr: rawptr) -> result ---
- /*
- Returns the shared memory identifier associated with key.
- Returns: -1 (setting errno) on failure, the shared memory ID otherwise
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/shmget.html ]]
- */
- shmget :: proc(key: key_t, size: c.size_t, shmflag: SHM_Flags) -> FD ---
- }
- SHM_Flag_Bits :: enum c.int {
- RDONLY = log2(SHM_RDONLY),
- RND = log2(SHM_RND),
- }
- SHM_Flags :: bit_set[SHM_Flag_Bits; c.int]
- when ODIN_OS == .NetBSD {
- @(private) LSHMCTL :: "__shmctl50"
- } else {
- @(private) LSHMCTL :: "shmctl"
- }
- when ODIN_OS == .Darwin {
- SHM_RDONLY :: 0o10000
- SHM_RND :: 0o20000
- SHMLBA :: 16 * 1024 when ODIN_ARCH == .arm64 else 4096
- shmatt_t :: distinct c.ushort
- shmid_ds :: struct #max_field_align(4) {
- shm_perm: ipc_perm, /* [PSX] operation permission structure */
- shm_segsz: c.size_t, /* [PSX] size of segment in bytes */
- shm_lpid: pid_t, /* [PSX] process ID of last shared memory operation */
- shm_cpid: pid_t, /* [PSX] process ID of creator */
- shm_nattch: shmatt_t, /* [PSX] number of current attaches */
- shm_atime: time_t, /* [PSX] time of last shmat() */
- shm_dtime: time_t, /* [PSX] time of last shmdt() */
- shm_ctime: time_t, /* [PSX] time of last change by shmctl() */
- shm_internal: rawptr,
- }
- } else when ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD {
- SHM_RDONLY :: 0o10000
- SHM_RND :: 0o20000
- SHMLBA :: PAGESIZE
- shmatt_t :: distinct c.uint
- when ODIN_OS == .FreeBSD {
- shmid_ds :: struct {
- shm_perm: ipc_perm, /* [PSX] operation permission structure */
- shm_segsz: c.size_t, /* [PSX] size of segment in bytes */
- shm_lpid: pid_t, /* [PSX] process ID of last shared memory operation */
- shm_cpid: pid_t, /* [PSX] process ID of creator */
- shm_nattch: shmatt_t, /* [PSX] number of current attaches */
- shm_atime: time_t, /* [PSX] time of last shmat() */
- shm_dtime: time_t, /* [PSX] time of last shmdt() */
- shm_ctime: time_t, /* [PSX] time of last change by shmctl() */
- }
- } else {
- shmid_ds :: struct {
- shm_perm: ipc_perm, /* [PSX] operation permission structure */
- shm_segsz: c.size_t, /* [PSX] size of segment in bytes */
- shm_lpid: pid_t, /* [PSX] process ID of last shared memory operation */
- shm_cpid: pid_t, /* [PSX] process ID of creator */
- shm_nattch: shmatt_t, /* [PSX] number of current attaches */
- shm_atime: time_t, /* [PSX] time of last shmat() */
- shm_dtime: time_t, /* [PSX] time of last shmdt() */
- shm_ctime: time_t, /* [PSX] time of last change by shmctl() */
- _shm_internal: rawptr,
- }
- }
- } else when ODIN_OS == .OpenBSD {
- SHM_RDONLY :: 0o10000
- SHM_RND :: 0o20000
- SHMLBA :: 1 << 12
- shmatt_t :: distinct c.short
- shmid_ds :: struct {
- shm_perm: ipc_perm, /* [PSX] operation permission structure */
- shm_segsz: c.int, /* [PSX] size of segment in bytes */
- shm_lpid: pid_t, /* [PSX] process ID of last shared memory operation */
- shm_cpid: pid_t, /* [PSX] process ID of creator */
- shm_nattch: shmatt_t, /* [PSX] number of current attaches */
- shm_atime: time_t, /* [PSX] time of last shmat() */
- __shm_atimensec: c.long,
- shm_dtime: time_t, /* [PSX] time of last shmdt() */
- __shm_dtimensec: c.long,
- shm_ctime: time_t, /* [PSX] time of last change by shmctl() */
- __shm_ctimensec: c.long,
- _shm_internal: rawptr,
- }
- } else when ODIN_OS == .Linux {
- SHM_RDONLY :: 0o10000
- SHM_RND :: 0o20000
- SHMLBA :: 4096
- shmatt_t :: distinct c.ulong
- shmid_ds :: struct {
- shm_perm: ipc_perm, /* [PSX] operation permission structure */
- shm_segsz: c.size_t, /* [PSX] size of segment in bytes */
- shm_atime: time_t, /* [PSX] time of last shmat() */
- shm_dtime: time_t, /* [PSX] time of last shmdt() */
- shm_ctime: time_t, /* [PSX] time of last change by shmctl() */
- shm_cpid: pid_t, /* [PSX] process ID of creator */
- shm_lpid: pid_t, /* [PSX] process ID of last shared memory operation */
- shm_nattch: shmatt_t, /* [PSX] number of current attaches */
- _: [2]c.ulong,
- }
- }
|