lmms
Cross-platform music production software
Toggle main menu visibility
Loading...
Searching...
No Matches
include
LocklessRingBuffer.h
Go to the documentation of this file.
1
/*
2
* LocklessRingBuffer.h - LMMS wrapper for a lockless ringbuffer library
3
*
4
* Copyright (c) 2019 Martin Pavelek <he29/dot/HS/at/gmail/dot/com>
5
*
6
* This file is part of LMMS - https://lmms.io
7
*
8
* This program is free software; you can redistribute it and/or
9
* modify it under the terms of the GNU General Public
10
* License as published by the Free Software Foundation; either
11
* version 2 of the License, or (at your option) any later version.
12
*
13
* This program is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
* General Public License for more details.
17
*
18
* You should have received a copy of the GNU General Public
19
* License along with this program (see COPYING); if not, write to the
20
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21
* Boston, MA 02110-1301 USA.
22
*
23
*/
24
25
#ifndef LMMS_LOCKLESS_RING_BUFFER_H
26
#define LMMS_LOCKLESS_RING_BUFFER_H
27
28
#include <QMutex>
29
#include <QWaitCondition>
30
31
#include <ringbuffer/ringbuffer.h>
32
33
#include "
LmmsTypes.h
"
34
35
namespace
lmms
36
{
37
39
template
<
class
T>
40
class
LocklessRingBuffer
41
{
42
template
<
class
_T>
43
friend
class
LocklessRingBufferReader
;
44
public
:
45
LocklessRingBuffer
(std::size_t sz) :
m_buffer
(sz)
46
{
47
m_buffer
.touch();
// reserve storage space before realtime operation starts
48
}
49
~LocklessRingBuffer
() =
default
;
50
51
std::size_t
capacity
()
const
{
return
m_buffer
.maximum_eventual_write_space();}
52
std::size_t
free
()
const
{
return
m_buffer
.write_space();}
53
void
wakeAll
() {
m_notifier
.wakeAll();}
54
std::size_t
write
(
const
T *src, std::size_t cnt,
bool
notify =
false
)
55
{
56
std::size_t written =
LocklessRingBuffer<T>::m_buffer
.write(src, cnt);
57
// Let all waiting readers know new data are available.
58
if
(notify) {
LocklessRingBuffer<T>::m_notifier
.wakeAll();}
59
return
written;
60
}
61
void
mlock
() {
m_buffer
.mlock(); }
62
63
protected
:
64
ringbuffer_t<T>
m_buffer
;
65
QWaitCondition
m_notifier
;
66
};
67
68
70
template
<
class
T>
71
class
LocklessRingBufferReader
:
public
ringbuffer_reader_t<T>
72
{
73
public
:
74
LocklessRingBufferReader
(
LocklessRingBuffer<T>
&rb) :
75
ringbuffer_reader_t<T>(rb.m_buffer),
76
m_notifier
(&rb.
m_notifier
) {};
77
78
bool
empty
()
const
{
return
!this->read_space();}
79
void
waitForData
()
80
{
81
QMutex useless_lock;
82
useless_lock.lock();
83
m_notifier
->wait(&useless_lock);
84
useless_lock.unlock();
85
}
86
private
:
87
QWaitCondition *
m_notifier
;
88
};
89
90
91
}
// namespace lmms
92
93
#endif
// LMMS_LOCKLESS_RING_BUFFER_H
LmmsTypes.h
lmms::LocklessRingBuffer
A convenience layer for a realtime-safe and thread-safe multi-reader ringbuffer.
Definition
LocklessRingBuffer.h:41
lmms::LocklessRingBuffer::free
std::size_t free() const
Definition
LocklessRingBuffer.h:52
lmms::LocklessRingBuffer::capacity
std::size_t capacity() const
Definition
LocklessRingBuffer.h:51
lmms::LocklessRingBuffer::mlock
void mlock()
Definition
LocklessRingBuffer.h:61
lmms::LocklessRingBuffer::m_notifier
QWaitCondition m_notifier
Definition
LocklessRingBuffer.h:65
lmms::LocklessRingBuffer::~LocklessRingBuffer
~LocklessRingBuffer()=default
lmms::LocklessRingBuffer::LocklessRingBuffer
LocklessRingBuffer(std::size_t sz)
Definition
LocklessRingBuffer.h:45
lmms::LocklessRingBuffer::write
std::size_t write(const T *src, std::size_t cnt, bool notify=false)
Definition
LocklessRingBuffer.h:54
lmms::LocklessRingBuffer::m_buffer
ringbuffer_t< T > m_buffer
Definition
LocklessRingBuffer.h:64
lmms::LocklessRingBuffer::wakeAll
void wakeAll()
Definition
LocklessRingBuffer.h:53
lmms::LocklessRingBuffer::LocklessRingBufferReader
friend class LocklessRingBufferReader
Definition
LocklessRingBuffer.h:43
lmms::LocklessRingBufferReader::LocklessRingBufferReader
LocklessRingBufferReader(LocklessRingBuffer< T > &rb)
Definition
LocklessRingBuffer.h:74
lmms::LocklessRingBufferReader::empty
bool empty() const
Definition
LocklessRingBuffer.h:78
lmms::LocklessRingBufferReader::waitForData
void waitForData()
Definition
LocklessRingBuffer.h:79
lmms::LocklessRingBufferReader::m_notifier
QWaitCondition * m_notifier
Definition
LocklessRingBuffer.h:87
lmms
Definition
RemotePluginBase.cpp:34
Generated on
for lmms by
1.18.0