예제 #1
0
        private unsafe void ReadLoop()
        {
            for (;;)
            {
                streamHandler.FillReadBuffer(sizeof(ushort));
                fixed(byte *buf = &streamHandler.readBuffer[0])
                {
                    streamHandler.fixedReadBuffer = buf;
                    ushort callId;

                    streamHandler.Read(out callId);
                    RemoteCall newCall;

                    while (newCalls.TryTake(out newCall))
                    {
                        Stack <RemoteCall> stack;
                        if (!threadCallStack.TryGetValue(newCall.localThreadId, out stack))
                        {
                            stack = new Stack <RemoteCall>();
                            threadCallStack.Add(newCall.localThreadId, stack);
                        }
                        stack.Push(newCall);
                    }
                    if (callId == ushort.MaxValue)
                    {
                        int threadId;
                        streamHandler.Read(out threadId);
                        var rc = threadCallStack[threadId].Pop();
                        rc.ReadResponse(streamHandler);
                        lock (rc) {
                            Monitor.PulseAll(rc);
                        }
                    }
                    else
                    {
                        var call = RemoteCallFactory.ForCallId((RemoteCallId)callId);
                        call.ReadRequest(streamHandler);
                        if (call.localThreadId != 0)
                        {
                            var rc = threadCallStack[call.localThreadId].Peek();
                            rc.nextCall = call;
                            lock (rc) {
                                Monitor.PulseAll(rc);
                            }
                        }
                        else
                        {
                            WorkerPool.EnqueueTask(() => {
                                call.Execute(this);
                                if (!call.returnImmediately)
                                {
                                    Write(call.WriteResponse);
                                }
                            });
                        }
                    }
                    streamHandler.fixedReadBuffer = null;
                }
            }
        }
예제 #2
0
 private void ReadLoop()
 {
     for (;;)
     {
         var        callId = streamHandler.ReadUInt16();
         RemoteCall newCall;
         while (newCalls.TryTake(out newCall))
         {
             Stack <RemoteCall> stack;
             if (!threadCallStack.TryGetValue(newCall.localThreadId, out stack))
             {
                 stack = new Stack <RemoteCall>();
                 threadCallStack.Add(newCall.localThreadId, stack);
             }
             stack.Push(newCall);
         }
         if (callId == ushort.MaxValue)
         {
             var threadId = streamHandler.ReadInt32();
             var rc       = threadCallStack[threadId].Pop();
             rc.ReadResponse(streamHandler);
             lock (rc) {
                 Monitor.PulseAll(rc);
             }
         }
         else
         {
             var call = RemoteCallFactory.ForCallId((RemoteCallId)callId);
             call.ReadRequest(streamHandler);
             if (call.localThreadId != 0)
             {
                 var rc = threadCallStack[call.localThreadId].Peek();
                 rc.nextCall = call;
                 lock (rc) {
                     Monitor.PulseAll(rc);
                 }
             }
             else
             {
                 WorkerPool.EnqueueTask(() => {
                     call.Execute(this);
                     if (!call.returnImmediately)
                     {
                         Write(call.WriteResponse);
                     }
                 });
             }
         }
     }
 }
 private void ReadLoop()
 {
     for (; ;)
     {
         var callId = streamHandler.ReadUInt16();
         if (callId == ushort.MaxValue)
         {
             var threadId = streamHandler.ReadInt32();
             var call     = callStack.Pop(threadId);
             call.ReadResponse(streamHandler);
         }
         else
         {
             var call = RemoteCallFactory.ForCallId((RemoteCallId)callId);
             call.ReadRequest(this);
         }
     }
 }