Skip to main content

ProcessIndex

Struct ProcessIndex 

Source
pub struct ProcessIndex { /* private fields */ }
Expand description

Source-of-truth registry for processes inside the sandbox.

Maps the kernel’s numeric pid (the value that arrives in seccomp notifications) to the canonical PidKey plus an Arc<AsyncMutex<PerProcessState>> holding everything per-process. Held behind an internal std::sync::RwLock so the read-mostly hot paths (key_for, contains, entry_for, /proc virtualization) avoid an async mutex on every notification, and so ProcessIndex doesn’t need its own outer wrapper in SupervisorCtx. Lock guards are !Send and the compiler will reject holding one across an .await, which keeps callers honest.

Ownership of each child’s pidfd lives with the per-child watcher task, not with this index. That keeps the kernel fd alive for as long as the AsyncFd registration in the tokio IO driver does, and avoids a race where dropping the fd from the index could deregister a recycled fd from epoll.

Implementations§

Source§

impl ProcessIndex

Source

pub fn new() -> Self

Source

pub fn register(&self, pid: i32) -> Option<PidKey>

Register a process by reading its start_time once and allocating its PerProcessState. Returns the canonical key, or None if the process is already gone. The caller is responsible for keeping the pidfd alive — the per-child watcher task does this via AsyncFd<OwnedFd>.

Source

pub fn key_for(&self, pid: i32) -> Option<PidKey>

Look up the canonical PidKey for a notification’s raw pid. Returns None if this pid was never registered (e.g. pidfd_open failed at fork) — callers should fall back to a no-op.

Source

pub fn entry_for( &self, pid: i32, ) -> Option<(PidKey, Arc<AsyncMutex<PerProcessState>>)>

Look up both the PidKey and the per-process state handle for pid. Returns None if the pid isn’t tracked. The caller locks the returned Arc<AsyncMutex<…>> to read or mutate.

Source

pub fn contains(&self, pid: i32) -> bool

Cheap membership test — used by /proc virtualization to gate access to /proc/<pid>/... paths and by getdents filtering.

Source

pub fn len(&self) -> usize

Number of tracked processes (for /proc/loadavg total).

Source

pub fn max_pid(&self) -> Option<i32>

Largest tracked pid (for /proc/loadavg last_pid).

Source

pub fn pids_snapshot(&self) -> HashSet<i32>

Snapshot the set of tracked pids. Used by getdents filtering where the caller needs O(1) lookups inside a loop and would otherwise have to re-acquire the read lock per entry.

Source

pub fn unregister(&self, key: PidKey)

Remove a process from the index. The per-process state’s Arc reference held by the index drops here; remaining clones (e.g. a handler that’s mid-execution for that pid) will drop when they go out of scope, and the inner PerProcessState frees automatically.

Source

pub fn prune_dead(&self)

Defensive sweep: drop entries whose process is gone (or whose start_time has changed). Called from a low-frequency backstop task in case a pidfd watcher failed to spawn or the kernel didn’t deliver the readability event.

Trait Implementations§

Source§

impl Default for ProcessIndex

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,