// Filename: mm.h //---------------------------------------------------------------------- // Copyright (c) 2008 by Doulos Ltd. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //---------------------------------------------------------------------- // Version 1 09-Sep-2008 // ******************************************************************* // User-defined memory manager, which maintains a pool of transactions // ******************************************************************* #include "tlm.h" class mm: public tlm::tlm_mm_interface { typedef tlm::tlm_generic_payload gp_t; public: mm() : free_list(0), empties(0) {} gp_t* allocate(); void free(gp_t* trans); private: struct access { gp_t* trans; access* next; access* prev; }; access* free_list; access* empties; }; mm::gp_t* mm::allocate() { gp_t* ptr; if (free_list) { ptr = free_list->trans; empties = free_list; free_list = free_list->next; } else { ptr = new gp_t(this); } return ptr; } void mm::free(gp_t* trans) { trans->reset(); // Delete auto extensions if (!empties) { empties = new access; empties->next = free_list; empties->prev = 0; if (free_list) free_list->prev = empties; } free_list = empties; free_list->trans = trans; empties = free_list->prev; }