| // ******************************************************************* | |
| // 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; | |
| } |