private void MessageLoop() { bool receivematch = false; object msg = null; IBehavior tcs = null; bool patternmatch = false; int oldReceive = Interlocked.Exchange(ref fShared.fReceive, fShared.fReceive); #if DEBUG_MSG while (Interlocked.CompareExchange(ref fShared.fMessCount, 0, 0) != 0) #else while (true) #endif { // get message msg = ReceiveMessage(); if (msg != null) { receivematch = false; tcs = PatternMatching(msg); patternmatch = tcs != null; // receive pattern if (!patternmatch) { tcs = ReceiveMatching(msg); receivematch = tcs != null; } } #if DEBUG_MSG #else else { break; } #endif // miss if (!patternmatch && !receivematch && msg != null) { fMailBox.AddMiss(msg); } if (patternmatch) { if (Interlocked.CompareExchange(ref fShared.fReceive, fShared.fReceive, 0) == 0) { tcs.StandardApply(msg); patternmatch = false; if (Interlocked.CompareExchange(ref fShared.fReceive, fShared.fReceive, 0) != 0) { break; } } } if (patternmatch || receivematch) { break; } } if (patternmatch) { tcs.StandardApply(msg); } if (receivematch) { AddMissedMessages(); Interlocked.Decrement(ref fShared.fReceive); tcs.StandardCompletion.SetResult(msg); } int newReceive = Interlocked.Exchange(ref fShared.fReceive, fShared.fReceive); if ((newReceive > 0) && (oldReceive != newReceive)) { AddMissedMessages(); } Interlocked.Exchange(ref fShared.fInTask, 0); #if DEBUG_MSG if (Interlocked.CompareExchange(ref fShared.fMessCount, 0, 0) != 0) #else if (!fMailBox.IsEmpty) #endif { TrySetInTask(); } }