From e21cde0cf7f9bdfd7af4ebf2a55b61ac1bdf36de Mon Sep 17 00:00:00 2001 From: Sunagatov Denis Date: Tue, 24 Jun 2025 20:00:28 +1100 Subject: [PATCH] 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 --- core/sys/linux/bits.odin | 33 ++++++++++++++++++--------------- 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, }