/// <summary>
        /// Stop managing an appender
        /// </summary>
        /// <param name="alivecall">callback to be released</param>
        public void Release(AliveCall alivecall)
        {
            lock (m_control_locker)
            {
                lock (m_calls_locker)
                {
                    m_calls.Remove(alivecall);
                }

                Monitor.PulseAll(m_control_locker);
            }
        }
        /// <summary>
        /// Let a callback be called by KeepAlive regularly;
        /// </summary>
        /// <param name="alivecall">callback to be called</param>
        /// <param name="interval">how often</param>
        public void Manage(AliveCall alivecall, int interval)
        {
            lock (m_control_locker)
            {
                lock (m_calls_locker)
                {
                    m_calls[alivecall] = MakeConfig(alivecall, interval);
                }

                if (!m_stop)
                {
                    Start();
                }

                Monitor.PulseAll(m_control_locker);
            }
        }
        /// <summary>
        /// Let a callback be called by KeepAlive regularly;
        /// </summary>
        /// <param name="alivecall">callback to be called</param>
        /// <param name="interval">how often</param>
        public void Manage(AliveCall alivecall, int interval)
        {
            lock (m_control_locker)
            {
                lock (m_calls_locker)
                {
                    m_calls[alivecall] = MakeConfig(alivecall, interval);
                }

                // ensure we have the right repo if config changed
                m_rep = LogManager.GetRepository(typeof(KeepAlive).Assembly);

                if (!m_stop)
                {
                    Start();
                }

                Monitor.PulseAll(m_control_locker);
            }
        }
        Config MakeConfig(AliveCall alivecall, int interval)
        {
            var config = new Config()
            {
                Interval = interval,
                Schedule = DateTime.Today,
                Call     = alivecall
            };

            if (config.Interval <= 0)
            {
                config.Interval = 60000;
            }

            while (config.Offset == 0)
            {
                config.Offset = new Random((int)(DateTime.Now.Ticks % int.MaxValue)).Next(config.Interval);
            }

            return(config);
        }