Path: blob/devel/ElmerGUI/netgen/libsrc/general/moveablemem.cpp
3206 views
#include <iostream>1#include <iomanip>23#include <myadt.hpp>4using namespace std;5namespace netgen6{78NgMutex mem_mutex;910size_t BaseMoveableMem::totalsize = 0; // 500000000;11size_t BaseMoveableMem::used = 0;12char * BaseMoveableMem::largeblock = 0;1314BaseMoveableMem * BaseMoveableMem::first = 0;15BaseMoveableMem * BaseMoveableMem::last = 0;161718BaseMoveableMem :: BaseMoveableMem (size_t s)19{20// cout << "Construct object begin" << endl;21// Print ();2223prev = last;24next = 0;2526if (last) last->next = this;27last = this;28if (!first) first = this;2930size = 0;3132if (prev)33pos = prev->pos + prev->size;34else35pos = 0;3637ptr = 0;38name = NULL;3940if (s) Alloc(s);41}4243BaseMoveableMem :: ~BaseMoveableMem () throw()44{45Free();4647if (next) next->prev = prev;48else last = prev;49if (prev) prev->next = next;50else first = next;5152if(name != NULL)53{54delete [] name;55name = NULL;56}57}5859void BaseMoveableMem :: SetName (const char * aname)60{61if(name != NULL)62{63delete [] name;64name = NULL;65}66if (aname)67{68name = new char[strlen(aname)+1];69strcpy (name, aname);70}71}727374void BaseMoveableMem :: Alloc (size_t s)75{76if (totalsize == 0)77{78size = s;79//ptr = (char*) malloc(s);80ptr = new char[s];8182if (!ptr)83{84cerr << "BaseynamicMem, cannot allocate " << s << " bytes" << endl;85Print ();86throw ("BaseDynamicMem::Alloc: out of memory");87}8889return;90}919293used += s - size;9495size_t r = s % 8;96if (r) s += 8-r;97if (prev)98pos = prev->pos + prev->size;99else100pos = 0;101size = s;102103if (next)104{105NgLock lock(mem_mutex);106lock.Lock();107try108{109next->MoveTo (pos+size);110}111catch (NgException e)112{113lock.UnLock();114throw NgException ("MoveableMem overflow");115}116lock.UnLock();117}118119if (size)120{121if (!largeblock)122{123cout << "moveable memory: allocate large block of "124<< totalsize / 1048576 << " MB" << endl;125// largeblock = new char[totalsize];126// largeblock = (char*)malloc (totalsize);127largeblock = new char[totalsize];128}129ptr = largeblock+pos;130131if (pos + size > totalsize)132throw NgException ("MoveableMem overflow");133}134else135ptr = 0;136}137138void BaseMoveableMem :: ReAlloc (size_t s)139{140if (totalsize == 0)141{142if (size == s) return;143144char * old = ptr;145ptr = new char[s];146147if (!ptr)148{149cerr << "BaseynamicMem, cannot Reallocate " << s << " bytes" << endl;150Print ();151throw ("BaseDynamicMem::Alloc: out of memory");152}153154155156memmove (ptr, old, (s < size) ? s : size);157//free (old);158delete [] old;159size = s;160return;161}162163Alloc (s);164}165166void BaseMoveableMem :: MoveTo (size_t newpos)167{168// cout << "move block, oldpos = " << pos << "; newpos = " << newpos169// << ", size = " << size << endl;170static size_t move = 0;171172if (newpos + size > totalsize)173throw NgException ("MoveableMem overflow");174if (newpos > pos)175{176if (next) next->MoveTo (newpos+size);177memmove (largeblock+newpos, largeblock+pos, size);178move += size;179}180else if (newpos < pos)181{182// cout << "move down: " << size << endl;183memmove (largeblock+newpos, largeblock+pos, size);184if (next) next->MoveTo (newpos+size);185move += size;186}187pos = newpos;188ptr = largeblock+pos;189// cout << "total move: " << move << endl;190}191192void BaseMoveableMem :: Free () throw()193{194if (totalsize == 0)195{196//free (ptr);197delete [] ptr;198ptr = 0;199return;200}201202/*203cout << "free block, pos = " << pos << "size = " << size << endl;204cout << "before: " << endl;205Print();206*/207used -= size;208if (next)209{210NgLock lock(mem_mutex);211lock.Lock();212next->MoveTo (pos);213lock.UnLock();214}215216size = 0;217ptr = 0;218// pos = 0;219}220221void BaseMoveableMem :: Swap (BaseMoveableMem & m2) throw()222{223size_t hi;224// BaseMoveableMem * hp;225char * cp;226hi = size; size = m2.size; m2.size = hi;227hi = pos; pos = m2.pos; m2.pos = hi;228/*229hp = prev; prev = m2.prev; m2.prev = hp;230hp = next; next = m2.next; m2.next = hp;231*/232cp = ptr; ptr = m2.ptr; m2.ptr = cp;233cp = name; name = m2.name; m2.name = cp;234}235236237void BaseMoveableMem :: Print ()238{239cout << "****************** Moveable Mem Report ****************" << endl;240BaseMoveableMem * p = first;241long int mem = 0;242int cnt = 0;243while (p)244{245mem += long(p->size);246cnt++;247248cout << setw(10) << p->size << " Bytes";249cout << ", pos = " << p->pos;250cout << ", addr = " << (void*)p->ptr;251if (p->name)252cout << " in block " << p->name;253cout << endl;254255p = p->next;256}257258if (mem > 100000000)259cout << "memory in moveable arena: " << mem/1048576 << " MB" << endl;260else if (mem > 100000)261cout << "memory in moveable arena: " << mem/1024 << " kB" << endl;262else263cout << "memory in moveable arena: " << mem << " Bytes" << endl;264cout << "number of blocks: " << cnt << endl;265266cout << " used = " << used << endl;267// cout << "******************************************************" << endl;268}269270}271272273