using System; using System.Collections.Generic; using System.Linq; namespace Umbraco.Core { /// /// Provides a simple implementation of . /// public class SimpleMainDom : IMainDom { private readonly object _locko = new object(); private readonly List> _callbacks = new List>(); private bool _isStopping; /// public bool IsMainDom { get; private set; } = true; /// public bool Register(Action release, int weight = 100) => Register(null, release, weight); /// public bool Register(Action install, Action release, int weight = 100) { lock (_locko) { if (_isStopping) return false; install?.Invoke(); if (release != null) _callbacks.Add(new KeyValuePair(weight, release)); return true; } } public void Stop() { lock (_locko) { if (_isStopping) return; if (IsMainDom == false) return; // probably not needed _isStopping = true; } try { foreach (var callback in _callbacks.OrderBy(x => x.Key).Select(x => x.Value)) { callback(); // no timeout on callbacks } } finally { // in any case... IsMainDom = false; } } } }