// ******************************************************************* // 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) {} virtual ~mm() { gp_t* ptr; while (free_list) { ptr = free_list->trans; // Delete generic payload and all extensions sc_assert(ptr); delete ptr; free_list = free_list->next; } while (empties) { access* x = empties; empties = empties->next; // Delete free list access struct delete x; } } 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; }