LMMS
Loading...
Searching...
No Matches
MultiPseudoStack.h
Go to the documentation of this file.
1/*
2 ZynAddSubFX - a software synthesizer
3
4 MultiPseudoStack.h - Multiple-Writer Lock Free Datastructure
5 Copyright (C) 2016 Mark McCurry
6
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License
9 as published by the Free Software Foundation; either version 2
10 of the License, or (at your option) any later version.
11*/
12#pragma once
13#include <atomic>
14#include <cassert>
15
16namespace zyncarla {
17
18//XXX rename this thing
19typedef struct QueueListItem qli_t;
21{
22 QueueListItem(void);
23 char *memory;
25};
26
27
28//Many reader many writer
30{
31 qli_t *const data;
32 const int elms;
33 std::atomic<uint32_t> *tag;
34 std::atomic<int32_t> next_r;
35 std::atomic<int32_t> next_w;
36 std::atomic<int32_t> avail;
37 public:
38 LockFreeQueue(qli_t *data_, int n);
39 ~LockFreeQueue(void);
40 qli_t *read(void);
41 void write(qli_t *Q);
42};
43
44
45/*
46 * Many reader Many writer capiable queue
47 * - lock free
48 * - allocation free (post initialization)
49 */
51{
55
56 public:
57 MultiQueue(void);
58 ~MultiQueue(void);
59 void dump(void);
60 qli_t *alloc(void) { return m_free.read(); }
61 void free(qli_t *q) { m_free.write(q); }
62 void write(qli_t *q) { m_msgs.write(q); }
63 qli_t *read(void) { return m_msgs.read(); }
64};
65
66}
Definition MultiPseudoStack.h:30
~LockFreeQueue(void)
Definition MultiPseudoStack.cpp:34
std::atomic< int32_t > next_r
Definition MultiPseudoStack.h:34
std::atomic< int32_t > next_w
Definition MultiPseudoStack.h:35
qli_t * read(void)
Definition MultiPseudoStack.cpp:40
const int elms
Definition MultiPseudoStack.h:32
std::atomic< int32_t > avail
Definition MultiPseudoStack.h:36
void write(qli_t *Q)
Definition MultiPseudoStack.cpp:80
std::atomic< uint32_t > * tag
Definition MultiPseudoStack.h:33
qli_t *const data
Definition MultiPseudoStack.h:31
LockFreeQueue(qli_t *data_, int n)
Definition MultiPseudoStack.cpp:26
qli_t * read(void)
Definition MultiPseudoStack.h:63
MultiQueue(void)
Definition MultiPseudoStack.cpp:102
LockFreeQueue m_free
Definition MultiPseudoStack.h:53
LockFreeQueue m_msgs
Definition MultiPseudoStack.h:54
qli_t * alloc(void)
Definition MultiPseudoStack.h:60
void free(qli_t *q)
Definition MultiPseudoStack.h:61
qli_t * pool
Definition MultiPseudoStack.h:52
void write(qli_t *q)
Definition MultiPseudoStack.h:62
~MultiQueue(void)
Definition MultiPseudoStack.cpp:114
unsigned int uint32_t
Definition mid.cpp:100
Definition zynaddsubfx-src.cpp:569
struct QueueListItem qli_t
Definition MultiPseudoStack.h:19
Definition MultiPseudoStack.h:21
uint32_t size
Definition MultiPseudoStack.h:24
QueueListItem(void)
Definition MultiPseudoStack.cpp:21
char * memory
Definition MultiPseudoStack.h:23
int n
Definition crypt.c:458
register uch * q
Definition fileio.c:817