From 4988d75f19e81c58e2cfdc068c5638b95ae9e314 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 28 Nov 2020 10:29:50 +0100 Subject: Remove Queue and use std::queue in JackDriver Jack notification handlers do not need to be realtime safe. --- src/JackDriver.cpp | 2 - src/JackDriver.hpp | 4 +- src/Queue.hpp | 137 ----------------------------------------------------- 3 files changed, 2 insertions(+), 141 deletions(-) delete mode 100644 src/Queue.hpp (limited to 'src') diff --git a/src/JackDriver.cpp b/src/JackDriver.cpp index 2807791..e20613c 100644 --- a/src/JackDriver.cpp +++ b/src/JackDriver.cpp @@ -22,7 +22,6 @@ #include "PatchageCanvas.hpp" #include "PatchageEvent.hpp" #include "PatchageModule.hpp" -#include "Queue.hpp" #include "patchage_config.h" #ifdef HAVE_JACK_METADATA @@ -46,7 +45,6 @@ JackDriver::JackDriver(Patchage* app, ILog& log) : _app(app) , _log(log) , _client(nullptr) - , _events(128) , _last_pos{} , _buffer_size(0) , _xruns(0) diff --git a/src/JackDriver.hpp b/src/JackDriver.hpp index 01185b2..abf9008 100644 --- a/src/JackDriver.hpp +++ b/src/JackDriver.hpp @@ -18,12 +18,12 @@ #define PATCHAGE_JACKDRIVER_HPP #include "Driver.hpp" -#include "Queue.hpp" #include #include #include +#include #include class ILog; @@ -122,7 +122,7 @@ private: ILog& _log; jack_client_t* _client; - Queue _events; + std::queue _events; std::mutex _shutdown_mutex; diff --git a/src/Queue.hpp b/src/Queue.hpp deleted file mode 100644 index b951b56..0000000 --- a/src/Queue.hpp +++ /dev/null @@ -1,137 +0,0 @@ -/* This file is part of Patchage. - * Copyright 2007-2020 David Robillard - * - * Patchage is free software: you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or any later version. - * - * Patchage 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 General Public License for details. - * - * You should have received a copy of the GNU General Public License along with - * Patchage. If not, see . - */ - -#ifndef PATCHAGE_QUEUE_HPP -#define PATCHAGE_QUEUE_HPP - -#include -#include -#include - -/** Realtime-safe single-reader single-writer queue */ -template -class Queue -{ -public: - /** @param size Size in number of elements */ - explicit Queue(size_t size); - - Queue(const Queue&) = delete; - Queue& operator=(const Queue&) = delete; - - Queue(Queue&&) = delete; - Queue& operator=(Queue&&) = delete; - - ~Queue(); - - // Any thread: - - inline size_t capacity() const { return _size - 1; } - - // Write thread: - - inline bool full() const; - inline bool push(const T& elem); - - // Read thread: - - inline bool empty() const; - inline T& front() const; - inline void pop(); - -private: - std::atomic _front; ///< Index to front of queue - std::atomic _back; ///< Index to back of queue (one past end) - const size_t _size; ///< Size of `_objects` (at most _size-1) - T* const _objects; ///< Fixed array containing queued elements -}; - -template -Queue::Queue(size_t size) - : _front(0) - , _back(0) - , _size(size + 1) - , _objects(new T[_size]) -{ - assert(size > 1); -} - -template -Queue::~Queue() -{ - delete[] _objects; -} - -/** Return whether or not the queue is empty. - */ -template -inline bool -Queue::empty() const -{ - return (_back.load() == _front.load()); -} - -/** Return whether or not the queue is full. - */ -template -inline bool -Queue::full() const -{ - return (((_front.load() - _back.load() + _size) % _size) == 1); -} - -/** Return the element at the front of the queue without removing it - */ -template -inline T& -Queue::front() const -{ - return _objects[_front.load()]; -} - -/** Push an item onto the back of the Queue - realtime-safe, not thread-safe. - * - * @returns true if `elem` was successfully pushed onto the queue, - * false otherwise (queue is full). - */ -template -inline bool -Queue::push(const T& elem) -{ - if (full()) { - return false; - } - - const unsigned back = _back.load(); - _objects[back] = elem; - _back = (back + 1) % _size; - return true; -} - -/** Pop an item off the front of the queue - realtime-safe, not thread-safe. - * - * It is a fatal error to call pop() when the queue is empty. - */ -template -inline void -Queue::pop() -{ - assert(!empty()); - assert(_size > 0); - - _front = (_front.load() + 1) % (_size); -} - -#endif // PATCHAGE_QUEUE_HPP -- cgit v1.2.1