LMMS
Loading...
Searching...
No Matches
Allocator.h
Go to the documentation of this file.
1/*
2 ZynAddSubFX - a software synthesizer
3
4 Allocator.h - RT-Safe Memory Allocator
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 <cstdlib>
14#include <utility>
15#include <new>
16
17namespace zyncarla {
18
22{
23 public:
24 Allocator(void);
25 Allocator(const Allocator&) = delete;
26 virtual ~Allocator(void);
27
28 virtual void *alloc_mem(size_t mem_size) = 0;
29 virtual void dealloc_mem(void *memory) = 0;
30
39 template <typename T, typename... Ts>
40 T *alloc(Ts&&... ts)
41 {
42 void *data = alloc_mem(sizeof(T));
43 if(!data) {
45 throw std::bad_alloc();
46 }
48 return new (data) T(std::forward<Ts>(ts)...);
49 }
50
60 template <typename T, typename... Ts>
61 T *valloc(size_t len, Ts&&... ts)
62 {
63 T *data = (T*)alloc_mem(len*sizeof(T));
64 if(!data) {
66 throw std::bad_alloc();
67 }
69 for(unsigned i=0; i<len; ++i)
70 new ((void*)&data[i]) T(std::forward<Ts>(ts)...);
71
72 return data;
73 }
74
75 template <typename T>
76 void dealloc(T*&t)
77 {
78 if(t) {
79 t->~T();
80 dealloc_mem((void*)t);
81 t = nullptr;
82 }
83 }
84
85 //Destructor Free Version
86 template <typename T>
87 void devalloc(T*&t)
88 {
89 if(t) {
91 t = nullptr;
92 }
93 }
94
95 template <typename T>
96 void devalloc(size_t elms, T*&t)
97 {
98 if(t) {
99 for(size_t i=0; i<elms; ++i)
100 (t+i)->~T();
101
102 dealloc_mem(t);
103 t = nullptr;
104 }
105 }
106
107 void beginTransaction();
108 void endTransaction();
109
110 virtual void addMemory(void *, size_t mem_size) = 0;
111
112 //Return true if the current pool cannot allocate n chunks of chunk_size
113 virtual bool lowMemory(unsigned n, size_t chunk_size) const = 0;
114 bool memFree(void *pool) const;
115
116 //returns number of pools
117 int memPools() const;
118
119 int freePools() const;
120
121 unsigned long long totalAlloced() const;
122
124
125private:
126 const static size_t max_transaction_length = 256;
127
131
132 void rollbackTransaction();
133
139 void append_alloc_to_memory_transaction(void *new_memory) {
140 if (transaction_active) {
143 }
144 // TODO add log about transaction too long and memory transaction
145 // safety net being disabled
146 }
147 }
148
149};
150
153{
154 public:
155 void *alloc_mem(size_t mem_size);
156 void dealloc_mem(void *memory);
157 void addMemory(void *, size_t mem_size);
158 bool lowMemory(unsigned n, size_t chunk_size) const;
160};
162
165{
166 void not_allowed() const {
167 throw "(de)allocation forbidden"; // TODO: std exception
168 }
169public:
170 void *alloc_mem(size_t ) { return not_allowed(), nullptr; }
171 void dealloc_mem(void* ) { not_allowed(); } // TODO: more functions?
172 void addMemory(void *, size_t ) { not_allowed(); }
173 bool lowMemory(unsigned , size_t ) const { return not_allowed(), true; }
175};
176
177extern DummyAllocator DummyAlloc;
178
203
204 }
pool_t pool
Definition Util.cpp:167
the allocator for normal use
Definition Allocator.h:153
bool lowMemory(unsigned n, size_t chunk_size) const
Definition Allocator.cpp:89
void dealloc_mem(void *memory)
Definition Allocator.cpp:82
void addMemory(void *, size_t mem_size)
Definition Allocator.cpp:106
void * alloc_mem(size_t mem_size)
Definition Allocator.cpp:73
Allocator(void)
Definition Allocator.cpp:49
unsigned long long totalAlloced() const
Definition Allocator.cpp:198
void endTransaction()
Definition Allocator.cpp:147
int memPools() const
Definition Allocator.cpp:174
bool memFree(void *pool) const
Definition Allocator.cpp:153
virtual bool lowMemory(unsigned n, size_t chunk_size) const =0
virtual ~Allocator(void)
Definition Allocator.cpp:62
static const size_t max_transaction_length
Definition Allocator.h:126
void dealloc(T *&t)
Definition Allocator.h:76
T * alloc(Ts &&... ts)
Definition Allocator.h:40
virtual void addMemory(void *, size_t mem_size)=0
bool transaction_active
Definition Allocator.h:130
void devalloc(T *&t)
Definition Allocator.h:87
void rollbackTransaction()
Definition Allocator.cpp:203
void devalloc(size_t elms, T *&t)
Definition Allocator.h:96
virtual void dealloc_mem(void *memory)=0
Allocator(const Allocator &)=delete
struct AllocatorImpl * impl
Definition Allocator.h:123
virtual void * alloc_mem(size_t mem_size)=0
void beginTransaction()
Definition Allocator.cpp:140
void append_alloc_to_memory_transaction(void *new_memory)
Definition Allocator.h:139
T * valloc(size_t len, Ts &&... ts)
Definition Allocator.h:61
int freePools() const
Definition Allocator.cpp:185
size_t transaction_alloc_index
Definition Allocator.h:129
void * transaction_alloc_content[max_transaction_length]
Definition Allocator.h:128
Allocator(void)
Definition Allocator.cpp:49
the dummy allocator, which does not allow any allocation
Definition Allocator.h:165
void addMemory(void *, size_t)
Definition Allocator.h:172
void dealloc_mem(void *)
Definition Allocator.h:171
void * alloc_mem(size_t)
Definition Allocator.h:170
void not_allowed() const
Definition Allocator.h:166
bool lowMemory(unsigned, size_t) const
Definition Allocator.h:173
Allocator(void)
Definition Allocator.cpp:49
struct huft * t
Definition inflate.c:943
register unsigned i
Definition inflate.c:1575
Definition zynaddsubfx-src.cpp:569
void * data(next_t *n)
Definition Allocator.cpp:32
DummyAllocator DummyAlloc
Definition Allocator.cpp:23
AllocatorClass Alloc
Definition Allocator.h:161
Definition Allocator.cpp:39
int n
Definition crypt.c:458