Esempio n. 1
0
        public int RegisterHeldOffTask(DoMaintenanceDelegate do_maintenance_delegate, int delay_before_start_milliseconds, int delay_before_repeat_milliseconds = -1, ThreadPriority thread_priority = ThreadPriority.BelowNormal, int hold_off_level = 0, string extra_descr = "")
        {
            // Utilities.LockPerfTimer l1_clk = Utilities.LockPerfChecker.Start();
            int index;

            if (delay_before_repeat_milliseconds <= 0)
            {
                delay_before_repeat_milliseconds = delay_before_start_milliseconds;
            }

            lock (do_maintenance_delegate_wrappers_lock)
            {
                // l1_clk.LockPerfTimerStop();
                // Set up the wrapper
                DoMaintenanceDelegateWrapper do_maintenance_delegate_wrapper = new DoMaintenanceDelegateWrapper();
                do_maintenance_delegate_wrapper.maintainable_description = String.Format("{0}:{1}{2}", do_maintenance_delegate.Target, do_maintenance_delegate.Method.Name, extra_descr);
                do_maintenance_delegate_wrapper.target      = new WeakReference(do_maintenance_delegate.Target);
                do_maintenance_delegate_wrapper.method_info = do_maintenance_delegate.Method;
                do_maintenance_delegate_wrapper.delay_before_start_milliseconds  = delay_before_start_milliseconds;
                do_maintenance_delegate_wrapper.delay_before_repeat_milliseconds = delay_before_repeat_milliseconds;
                do_maintenance_delegate_wrapper.hold_off_level = hold_off_level;
                do_maintenance_delegate_wrapper.daemon         = new Daemon("Maintainable:" + do_maintenance_delegate.Target.GetType().Name + "." + do_maintenance_delegate.Method.Name + extra_descr);

                // Add it to our list of trackers
                index = do_maintenance_delegate_wrappers.Count;
                do_maintenance_delegate_wrappers.Add(do_maintenance_delegate_wrapper);

                // Start the thread
                do_maintenance_delegate_wrapper.daemon.Start(DaemonThreadEntryPoint, do_maintenance_delegate_wrapper);
                do_maintenance_delegate_wrapper.daemon.Priority = thread_priority;
            }

            return(index);
        }
 private void RemoveEntry(DoMaintenanceDelegateWrapper w)
 {
     lock (do_maintenance_delegate_wrappers_lock)
     {
         do_maintenance_delegate_wrappers.Remove(w);
     }
 }
Esempio n. 3
0
        public bool CleanupEntry(int index, bool first_stage_only = false, bool second_stage_only = false, int timeout = 0)
        {
            try
            {
                DoMaintenanceDelegateWrapper w = GetEntry(index);
                if (w != null)
                {
                    if (first_stage_only || !second_stage_only)
                    {
                        Logging.Info("Waiting for Maintainable {0} to terminate.", w.maintainable_description);

                        if (w.daemon.Join(timeout > 0 ? timeout : first_stage_only ? 150 : 2000))
                        {
                            RemoveEntry(index);
                            return(true);
                        }
                    }
                }
                else
                {
                    // NULL means we've hit the end of the list or an empty slot. Ignore.
                    return(true);
                }

                if (!first_stage_only || second_stage_only)
                {
                    // abort the thread if it's taking way too long:
                    w = GetEntry(index);
                    if (w != null)
                    {
                        if (w.daemon.Join(100))
                        {
                            RemoveEntry(index);
                            return(true);
                        }
                        else
                        {
                            Logging.Info("Timeout ({1} ms), hence ABORTing Maintainable thread {0}.", w.maintainable_description, Constants.MAX_WAIT_TIME_MS_AT_PROGRAM_SHUTDOWN / 1000);

                            w.daemon.Abort();
                        }
                    }
                }

                return(false);
            }
            catch (Exception ex)
            {
                Logging.Error(ex, "MaintainableManager: Cleanup entry [{0}] failed.", index);

                return(false);
            }
        }
