예제 #1
0
파일: Pinger.cs 프로젝트: siemantic/Eddie
        private static void DoPing(object o)
        {
            PingerJob job = o as PingerJob;

            job.Run();
        }
예제 #2
0
        public override void OnRun()
        {
            Dictionary<string, ServerInfo> servers;

            for (; ; )
            {
                if (GetCanRun() == false)
                {
                    Sleep(1000);
                }
                else
                {
                    // Note: If Pinger is not enabled, works like all ping results is 0.
                    bool enabled = GetEnabled();

                    int timeNow = Utils.UnixTimeStamp();
                    int jobsLimit = Engine.Instance.Storage.GetInt("pinger.jobs");

                    lock (Engine.Servers)
                        servers = new Dictionary<string, ServerInfo>(Engine.Servers);

                    bool startOne = false;

                    foreach (ServerInfo infoServer in servers.Values)
                    {
                        if (GetCanRun() == false)
                            break;

                        int delaySuccess = GetPingerDelaySuccess(infoServer);
                        int delayRetry = GetPingerDelayRetry(infoServer);

                        int delay = delaySuccess;
                        if (infoServer.PingFailedConsecutive > 0)
                            delay = delayRetry;

                        if(timeNow - infoServer.LastPingTest >= delay)
                        {
                            bool canPingServer = enabled;
                            if (infoServer.IpEntry == "")
                                canPingServer = false;
                            if (infoServer.WarningClosed != "")
                                canPingServer = false;

                            if (canPingServer)
                            {
                                if (Jobs.Count < jobsLimit)
                                {
                                    infoServer.LastPingTest = timeNow;

                                    PingerJob job = new PingerJob();
                                    job.Server = infoServer;
                                    /*
                                    lock (Jobs)
                                    {
                                        Jobs.Add(job);
                                    }
                                    job.Start();
                                    */

                                    ThreadPool.QueueUserWorkItem(new WaitCallback(DoPing), job);
                                    startOne = true;
                                }
                            }
                            else
                            {
                                infoServer.LastPingTest = timeNow;
                                infoServer.PingTests = 0;
                                infoServer.PingFailedConsecutive = 0;
                                infoServer.Ping = -1;
                                infoServer.LastPingResult = infoServer.LastPingTest;
                                infoServer.LastPingSuccess = infoServer.LastPingTest;
                                Engine.Instance.MarkServersListUpdated();
                            }
                        }

                        if (CancelRequested)
                            return;
                    }

                    if (startOne)
                        Sleep(100); // Waiting for a queue slot
                    else
                        Sleep(1000); // Waiting for a ping need
                }

                if (CancelRequested)
                    return;

            }
        }
예제 #3
0
파일: Pinger.cs 프로젝트: siemantic/Eddie
        public override void OnRun()
        {
            Dictionary <string, ConnectionInfo> servers;

            for (;;)
            {
                if (GetCanRun() == false)
                {
                    Sleep(1000);
                }
                else
                {
                    // Note: If Pinger is not enabled, works like all ping results is 0.
                    bool enabled = GetEnabled();

                    int timeNow   = Utils.UnixTimeStamp();
                    int jobsLimit = Engine.Instance.Storage.GetInt("pinger.jobs");

                    lock (Engine.Connections)
                        servers = new Dictionary <string, ConnectionInfo>(Engine.Connections);

                    bool startOne = false;

                    foreach (ConnectionInfo infoServer in servers.Values)
                    {
                        if (GetCanRun() == false)
                        {
                            break;
                        }

                        int delaySuccess = GetPingerDelaySuccess(infoServer);
                        int delayRetry   = GetPingerDelayRetry(infoServer);

                        int delay = delaySuccess;
                        if (infoServer.PingFailedConsecutive > 0)
                        {
                            delay = delayRetry;
                        }

                        if (timeNow - infoServer.LastPingTest >= delay)
                        {
                            bool canPingServer = enabled;
                            if (infoServer.CanPing() == false)
                            {
                                canPingServer = false;
                            }

                            if (canPingServer)
                            {
                                if (Jobs.Count < jobsLimit)
                                {
                                    infoServer.LastPingTest = timeNow;

                                    PingerJob job = new PingerJob();
                                    job.Server = infoServer;

                                    ThreadPool.QueueUserWorkItem(new WaitCallback(DoPing), job);
                                    startOne = true;
                                }
                            }
                            else
                            {
                                if (infoServer.Ping != -1)
                                {
                                    //infoServer.LastPingTest = timeNow; // <2.13.4
                                    infoServer.LastPingTest          = 0;
                                    infoServer.PingTests             = 0;
                                    infoServer.PingFailedConsecutive = 0;
                                    infoServer.Ping            = -1;
                                    infoServer.LastPingResult  = infoServer.LastPingTest;
                                    infoServer.LastPingSuccess = infoServer.LastPingTest;
                                    Engine.Instance.MarkServersListUpdated();
                                }
                            }
                        }

                        if (CancelRequested)
                        {
                            return;
                        }
                    }

                    if (startOne)
                    {
                        Sleep(100);                         // Waiting for a queue slot
                    }
                    else
                    {
                        Sleep(1000);                         // Waiting for a ping need
                    }
                }

                if (CancelRequested)
                {
                    return;
                }
            }
        }