Path: blob/devel/ElmerGUI/netgen/libsrc/general/dynamicmem.cpp
3206 views
#include <iostream>1#include <iomanip>23#ifdef SSE4#include <emmintrin.h>5#endif67#include <myadt.hpp>8using namespace std;910namespace netgen11{1213BaseDynamicMem * BaseDynamicMem::first = 0;14BaseDynamicMem * BaseDynamicMem::last = 0;151617BaseDynamicMem :: BaseDynamicMem ()18{19prev = last;20next = 0;2122if (last) last->next = this;23last = this;24if (!first) first = this;2526size = 0;27ptr = 0;28name = 0;29}3031BaseDynamicMem :: ~BaseDynamicMem ()32{33Free();3435if (next) next->prev = prev;36else last = prev;37if (prev) prev->next = next;38else first = next;3940delete [] name;41}4243void BaseDynamicMem :: SetName (const char * aname)44{45delete [] name;46if (aname)47{48name = new char[strlen(aname)+1];49strcpy (name, aname);50}51}525354void BaseDynamicMem :: Alloc (size_t s)55{56size = s;57ptr = new char[s];5859if (!ptr)60{61cerr << "BaseynamicMem, cannot allocate " << s << " bytes" << endl;62Print ();63throw ("BaseDynamicMem::Alloc: out of memory");64}65// ptr = (char*)malloc (s);66// ptr = (char*) _mm_malloc (s,16);67}6869void BaseDynamicMem :: ReAlloc (size_t s)70{71if (size == s) return;7273char * old = ptr;74ptr = new char[s];7576if (!ptr)77{78cerr << "BaseynamicMem, cannot Reallocate " << s << " bytes" << endl;79Print ();80throw ("BaseDynamicMem::Alloc: out of memory");81}828384// ptr = (char*)malloc(s);85// ptr = (char*) _mm_malloc (s,16);86memmove (ptr, old, (s < size) ? s : size);87delete [] old;88// free (old);89// _mm_free (old);90size = s;91}9293void BaseDynamicMem :: Free ()94{95delete [] ptr;96// free (ptr);97// _mm_free (ptr);98ptr = 0;99}100101void BaseDynamicMem :: Swap (BaseDynamicMem & m2)102{103size_t hi;104char * cp;105hi = size; size = m2.size; m2.size = hi;106cp = ptr; ptr = m2.ptr; m2.ptr = cp;107cp = name; name = m2.name; m2.name = cp;108}109110111void BaseDynamicMem :: Print ()112{113cout << "****************** Dynamic Mem Report ****************" << endl;114BaseDynamicMem * p = first;115size_t mem = 0;116int cnt = 0;117while (p)118{119mem += p->size;120cnt++;121122cout << setw(10) << p->size << " Bytes";123cout << ", addr = " << (void*)p->ptr;124if (p->name)125cout << " in block " << p->name;126cout << endl;127128p = p->next;129}130131if (mem > 100000000)132cout << "memory in dynamic memory: " << mem/1048576 << " MB" << endl;133else if (mem > 100000)134cout << "memory in dynamic memory: " << mem/1024 << " kB" << endl;135else136cout << "memory in dynamic memory: " << mem << " Bytes" << endl;137cout << "number of blocks: " << cnt << endl;138// cout << "******************************************************" << endl;139}140141142#pragma warning(push)143#ifdef __INTEL_COMPILER144#pragma warning(disable:1684)145#endif146147void BaseDynamicMem :: GetUsed (int nr, char * ch)148{149BaseDynamicMem * p = first;150151for (int i = 0; i < nr; i++)152ch[i] = '0';153154while (p)155{156long unsigned hptr = (long unsigned) (p->ptr);157// uintptr_t hptr = reinterpret_cast<uintptr_t>(p->ptr); //??158159hptr /= (1024*1024);160hptr /= (4096/nr);161162size_t blocks = p->size / (1024*1024);163blocks /= (4096/nr);164165// cout << "ptr = " << (void*)(p->ptr) << ", size = " << p->size << ", hptr = " << hptr << " blocks = " << blocks << endl;166167for (size_t i = 0; i <= blocks; i++)168ch[hptr+i] = '1';169170p = p->next;171}172173{174175BaseMoveableMem * pm = BaseMoveableMem::first;176while (pm)177{178long unsigned hptr = (long unsigned) p->ptr;179// uintptr_t hptr = reinterpret_cast<uintptr_t>(pm->ptr);180181hptr /= (1024*1024);182hptr /= (4096/nr);183184size_t blocks = pm->size / (1024*1024);185blocks /= (4096/nr);186187// cout << "moveable, ptr = " << (void*)(pm->ptr) << ", size = " << pm->size << ", hptr = " << hptr << " blocks = " << blocks << endl;188189for (size_t i = 0; i <= blocks; i++)190ch[hptr+i] = '1';191192pm = pm->next;193}194}195196197198}199200#pragma warning(pop)201}202203204