Esempio n. 1
0
        /// <summary>This should be called by the Main after all the setup is done
        /// this passes control to the _node and won't return until the program is
        /// exiting.  (It is synchronous.)</summary>
        public virtual void Run()
        {
            int      sleep = 60, sleep_min = 60, sleep_max = 3600;
            DateTime start_time = DateTime.UtcNow;

            // Keep creating new nodes no matter what!
            while (_running)
            {
                ApplicationNode node = CreateNode(_node_config);
                _app_node = node;

                new Information(node.Node, "BasicNode");
                Console.WriteLine("Starting at {0}, {1} is connecting to {2}.",
                                  DateTime.UtcNow, node.Node.Address, node.Node.Realm);

                node.Node.DisconnectOnOverload = true;
                start_time = DateTime.UtcNow;
                node.Node.Connect();

                if (!_running)
                {
                    break;
                }

                // Assist in garbage collection
                if (_xrm != null)
                {
                    _xrm.Remove(node.Node);
                }
                node      = null;
                _app_node = null;

                // DisconnectOnOverload seems to be having issues with pathing...
                foreach (var kvm in _type_to_pem)
                {
                    kvm.Value.Stop();
                }

                _type_to_pem.Clear();

                DateTime now = DateTime.UtcNow;
                Console.WriteLine("Going to sleep for {0} seconds. Current time is: {1}", sleep, now);
                Thread.Sleep(sleep * 1000);

                if (now - start_time < TimeSpan.FromSeconds(sleep_max))
                {
                    sleep *= 2;
                    sleep  = (sleep > sleep_max) ? sleep_max : sleep;
                }
                else
                {
                    sleep /= 2;
                    sleep  = (sleep < sleep_min) ? sleep_min : sleep;
                }
            }
        }
Esempio n. 2
0
        /// <summary>This should be called by the Main after all the setup is done
        /// this passes control to the _node and won't return until the program is
        /// exiting.  (It is synchronous.)</summary>
        public virtual void Run()
        {
            int      sleep = 60, sleep_min = 60, sleep_max = 3600;
            DateTime start_time = DateTime.UtcNow;

            // Keep creating new nodes no matter what!
            while (_running)
            {
                ApplicationNode node = CreateNode(_node_config);
                _app_node = node;

                new Information(node.Node, "BasicNode", node.SecurityOverlord);
                Console.WriteLine("Starting at {0}, {1} is connecting to {2}.",
                                  DateTime.UtcNow, node.Node.Address, node.Node.Realm);

                node.Node.DisconnectOnOverload = true;
                start_time = DateTime.UtcNow;

                Thread pthread = null;
                // Must do this to remove it after successfully creating the new node
                Node.StateChangeHandler add_node = null;
                if (node.PrivateNode != null)
                {
                    // Delayed add, removes ~15 seconds off bootstrapping time
                    add_node = delegate(Node n, Node.ConnectionState cs) {
                        if (cs != Node.ConnectionState.Connected)
                        {
                            return;
                        }
                        node.Node.StateChangeEvent -= add_node;

                        new Information(node.PrivateNode.Node, "PrivateBasicNode", node.SecurityOverlord);
                        pthread = new Thread(node.PrivateNode.Node.Connect);
                        pthread.Start();
                    };
                    node.Node.StateChangeEvent += add_node;
                }

                node.Node.Connect();

                if (node.PrivateNode != null)
                {
                    ApplicationNode pnode = node.PrivateNode;
                    pnode.Node.Disconnect();
                    if (pthread != null)
                    {
                        pthread.Join();
                    }
                }

                // Assist in garbage collection
                if (_xrm != null)
                {
                    _xrm.Remove(node.Node);
                }
                node      = null;
                _app_node = null;

                // DisconnectOnOverload seems to be having issues with pathing...
                foreach (var kvm in _type_to_pem)
                {
                    kvm.Value.Stop();
                }

                _type_to_pem.Clear();

                if (!_running)
                {
                    break;
                }

                DateTime now = DateTime.UtcNow;
                Thread.Sleep(sleep * 1000);

                if (now - start_time < TimeSpan.FromSeconds(sleep_max))
                {
                    sleep *= 2;
                    sleep  = (sleep > sleep_max) ? sleep_max : sleep;
                }
                else
                {
                    sleep /= 2;
                    sleep  = (sleep < sleep_min) ? sleep_min : sleep;
                }
            }
        }