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; }
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(); }
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(); } }