From a4a1fb70c9929d12e75dd5840eaa2880611466f4 Mon Sep 17 00:00:00 2001 From: Daniel Knorreck <daniel.knorreck@telecom-paristech.fr> Date: Tue, 21 Jun 2011 14:29:30 +0000 Subject: [PATCH] --- simulators/c++2/src_simulator/MemPoolNoDel.h | 122 +++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 simulators/c++2/src_simulator/MemPoolNoDel.h diff --git a/simulators/c++2/src_simulator/MemPoolNoDel.h b/simulators/c++2/src_simulator/MemPoolNoDel.h new file mode 100644 index 0000000000..fafdc85b49 --- /dev/null +++ b/simulators/c++2/src_simulator/MemPoolNoDel.h @@ -0,0 +1,122 @@ +/*Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Daniel Knorreck, +Ludovic Apvrille, Renaud Pacalet + * + * ludovic.apvrille AT telecom-paristech.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +#ifndef MemPoolNoDelH +#define MemPoolNoDelH + +#include <definitions.h> + +///Generic Memory pool without delete functionality +template <typename T> +class MemPoolNoDel { +public: + ///Constructor + /** + \param iBlockSize Size of chunks to be allocated + */ + MemPoolNoDel(unsigned int iChunkSize): _currChunk(0), _currPos(0), _chunkSize(iChunkSize), _currPosInList(_chunkList.end()){} + ///Allocation method + /** + \param n Size of memory chunk to be allocated + \return Pointer to the allocated chunk of memory + */ + void* pmalloc(unsigned int n){ + if (n != sizeof(T)){ + std::cerr << "MemPool ERROR malloc********\n"; + return ::operator new(n); + } + if (_currChunk==0 || _currPos==_chunkSize){ + if (_currPosInList != _chunkList.end()) _currPosInList++; + if (_currPosInList == _chunkList.end()){ + //std::cout << "Reallocate size=" << _chunkList.size() << "\n" ; + _currChunk = static_cast<T*>(::operator new(_chunkSize * sizeof(T))); + _chunkList.push_back(_currChunk); + _currPosInList = _chunkList.end(); + }else{ + //std::cout << "Next List pos size=" << _chunkList.size() << "\n" ; + _currChunk = *_currPosInList; + } + _currPos=0; + } + + //std::cout << "Allocated adr: " << &_currChunk[_currPos] << "\n"; + return &_currChunk[_currPos++]; + } + + ///Deallocation method + /** + \param p Pointer to the memory chunk to be deallocated + \param n Size of memory chunk to be deallocated + */ + void pfree(void *p, unsigned int n){ + //if (p == 0) return; + if (p!=0 && n != sizeof(T)){ + std::cerr << "MemPool ERROR delete********\n"; + ::operator delete(p); + return; + } + } + ///Reset memory pool, deallocate all memory chunks + void reset(){ + _currPosInList = _chunkList.begin(); + if (_currPosInList==_chunkList.end()) + _currChunk=0; + else + _currChunk = *_currPosInList; + _currPos=0; + } + + ///Destructor + ~MemPoolNoDel(){ + for(typename std::list<T*>::const_iterator i=_chunkList.begin(); i != _chunkList.end(); ++i) ::operator delete(*i); + } +private: + ///Current memory chunk to be used + T* _currChunk; + ///Next free position in current chunk + unsigned int _currPos; + ///Size of chunks to be allocated + unsigned int _chunkSize; + ///List containing allocated memory chunks + std::list<T*> _chunkList; + ///Position in List + typename std::list<T*>::iterator _currPosInList; +}; +#endif -- GitLab