/**************************************************************************/ public Queue <T> AddToNamedQueue(string Name, T Item) { Queue <T> NamedQueue; Boolean Proceed = true; if (this.NamedQueues.ContainsKey(Name)) { NamedQueue = this.NamedQueues[Name]; } else { throw(new MacroscopeNamedQueueException(string.Format("Named queue \"{0}\" does not exist", Name))); } if (this.NamedQueuesMode[Name] == MacroscopeNamedQueue <T> .MODE.USE_HISTORY) { lock (this.NamedQueuesHistory[Name]) { // TODO: This does not work with reference values if (this.NamedQueuesHistory[Name].ContainsKey(Item.ToString())) { Proceed = false; throw(new MacroscopeNamedQueueException(string.Format("Item already seen in queue \"{0}\"", Name))); } else { this.NamedQueuesHistory[Name].Add(Item.ToString(), true); } } } if (Proceed) { lock (this.NamedQueues[Name]) { if (!NamedQueue.Contains(Item)) { if (!this.NamedQueuesIndex[Name].ContainsKey(Item)) { lock (this.NamedQueuesIndex[Name]) { this.NamedQueuesIndex[Name].Add(Item, true); NamedQueue.Enqueue(Item); } } } } } return(NamedQueue); }
public void Enqueue(T message, string queueName) { _lock.AcquireWriterLock(500); var namedQueue = _queues.FirstOrDefault(nq => nq.Name == queueName); if (namedQueue == null) { namedQueue = new NamedQueue { Name = queueName, Queue = new Queue <T>() }; _queues.Add(namedQueue); } namedQueue.Queue.Enqueue(message); if (Queue_not_blocked(namedQueue)) { _signal.Set(); } _lock.ReleaseWriterLock(); }
public bool TryDequeue(string workerId, out T message) { _lock.AcquireWriterLock(500); try { message = default(T); Free_queue_locked_for_worker(workerId); NamedQueue namedQueue = null; for (var i = 0; i < _queues.Count(); i++) { namedQueue = Get_next_queue(); if (Queue_ready_for_dequeue(namedQueue)) { break; } namedQueue = null; } if (namedQueue == null) { _signal.Reset(); return(false); } message = namedQueue.Queue.Dequeue(); Lock_queue_for_worker(workerId, namedQueue); _signal.Reset(); return(true); } finally { _lock.ReleaseWriterLock(); } }
private bool Queue_ready_for_dequeue(NamedQueue namedQueue) { return(Queue_not_blocked(namedQueue) && namedQueue.Queue.Any()); }
private void Lock_queue_for_worker(string workerId, NamedQueue namedQueue) { _readLocks[namedQueue.Name] = workerId; }
private bool Queue_not_blocked(NamedQueue namedQueue) { return(!_readLocks.ContainsKey(namedQueue.Name)); }