public ContainerManager(Container container) { _container = container; _memoryTracker = new Timer( obj => MemoryTracker(), null, Timeout.Infinite, Timeout.Infinite); MemoryUsage = _container.MemoryLimit; Status = ContainerManagerStatus.Initialized; }
/// <summary> /// Periodic check the container's recource usage, /// shut down it if exceed the limit. /// </summary> private void MemoryTracker() { if (_container.HasExited) { // Stop tracking _memoryTracker.Change(Timeout.Infinite, Timeout.Infinite); Status = ContainerManagerStatus.ExitedNormaly; } if (_container.GetMemoryUsage() - _container.MemoryLimit < 0) { // Shutdown current container _container.Dispose(); _memoryTracker.Dispose(); Status = ContainerManagerStatus.ExitedMandatory; } else { _memoryTracker.Change(PERIOD, Timeout.Infinite); } }
/// <summary> /// Launch the container which managed by this manager, /// and start tracking it resource usage /// </summary> public void Run() { _container.Run(); _memoryTracker.Change(PERIOD, Timeout.Infinite); Status = ContainerManagerStatus.Tracking; }