Пример #1
0
        public void DijkstraBus()
        {
            sockets    = new Socket[n];
            potentials = new int[n];
            dialers    = new Dialer[n, 2];
            receivers  = new Aio[n];
            senders    = new Aio[n];
            listeners  = new Listener[n];

            random = new Random(1);

            for (int i = 0; i < n; i++)
            {
                Protocols.Bus0(out sockets[i]);
                listeners[i]  = new Listener(sockets[i], "ipc:///Dijkstra" + i.ToString());
                potentials[i] = int.MaxValue;
            }

            // every node connects to two other random nodes
            for (int i = 0; i < n; i++)
            {
                int target = random.Next(n);
                dialers[i, 0] = new Dialer(sockets[i], "ipc:///Dijkstra" + target.ToString());
                target        = random.Next(n);
                dialers[i, 1] = new Dialer(sockets[i], "ipc:///Dijkstra" + target.ToString());
            }

            // arm the aios
            for (int i = 0; i < n; i++)
            {
                senders[i]   = new Aio(Whatever, i);
                receivers[i] = new Aio(Received, i);
                sockets[i].Receive(receivers[i]);
            }
            Msg msg = new Msg(0);

            msg.AppendU32(0);
            potentials[0] = 0;
            sockets[0].Send(msg);
            //msg.Dispose();
            int oldCount = 0;

            for (;;)
            {
                System.Threading.Thread.Sleep(100);
                if (countReceived > oldCount)
                {
                    oldCount = countReceived;
                }
                else
                {
                    break;
                }
            }
            for (int i = 0; i < n; i++)
            {
                sockets[i].Close();
            }
            return;
        }
Пример #2
0
        void RPCClient1(uint ms)
        {
            Errno nngResult;
            Msg   msg = new Msg(0);

            nngResult = msg.AppendU32(ms);
            Assert.IsTrue(nngResult == Errno.ok);
            Cookie cookie = new Cookie();

            byte[] cookieData;
            cookie.cookie = RPCNextCookie(out cookieData);
            cookieCollection.Add(cookie);
            nngResult = msg.HeaderAppend(cookieData);
            Assert.IsTrue(nngResult == Errno.ok);
            nngResult = req0.Send(msg, 0);
            Assert.IsTrue(nngResult == Errno.ok);

            for (msg = null; msg == null;)
            {
                lock (cookie.thisLock)
                {
                    System.Threading.Monitor.Wait(cookie.thisLock);
                    msg = cookie.msg;
                }
            }
            msg.Free();
        }
Пример #3
0
        void Received(object o)
        {
            System.Threading.Interlocked.Increment(ref countReceived);
            int   j     = (int)o;
            Aio   aio   = receivers[j];
            Errno errno = aio.Result();

            if (errno != 0)
            {
                return;
            }
            Msg msg = aio.GetMsg();

            sockets[j].Receive(receivers[j]);

            uint receivedValue2;

            msg.ChopU32(out receivedValue2);
            int  receivedValue   = (int)receivedValue2;
            bool valueHasChanged = false;

            for (;;)
            {
                int oldValue = potentials[j];
                if (receivedValue + 1 < oldValue)
                {
                    int beforeExchange = System.Threading.Interlocked.CompareExchange(ref potentials[j], receivedValue + 1, oldValue);
                    if (beforeExchange == oldValue)
                    {
                        valueHasChanged = true;
                        break;
                    }
                }
                else
                {
                    break;
                }
            }
            if (valueHasChanged)
            {
                msg.Clear();
                msg.AppendU32((uint)potentials[j]);
                //sockets[j].Send(msg);
                lock (senders[j])
                {
                    senders[j].Wait();
                    senders[j].SetMsg(msg);
                    sockets[j].Send(senders[j]);
                }
            }
            else
            {
                msg.Dispose();
            }
        }