struct ContainerManagerInner {
docker: Docker,
ensure_locks: Mutex<HashMap<String, Arc<Mutex<()>>>>,
exec_identities: Mutex<HashMap<String, (u64, u64)>>,
cli_ready: Mutex<HashSet<String>>,
cli_locks: Mutex<HashMap<String, Arc<Mutex<()>>>>,
dev_proxy: OnceLock<DevProxyRegistry>,
}Fields§
§docker: Docker§ensure_locks: Mutex<HashMap<String, Arc<Mutex<()>>>>Per-container serialization lock: prevents concurrent ensure_running calls for the same container from both seeing “not found” in Docker and both attempting create_container (which would fail with a 409 name-conflict on the second caller).
exec_identities: Mutex<HashMap<String, (u64, u64)>>Per-container (uid, gid) of the user execs run as, resolved once and
cached — see ContainerManager::exec_identity.
cli_ready: Mutex<HashSet<String>>(container, install marker) pairs already confirmed installed, so a
running agent pays the check once, not on every turn. Dropped when the
container is created or removed.
cli_locks: Mutex<HashMap<String, Arc<Mutex<()>>>>Serializes provision_cli per container: two quick messages must not
run two npm installs into the same directory.
dev_proxy: OnceLock<DevProxyRegistry>Dev-proxy routing table, wired in post-construction by
ContainerManager::attach_dev_proxy_registry (called by
ContainerRuntimeHandle, which re-attaches after every reconnect
since each reconnect creates a fresh ContainerManagerInner).
stop/remove clear this agent’s registrations when set — see
cleanup_dev_proxy_routes. Unset (None via OnceLock) in tests
and any path that never wires it up; cleanup is then simply
skipped, never an error. See
docs/specs/SPEC_NATIVE_CONTAINER_DEV_PROXY_2026_09_19.md.
Auto Trait Implementations§
impl !Freeze for ContainerManagerInner
impl !RefUnwindSafe for ContainerManagerInner
impl !UnwindSafe for ContainerManagerInner
impl Send for ContainerManagerInner
impl Sync for ContainerManagerInner
impl Unpin for ContainerManagerInner
impl UnsafeUnpin for ContainerManagerInner
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
impl<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more