diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /third_party/rust/procfs-core/src/sysvipc_shm.rs | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/procfs-core/src/sysvipc_shm.rs')
-rw-r--r-- | third_party/rust/procfs-core/src/sysvipc_shm.rs | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/third_party/rust/procfs-core/src/sysvipc_shm.rs b/third_party/rust/procfs-core/src/sysvipc_shm.rs new file mode 100644 index 0000000000..9b9081360d --- /dev/null +++ b/third_party/rust/procfs-core/src/sysvipc_shm.rs @@ -0,0 +1,105 @@ +use std::io; + +use super::{expect, ProcResult}; +use std::str::FromStr; + +#[cfg(feature = "serde1")] +use serde::{Deserialize, Serialize}; + +/// A shared memory segment parsed from `/proc/sysvipc/shm` +/// Relation with [crate::process::MMapPath::Vsys] +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] +#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] +#[allow(non_snake_case)] +pub struct Shm { + /// Segment key + pub key: i32, + /// Segment ID, unique + pub shmid: u64, + /// Access permissions, as octal + pub perms: u16, + /// Size in bytes + pub size: u64, + /// Creator PID + pub cpid: i32, + /// Last operator PID + pub lpid: i32, + /// Number of attached processes + pub nattch: u32, + /// User ID + pub uid: u16, + /// Group ID + pub gid: u16, + /// Creator UID + pub cuid: u16, + /// Creator GID + pub cgid: u16, + /// Time of last `shmat` (attach), epoch + pub atime: u64, + /// Time of last `shmdt` (detach), epoch + pub dtime: u64, + /// Time of last permission change, epoch + pub ctime: u64, + /// Current part of the shared memory resident in memory + pub rss: u64, + /// Current part of the shared memory in SWAP + pub swap: u64, +} + +/// A set of shared memory segments parsed from `/proc/sysvipc/shm` +#[derive(Debug, Clone)] +#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] +pub struct SharedMemorySegments(pub Vec<Shm>); + +impl super::FromBufRead for SharedMemorySegments { + fn from_buf_read<R: io::BufRead>(r: R) -> ProcResult<Self> { + let mut vec = Vec::new(); + + // See printing code here: + // https://elixir.bootlin.com/linux/latest/source/ipc/shm.c#L1737 + for line in r.lines().skip(1) { + let line = expect!(line); + let mut s = line.split_whitespace(); + + let key = expect!(i32::from_str(expect!(s.next()))); + let shmid = expect!(u64::from_str(expect!(s.next()))); + let perms = expect!(u16::from_str(expect!(s.next()))); + let size = expect!(u64::from_str(expect!(s.next()))); + let cpid = expect!(i32::from_str(expect!(s.next()))); + let lpid = expect!(i32::from_str(expect!(s.next()))); + let nattch = expect!(u32::from_str(expect!(s.next()))); + let uid = expect!(u16::from_str(expect!(s.next()))); + let gid = expect!(u16::from_str(expect!(s.next()))); + let cuid = expect!(u16::from_str(expect!(s.next()))); + let cgid = expect!(u16::from_str(expect!(s.next()))); + let atime = expect!(u64::from_str(expect!(s.next()))); + let dtime = expect!(u64::from_str(expect!(s.next()))); + let ctime = expect!(u64::from_str(expect!(s.next()))); + let rss = expect!(u64::from_str(expect!(s.next()))); + let swap = expect!(u64::from_str(expect!(s.next()))); + + let shm = Shm { + key, + shmid, + perms, + size, + cpid, + lpid, + nattch, + uid, + gid, + cuid, + cgid, + atime, + dtime, + ctime, + rss, + swap, + }; + + vec.push(shm); + } + + Ok(SharedMemorySegments(vec)) + } +} |