Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/ElmerGUI/netgen/libsrc/general/dynamicmem.cpp
3206 views
1
#include <iostream>
2
#include <iomanip>
3
4
#ifdef SSE
5
#include <emmintrin.h>
6
#endif
7
8
#include <myadt.hpp>
9
using namespace std;
10
11
namespace netgen
12
{
13
14
BaseDynamicMem * BaseDynamicMem::first = 0;
15
BaseDynamicMem * BaseDynamicMem::last = 0;
16
17
18
BaseDynamicMem :: BaseDynamicMem ()
19
{
20
prev = last;
21
next = 0;
22
23
if (last) last->next = this;
24
last = this;
25
if (!first) first = this;
26
27
size = 0;
28
ptr = 0;
29
name = 0;
30
}
31
32
BaseDynamicMem :: ~BaseDynamicMem ()
33
{
34
Free();
35
36
if (next) next->prev = prev;
37
else last = prev;
38
if (prev) prev->next = next;
39
else first = next;
40
41
delete [] name;
42
}
43
44
void BaseDynamicMem :: SetName (const char * aname)
45
{
46
delete [] name;
47
if (aname)
48
{
49
name = new char[strlen(aname)+1];
50
strcpy (name, aname);
51
}
52
}
53
54
55
void BaseDynamicMem :: Alloc (size_t s)
56
{
57
size = s;
58
ptr = new char[s];
59
60
if (!ptr)
61
{
62
cerr << "BaseynamicMem, cannot allocate " << s << " bytes" << endl;
63
Print ();
64
throw ("BaseDynamicMem::Alloc: out of memory");
65
}
66
// ptr = (char*)malloc (s);
67
// ptr = (char*) _mm_malloc (s,16);
68
}
69
70
void BaseDynamicMem :: ReAlloc (size_t s)
71
{
72
if (size == s) return;
73
74
char * old = ptr;
75
ptr = new char[s];
76
77
if (!ptr)
78
{
79
cerr << "BaseynamicMem, cannot Reallocate " << s << " bytes" << endl;
80
Print ();
81
throw ("BaseDynamicMem::Alloc: out of memory");
82
}
83
84
85
// ptr = (char*)malloc(s);
86
// ptr = (char*) _mm_malloc (s,16);
87
memmove (ptr, old, (s < size) ? s : size);
88
delete [] old;
89
// free (old);
90
// _mm_free (old);
91
size = s;
92
}
93
94
void BaseDynamicMem :: Free ()
95
{
96
delete [] ptr;
97
// free (ptr);
98
// _mm_free (ptr);
99
ptr = 0;
100
}
101
102
void BaseDynamicMem :: Swap (BaseDynamicMem & m2)
103
{
104
size_t hi;
105
char * cp;
106
hi = size; size = m2.size; m2.size = hi;
107
cp = ptr; ptr = m2.ptr; m2.ptr = cp;
108
cp = name; name = m2.name; m2.name = cp;
109
}
110
111
112
void BaseDynamicMem :: Print ()
113
{
114
cout << "****************** Dynamic Mem Report ****************" << endl;
115
BaseDynamicMem * p = first;
116
size_t mem = 0;
117
int cnt = 0;
118
while (p)
119
{
120
mem += p->size;
121
cnt++;
122
123
cout << setw(10) << p->size << " Bytes";
124
cout << ", addr = " << (void*)p->ptr;
125
if (p->name)
126
cout << " in block " << p->name;
127
cout << endl;
128
129
p = p->next;
130
}
131
132
if (mem > 100000000)
133
cout << "memory in dynamic memory: " << mem/1048576 << " MB" << endl;
134
else if (mem > 100000)
135
cout << "memory in dynamic memory: " << mem/1024 << " kB" << endl;
136
else
137
cout << "memory in dynamic memory: " << mem << " Bytes" << endl;
138
cout << "number of blocks: " << cnt << endl;
139
// cout << "******************************************************" << endl;
140
}
141
142
143
#pragma warning(push)
144
#ifdef __INTEL_COMPILER
145
#pragma warning(disable:1684)
146
#endif
147
148
void BaseDynamicMem :: GetUsed (int nr, char * ch)
149
{
150
BaseDynamicMem * p = first;
151
152
for (int i = 0; i < nr; i++)
153
ch[i] = '0';
154
155
while (p)
156
{
157
long unsigned hptr = (long unsigned) (p->ptr);
158
// uintptr_t hptr = reinterpret_cast<uintptr_t>(p->ptr); //??
159
160
hptr /= (1024*1024);
161
hptr /= (4096/nr);
162
163
size_t blocks = p->size / (1024*1024);
164
blocks /= (4096/nr);
165
166
// cout << "ptr = " << (void*)(p->ptr) << ", size = " << p->size << ", hptr = " << hptr << " blocks = " << blocks << endl;
167
168
for (size_t i = 0; i <= blocks; i++)
169
ch[hptr+i] = '1';
170
171
p = p->next;
172
}
173
174
{
175
176
BaseMoveableMem * pm = BaseMoveableMem::first;
177
while (pm)
178
{
179
long unsigned hptr = (long unsigned) p->ptr;
180
// uintptr_t hptr = reinterpret_cast<uintptr_t>(pm->ptr);
181
182
hptr /= (1024*1024);
183
hptr /= (4096/nr);
184
185
size_t blocks = pm->size / (1024*1024);
186
blocks /= (4096/nr);
187
188
// cout << "moveable, ptr = " << (void*)(pm->ptr) << ", size = " << pm->size << ", hptr = " << hptr << " blocks = " << blocks << endl;
189
190
for (size_t i = 0; i <= blocks; i++)
191
ch[hptr+i] = '1';
192
193
pm = pm->next;
194
}
195
}
196
197
198
199
}
200
201
#pragma warning(pop)
202
}
203
204