diff options
| author | Sunagatov Denis <thebumboni@gmail.com> | 2025-06-24 20:00:28 +1100 |
|---|---|---|
| committer | Sunagatov Denis <thebumboni@gmail.com> | 2025-06-24 20:30:50 +1100 |
| commit | e21cde0cf7f9bdfd7af4ebf2a55b61ac1bdf36de (patch) | |
| tree | 3a526a9e28472bfba9225dcdb00f23ac8dd5db8a /core | |
| parent | 8d89b1a4489adf0a0ae88302cbb9674d8de0b231 (diff) | |
sys/linux: Unify IPC_Flags and IPC_Mode bitsets
In #5399 it was noticed, that IPC_Mode isn't being used within SystemV
IPC procedures, even though it was designed this way, which lead to a
weird API where in order to call SystemV IPC procedures multiple
transmutes and a bitwise-OR are needed.
This unifies IPC_Mode and IPC_Flags bitsets, making it possible to call
the SystemV IPC procedures without extra casts, and rearranges the flags
in a way that hopefully makes it easier to see when they are not
colliding and should not be mixed. The explanation, explaining this
arrangement of the enum was added.
The IPC_Perm structure is modified, so that the flags can be re-used
between the calls. It's probably not as good as keeping them separate,
but should work... hopefully.
Kept the "old" style of documentation for consistency.
Signed-off-by: Sunagatov Denis <thebumboni@gmail.com>
Diffstat (limited to 'core')
| -rw-r--r-- | core/sys/linux/bits.odin | 33 | ||||
| -rw-r--r-- | core/sys/linux/types.odin | 11 |
2 files changed, 21 insertions, 23 deletions
diff --git a/core/sys/linux/bits.odin b/core/sys/linux/bits.odin index d4edf354b..f9c4ec22e 100644 --- a/core/sys/linux/bits.odin +++ b/core/sys/linux/bits.odin @@ -1618,36 +1618,39 @@ PER_HPUX :: 0x0010 PER_MASK :: 0x00ff /* - Bits for access modes for shared memory + Bits for SystemV IPC flags. + + In this enum, access modes are common for any shared memory. Prefixed + entries (i.e. `IPC_` or `SHM_`) denote flags, where `IPC_` are common flags + for all SystemV IPC primitives, and `SHM_`, `SEM_` and `MSG_` are specific + to shared memory segments, semaphores and message queues respectively. + + These bits overlap, because they are meant to be used within the + context of specific procedures. Creation flags, used for `*get` procedures, + and usage flags used by all other IPC procedures. Do not mix creation and + usage flags, as well as flags prefixed differently (excluding `IPC_` + prefix). */ -IPC_Mode_Bits :: enum { +IPC_Flags_Bits :: enum { + // Access modes for shared memory. WROTH = 1, RDOTH = 2, WRGRP = 4, RDGRP = 5, WRUSR = 7, RDUSR = 8, - DEST = 9, - LOCKED = 10, -} - -/* - Shared memory flags bits -*/ -IPC_Flags_Bits :: enum { + // Creation flags for shared memory. IPC_CREAT = 9, IPC_EXCL = 10, - IPC_NOWAIT = 11, - // Semaphore - SEM_UNDO = 9, - // Shared memory SHM_HUGETLB = 11, SHM_NORESERVE = 12, + // Usage flags for shared memory. + IPC_NOWAIT = 11, + SEM_UNDO = 9, SHM_RDONLY = 12, SHM_RND = 13, SHM_REMAP = 14, SHM_EXEC = 15, - // Message queue MSG_NOERROR = 12, MSG_EXCEPT = 13, MSG_COPY = 14, diff --git a/core/sys/linux/types.odin b/core/sys/linux/types.odin index 08e0026d3..c2948c36e 100644 --- a/core/sys/linux/types.odin +++ b/core/sys/linux/types.odin @@ -937,17 +937,12 @@ IO_Vec :: struct { } /* - Access mode for shared memory -*/ -IPC_Mode :: bit_set[IPC_Mode_Bits; u32] - -/* - Flags used by IPC objects + Access modes and flags used by SystemV IPC procedures. */ IPC_Flags :: bit_set[IPC_Flags_Bits; i16] /* - Permissions for IPC objects + Permissions for SystemV IPC primitives. */ IPC_Perm :: struct { key: Key, @@ -955,7 +950,7 @@ IPC_Perm :: struct { gid: u32, cuid: u32, cgid: u32, - mode: IPC_Mode, + mode: IPC_Flags, // Only contains mode flags. seq: u16, _: [2 + 2*size_of(int)]u8, } |