Esempio n. 4
0
        private void DaemonThreadEntryPoint(object wrapper)
        {
            DoMaintenanceDelegateWrapper do_maintenance_delegate_wrapper = (DoMaintenanceDelegateWrapper)wrapper;
            Daemon daemon = do_maintenance_delegate_wrapper.daemon;

            // first wait until the hold off signal is released
            while (daemon.StillRunning && !Utilities.Shutdownable.ShutdownableManager.Instance.IsShuttingDown)
            {
                if (!IsHoldOffPending(do_maintenance_delegate_wrapper.hold_off_level))
                {
                    break;
                }
                daemon.Sleep(1000);
            }

            // only sleep the extra delay time when there's still a chance we will be running the actual thread code.
            if (daemon.StillRunning && !Utilities.Shutdownable.ShutdownableManager.Instance.IsShuttingDown)
            {
                if (0 != do_maintenance_delegate_wrapper.delay_before_start_milliseconds)
                {
                    Logging.Info("+MaintainableManager is waiting some startup time ({1}ms) for {0}", do_maintenance_delegate_wrapper.maintainable_description, do_maintenance_delegate_wrapper.delay_before_start_milliseconds);
                    daemon.Sleep(do_maintenance_delegate_wrapper.delay_before_start_milliseconds);
                    Logging.Info("-MaintainableManager was waiting some startup time for {0}", do_maintenance_delegate_wrapper.maintainable_description);
                }
            }

            while (daemon.StillRunning && !Utilities.Shutdownable.ShutdownableManager.Instance.IsShuttingDown)
            {
                try
                {
                    object target = do_maintenance_delegate_wrapper.target.Target;
                    if (null != target)
                    {
                        do_maintenance_delegate_wrapper.method_info.Invoke(target, new object[] { daemon });
                        target = null;
                    }
                    else
                    {
                        Logging.Info("Target maintainable ({0}) has been garbage collected, so closing down Maintainable thread.", do_maintenance_delegate_wrapper.maintainable_description);
                        daemon.Stop();
                    }
                }
                catch (Exception ex)
                {
                    Logging.Error(ex, "Maintainable {0} has thrown an unhandled exception.", do_maintenance_delegate_wrapper.maintainable_description);
                }

                daemon.Sleep(Math.Max(500, do_maintenance_delegate_wrapper.delay_before_repeat_milliseconds));
            }
        }
        void DaemonThreadEntryPoint(object wrapper)
        {
            DoMaintenanceDelegateWrapper do_maintenance_delegate_wrapper = (DoMaintenanceDelegateWrapper)wrapper;

            if (0 != do_maintenance_delegate_wrapper.delay_before_start_milliseconds)
            {
                Logging.Info("+MaintainableManager is waiting some startup time for {0}", do_maintenance_delegate_wrapper.maintainable_description);
                do_maintenance_delegate_wrapper.daemon.Sleep(do_maintenance_delegate_wrapper.delay_before_start_milliseconds);
                Logging.Info("-MaintainableManager is waiting some startup time for {0}", do_maintenance_delegate_wrapper.maintainable_description);
            }

            while (do_maintenance_delegate_wrapper.daemon.StillRunning)
            {
                try
                {
                    object target = do_maintenance_delegate_wrapper.target.Target;
                    if (null != target)
                    {
                        do_maintenance_delegate_wrapper.method_info.Invoke(target, new object[] { do_maintenance_delegate_wrapper.daemon });
                        target = null;
                    }
                    else
                    {
                        Logging.Info("Target maintainable ({0}) has been garbage collected, so closing down Maintainable thread.", do_maintenance_delegate_wrapper.maintainable_description);
                        do_maintenance_delegate_wrapper.daemon.Stop();
                    }
                }

                catch (Exception ex)
                {
                    Logging.Error(ex, "Maintainable {0} has thrown an unhandled exception.", do_maintenance_delegate_wrapper.maintainable_description);
                }

                if (do_maintenance_delegate_wrapper.daemon.StillRunning)
                {
                    do_maintenance_delegate_wrapper.daemon.Sleep();
                }
            }
        }
        public Daemon Register(DoMaintenanceDelegate do_maintenance_delegate, int delay_before_start_milliseconds, ThreadPriority thread_priority)
        {
            lock (do_maintenance_delegate_wrappers)
            {
                // Set up the wrapper
                DoMaintenanceDelegateWrapper do_maintenance_delegate_wrapper = new DoMaintenanceDelegateWrapper();
                do_maintenance_delegate_wrapper.maintainable_description = String.Format("{0}:{1}", do_maintenance_delegate.Target, do_maintenance_delegate.Method.Name);
                do_maintenance_delegate_wrapper.target      = new WeakReference(do_maintenance_delegate.Target);
                do_maintenance_delegate_wrapper.method_info = do_maintenance_delegate.Method;
                do_maintenance_delegate_wrapper.delay_before_start_milliseconds = delay_before_start_milliseconds;
                do_maintenance_delegate_wrapper.daemon = new Daemon("Maintainable:" + do_maintenance_delegate.Target.GetType().Name + "." + do_maintenance_delegate.Method.Name);

                // Add it to our list of trackers
                do_maintenance_delegate_wrappers.Add(do_maintenance_delegate_wrapper);

                // Start the thread
                do_maintenance_delegate_wrapper.daemon.Start(DaemonThreadEntryPoint, do_maintenance_delegate_wrapper);
                do_maintenance_delegate_wrapper.daemon.Priority = thread_priority;

                return(do_maintenance_delegate_wrapper.daemon);
            }
        }