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