Macaulay2 Engine
Loading...
Searching...
No Matches
memblock.hpp
Go to the documentation of this file.
1
// Copyright 2004 Michael E. Stillman
2
#ifndef __memblock_h_
3
#define __memblock_h_
4
34
35
#include "
newdelete.hpp
"
36
37
template
<
typename
T,
long
int
NSLAB = 4092>
38
class
F4MemoryBlock
:
public
our_new_delete
39
{
40
struct
slab
:
public
our_new_delete
41
{
42
slab
*
next
;
43
T
block
[NSLAB];
44
};
45
46
slab
*
first_slab
;
47
slab
*
current_slab
;
48
slab
*
last_slab
;
49
T
*
next_free
;
/* points into current_slab */
50
51
private
:
52
slab *
new_slab
();
53
54
public
:
55
F4MemoryBlock
();
56
~F4MemoryBlock
();
57
58
void
reset
();
59
60
T
*
reserve
(
int
len);
// returns space for len T's.
61
void
intern
(
int
len);
// increments
62
T
*
allocate
(
int
len = 1);
// reserve and intern
63
64
int
n_slabs
()
const
;
65
66
long
memoryUsage
()
67
const
;
// total number of bytes allocated in slabs (plus size of this)
68
};
69
71
// F4MemoryBlock //
73
74
template
<
typename
T,
long
int
NSLAB>
75
F4MemoryBlock<T, NSLAB>::F4MemoryBlock
()
76
:
first_slab
(0),
current_slab
(0),
last_slab
(0),
next_free
(0)
77
{
78
first_slab
=
new_slab
();
79
current_slab
=
first_slab
;
80
last_slab
=
first_slab
;
81
next_free
=
current_slab
->block;
82
}
83
84
template
<
typename
T,
long
int
NSLAB>
85
F4MemoryBlock<T, NSLAB>::~F4MemoryBlock
()
86
{
87
// Destroy the slabs one by one
88
while
(
first_slab
!= 0)
89
{
90
slab
*tmp =
first_slab
;
91
first_slab
=
first_slab
->next;
92
delete
tmp;
93
}
94
95
current_slab
= 0;
96
last_slab
= 0;
97
next_free
= 0;
98
}
99
100
template
<
typename
T,
long
int
NSLAB>
101
typename
F4MemoryBlock<T, NSLAB>::slab
*
F4MemoryBlock<T, NSLAB>::new_slab
()
102
{
103
slab
*
result
=
new
slab
;
104
result
->next =
nullptr
;
105
return
result
;
106
}
107
108
template
<
typename
T,
long
int
NSLAB>
109
void
F4MemoryBlock<T, NSLAB>::reset
()
110
{
111
current_slab
=
first_slab
;
112
next_free
=
current_slab
->block;
113
}
114
115
template
<
typename
T,
long
int
NSLAB>
116
T
*
F4MemoryBlock<T, NSLAB>::reserve
(
int
len)
117
{
118
if
(
next_free
+ len >
current_slab
->block + NSLAB)
119
{
120
if
(
current_slab
->next ==
nullptr
)
121
{
122
last_slab
->next =
new_slab
();
123
last_slab
=
last_slab
->next;
124
current_slab
=
last_slab
;
125
}
126
else
127
{
128
current_slab
=
current_slab
->next;
129
}
130
next_free
=
current_slab
->block;
131
}
132
return
next_free
;
133
}
134
135
template
<
typename
T,
long
int
NSLAB>
136
void
F4MemoryBlock<T, NSLAB>::intern
(
int
len)
137
{
138
next_free
+= len;
139
}
140
141
template
<
typename
T,
long
int
NSLAB>
142
T
*
F4MemoryBlock<T, NSLAB>::allocate
(
int
len)
143
{
144
T
*
result
=
reserve
(len);
145
next_free
+= len;
146
return
result
;
147
}
148
149
template
<
typename
T,
long
int
NSLAB>
150
int
F4MemoryBlock<T, NSLAB>::n_slabs
()
const
151
{
152
int
result
= 0;
153
for
(
slab
*
p
=
first_slab
;
p
!= 0;
p
=
p
->next)
result
++;
154
return
result
;
155
}
156
157
template
<
typename
T,
long
int
NSLAB>
158
long
F4MemoryBlock<T, NSLAB>::memoryUsage
()
const
159
{
160
long
result
=
sizeof
(*this);
161
result
+=
n_slabs
() *
sizeof
(
slab
);
162
return
result
;
163
}
164
165
#endif
166
167
// Local Variables:
168
// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
169
// End:
F4MemoryBlock::next_free
T * next_free
Definition
memblock.hpp:49
F4MemoryBlock::current_slab
slab * current_slab
Definition
memblock.hpp:47
F4MemoryBlock::n_slabs
int n_slabs() const
Definition
memblock.hpp:150
F4MemoryBlock::intern
void intern(int len)
Definition
memblock.hpp:136
F4MemoryBlock::~F4MemoryBlock
~F4MemoryBlock()
Definition
memblock.hpp:85
F4MemoryBlock::reset
void reset()
Definition
memblock.hpp:109
F4MemoryBlock::new_slab
slab * new_slab()
Definition
memblock.hpp:101
F4MemoryBlock::last_slab
slab * last_slab
Definition
memblock.hpp:48
F4MemoryBlock::memoryUsage
long memoryUsage() const
Definition
memblock.hpp:158
F4MemoryBlock::allocate
T * allocate(int len=1)
Definition
memblock.hpp:142
F4MemoryBlock::first_slab
slab * first_slab
Definition
memblock.hpp:46
F4MemoryBlock::F4MemoryBlock
F4MemoryBlock()
Definition
memblock.hpp:75
F4MemoryBlock::reserve
T * reserve(int len)
Definition
memblock.hpp:116
p
int p
Definition
godboltTest.cpp:36
result
VALGRIND_MAKE_MEM_DEFINED & result(result)
newdelete.hpp
our_new_delete — per-class opt-in routing of new / delete through bdwgc.
F4MemoryBlock::slab::next
slab * next
Definition
memblock.hpp:42
F4MemoryBlock::slab::block
T block[NSLAB]
Definition
memblock.hpp:43
F4MemoryBlock::slab
Definition
memblock.hpp:41
our_new_delete
Definition
newdelete.hpp:116
T
#define T
Definition
table.c:13
Macaulay2
e
f4
memblock.hpp
Generated on
for Macaulay2 Engine by
1.15.0