/******************************************************************************** * * * L o c k - F r e e Q u e u e * * * ********************************************************************************* * Copyright (C) 2012,2024 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public License * * along with this program. If not, see * ********************************************************************************/ #ifndef FXLFQUEUE_H #define FXLFQUEUE_H namespace FX { /// Lock-free queue of void pointers class FXAPI FXLFQueue { private: FXPtrList items; // Item buffer volatile FXuint whead; // Head write pointer volatile FXuint wtail; // Tail write pointer volatile FXuint rhead; // Head read pointer volatile FXuint rtail; // Tail read pointer private: FXLFQueue(const FXLFQueue&); FXLFQueue &operator=(const FXLFQueue&); public: /// Create initially empty queue FXLFQueue(); /// Create queue with initial size, which must be a power of two FXLFQueue(FXuint sz); /// Change size of queue (must be power of two); return true if success FXbool setSize(FXuint sz); /// Return size FXuint getSize() const { return (FXuint)items.no(); } /// Return number of used slots FXuint getUsed() const; /// Return number of free slots FXuint getFree() const; /// If queue not full, can write if no other producers FXbool isFull() const; /// If queue not empty, can read if no other consumers FXbool isEmpty() const; /// Add item to queue, return true if success FXbool push(FXptr ptr); /// Remove item from queue, return true if success FXbool pop(FXptr& ptr); /// Destroy queue ~FXLFQueue(); }; /// Lock-free queue of pointers to TYPE template class FXLFQueueOf : public FXLFQueue { public: FXLFQueueOf(){} FXLFQueueOf(FXuint sz):FXLFQueue(sz){} FXbool push(TYPE* ptr){ return FXLFQueue::push((FXptr)ptr); } FXbool pop(TYPE*& ptr){ return FXLFQueue::pop((FXptr&)ptr); } }; } #endif