// Used for private chats, groups, supergroups and channels when they are referenced by ID private void WaitOneInternalLocked(long chatId) { ManualResetEvent mre = null; if (chatId > 0) { lock (QueueLock) { if (RequestCounts.TryGetValue(chatId, out ChatRequestCount ChatRequestCount)) { if (ChatRequestCount.GetRequestCount(PrivateChatIntervals) <= PrivateChatMaxBurst) { ChatRequestCount.Increment(); mre = WaitOneInternalUnlocked(); } else { var requestItem = new ScheduledRequestItem(TimerIntervals, chatId); PrivateChatQueue.AddLast(requestItem); mre = requestItem.MRE; } } else { RequestCounts.Add(chatId, new ChatRequestCount(1, PrivateChatIntervals)); mre = WaitOneInternalUnlocked(); } } } else { lock (QueueLock) { if (RequestCounts.TryGetValue(chatId, out ChatRequestCount ChatRequestCount)) { if (ChatRequestCount.GetRequestCount(GroupChatIntervals) <= GroupChatMaxBurst) { ChatRequestCount.Increment(); mre = WaitOneInternalUnlocked(); } else { var requestItem = new ScheduledRequestItem(TimerIntervals, chatId); GroupChatQueue.AddLast(requestItem); mre = requestItem.MRE; } } else { RequestCounts.Add(chatId, new ChatRequestCount(1, GroupChatIntervals)); mre = WaitOneInternalUnlocked(); } } } mre?.WaitOne(); return; }
// Returns a ManualResetEvent if the request was enqueued or null if it can be executed immediately private ManualResetEvent WaitOneInternalUnlocked() { ManualResetEvent mre; if (GeneralRequestCount <= GeneralMaxBurst) { GeneralRequestCount++; return(null); } else { var requestItem = new ScheduledRequestItem(TimerIntervals); GeneralQueue.AddLast(requestItem); mre = requestItem.MRE; } return(mre); }
private LinkedListNode <ScheduledRequestItem> InsertToGeneralQueue(ScheduledRequestItem requestItem, LinkedListNode <ScheduledRequestItem> searchFrom) { var node = searchFrom; while (node != null && requestItem.TimerIntervalWhenAdded > node.Value.TimerIntervalWhenAdded) { node = node.Next; } if (node == null) { return(GeneralQueue.AddLast(requestItem)); } else { return(GeneralQueue.AddBefore(node, requestItem)); } }