Ejemplo n.º 1
0
 private void sendOutQueue(clientSiteState state, bool isManager)
 {
     try
     {
         sendOutQueueCore(state, isManager);
     }
     catch (Exception error)
     {
         Binding.WriteLog(LogSrc.Server, Log.MessageType.Error, "sendOutQueueCore leaked: " + error.ToMessageWithType(), "MpxServerTransport.sendOutQueue()", error);
     }
 }
Ejemplo n.º 2
0
        private void sendOutQueueCore(clientSiteState state, bool isManager)
        {
            const int MAX_SPINS = 50;
            int       spins     = 0;

            while (Interlocked.CompareExchange(ref state.LOCK_TOKEN, 1, 0) != 0)
            {
                if (!isManager)
                {
                    return;
                }
                if (spins > MAX_SPINS)
                {
                    return;
                }
                spins++;
                Thread.Sleep(10 + ExternalRandomGenerator.Instance.NextScaledRandomInteger(1, 10));
            }

            try
            { //may block on this thread until send succeeds
                for (var i = 0; (!isManager && i == 0) || (isManager && i < GENERATIONS); i++)
                {
                    var queue = state.OutQueues[i];

                    ResponseMsg response;
                    while (Running && queue.TryDequeue(out response))
                    {
                        if (!sendResponse(response))
                        {
                            if (i < GENERATIONS - 1)
                            {
                                state.OutQueues[i + 1].Enqueue(response);//put back in queue what did not go in older gen queue
                            }
                        }
                    } //while
                }     //for
            }
            finally
            {
                Interlocked.Exchange(ref state.LOCK_TOKEN, 0);
            }
        }