/// <summary> /// Returns the next element from the queue without removing it /// </summary> /// <returns>A pointer to the next element from the queue</returns> /// <exception cref="InvalidOperationException">If the queue is empty</exception> public T *Peek() { AtomicNode *root = AcquireRoot(); bool empty = (root->Next == 0); var payload = (T *)(empty ? 0 : ((AtomicNode *)root->Next)->Payload); ReleaseRoot(root); if (empty) { throw new InvalidOperationException("Queue is empty"); } return(payload); }
/// <summary> /// Add an element to the queue /// </summary> /// <param name="payload">A pointer to the element to be added</param> public void Enqueue(T *payload) { var node = (long)Acquire((long)payload, 0); AtomicNode *root = AcquireRoot(); var last = (AtomicNode *)root->Payload; root->Payload = node; if (last != null) { last->Next = node; } if (root->Next == 0) { // Queue was empty root->Next = node; } ReleaseRoot(root); }