public void Dispose() { if (!m_disposed) { using (var semaphoreReleaser = m_syncSemaphore.AcquireSemaphore()) { StopWaiting(semaphoreReleaser); WaitUntilErrorAndOutputEof(true, semaphoreReleaser).GetAwaiter().GetResult(); if (m_processInjector != null) { // We may have already called Stop() in CompletionCallback, but that's okay. m_processInjector.Stop().GetAwaiter().GetResult(); m_processInjector.Dispose(); m_processInjector = null; } if (m_processHandle != null) { m_processHandle.Dispose(); m_processHandle = null; } if (m_job != null) { m_job.Dispose(); m_job = null; } } m_syncSemaphore.Dispose(); m_disposed = true; } }
private void Dispose(bool disposing) { if (disposing) { if (jobObject != null) { jobObject.Dispose(); } } }
public void Dispose() { jobObject.Dispose(); userManager.DeleteUser(username); try { guardProcess.Kill(); } catch (System.InvalidOperationException) { } }
public void Destroy() { lock (_ioLock) { Stop(true); StopGuardAndWait(new TimeSpan(0, 0, 0, 10)); foreach (var port in reservedPorts) { tcpPortManager.ReleaseLocalPort(port, user.UserName); } tcpPortManager.RemoveFirewallRules(user.UserName); // BR - Unmap the mounted directories (Removes user ACLs) try { jobObject.TerminateProcessesAndWait(); } catch (ObjectDisposedException) { } jobObject.Dispose(); if (directory != null) { directory.Destroy(); } deleteUserDiskQuota(); if (user != null) { user.Delete(); } this.currentState = ContainerState.Destroyed; } }
public void Destroy() { lock (_ioLock) { LogCompletionStatus(); Stop(true); StopGuardAndWait(new TimeSpan(0, 0, 0, 10)); foreach (var port in reservedPorts) { tcpPortManager.ReleaseLocalPort(port, user.UserName); } tcpPortManager.RemoveFirewallRules(user.UserName); try { jobObject.TerminateProcessesAndWait(); } catch (ObjectDisposedException) { } jobObject.Dispose(); directory.Destroy(); if (user != null) { directory.DeleteBindMounts(bindMounts, user); user.DeleteProfile(); user.Delete(); } deleteUserDiskQuota(); this.currentState = ContainerState.Destroyed; } }
public IContainer CreateContainer(ContainerSpec containerSpec) { Guard.NotNull(containerSpec, "containerSpec"); UndoStack undoStack = new UndoStack(); IContainer container; try { var handle = containerSpec.Handle; if (String.IsNullOrEmpty(handle)) { handle = handleHelper.GenerateHandle(); } var id = handleHelper.GenerateId(handle); var user = ContainerUser.Create(userManager, id); undoStack.Push(() => user.Delete()); var directory = directoryFactory.Create(fileSystem, containerBasePath, id); directory.CreateSubdirectories(user); undoStack.Push(directory.Destroy); directory.CreateBindMounts(containerSpec.BindMounts, user); var jobObject = new JobObject(id); undoStack.Push(() => jobObject.Dispose()); var containerHostClient = containerHostService.StartContainerHost(id, directory, jobObject, user.GetCredential()); undoStack.Push(() => containerHostClient.Shutdown()); var constrainedProcessRunner = new ConstrainedProcessRunner(containerHostClient); undoStack.Push(() => constrainedProcessRunner.Dispose()); var processHelper = new ProcessHelper(); var dependencyHelper = new ContainerHostDependencyHelper(); var diskQuotaControl = diskQuotaManager.CreateDiskQuotaControl(directory); container = new Container( id, handle, user, directory, containerPropertiesService, tcpPortManager, jobObject, diskQuotaControl, processRunner, constrainedProcessRunner, processHelper, containerSpec.Environment, dependencyHelper); containerPropertiesService.SetProperties(container, containerSpec.Properties); lock (containers) { containers.Add(container); } } catch (Exception e) { try { undoStack.UndoAll(); throw; } catch (AggregateException undoException) { throw new AggregateException(new[] { e, undoException }); } } return(container); }