112855Sgabeblack@google.com 212855Sgabeblack@google.com// ******************************************************************* 312855Sgabeblack@google.com// User-defined memory manager, which maintains a pool of transactions 412855Sgabeblack@google.com// ******************************************************************* 512855Sgabeblack@google.com 612855Sgabeblack@google.com#include "tlm.h" 712855Sgabeblack@google.com 812855Sgabeblack@google.comclass mm: public tlm::tlm_mm_interface 912855Sgabeblack@google.com{ 1012855Sgabeblack@google.com typedef tlm::tlm_generic_payload gp_t; 1112855Sgabeblack@google.com 1212855Sgabeblack@google.compublic: 1312855Sgabeblack@google.com mm() : free_list(0), empties(0) {} 1412855Sgabeblack@google.com 1512855Sgabeblack@google.com virtual ~mm() 1612855Sgabeblack@google.com { 1712855Sgabeblack@google.com gp_t* ptr; 1812855Sgabeblack@google.com 1912855Sgabeblack@google.com while (free_list) 2012855Sgabeblack@google.com { 2112855Sgabeblack@google.com ptr = free_list->trans; 2212855Sgabeblack@google.com 2312855Sgabeblack@google.com // Delete generic payload and all extensions 2412855Sgabeblack@google.com sc_assert(ptr); 2512855Sgabeblack@google.com delete ptr; 2612855Sgabeblack@google.com 2712855Sgabeblack@google.com free_list = free_list->next; 2812855Sgabeblack@google.com } 2912855Sgabeblack@google.com 3012855Sgabeblack@google.com while (empties) 3112855Sgabeblack@google.com { 3212855Sgabeblack@google.com access* x = empties; 3312855Sgabeblack@google.com empties = empties->next; 3412855Sgabeblack@google.com 3512855Sgabeblack@google.com // Delete free list access struct 3612855Sgabeblack@google.com delete x; 3712855Sgabeblack@google.com } 3812855Sgabeblack@google.com } 3912855Sgabeblack@google.com 4012855Sgabeblack@google.com gp_t* allocate(); 4112855Sgabeblack@google.com void free(gp_t* trans); 4212855Sgabeblack@google.com 4312855Sgabeblack@google.comprivate: 4412855Sgabeblack@google.com struct access 4512855Sgabeblack@google.com { 4612855Sgabeblack@google.com gp_t* trans; 4712855Sgabeblack@google.com access* next; 4812855Sgabeblack@google.com access* prev; 4912855Sgabeblack@google.com }; 5012855Sgabeblack@google.com 5112855Sgabeblack@google.com access* free_list; 5212855Sgabeblack@google.com access* empties; 5312855Sgabeblack@google.com}; 5412855Sgabeblack@google.com 5512855Sgabeblack@google.commm::gp_t* mm::allocate() 5612855Sgabeblack@google.com{ 5712855Sgabeblack@google.com gp_t* ptr; 5812855Sgabeblack@google.com if (free_list) 5912855Sgabeblack@google.com { 6012855Sgabeblack@google.com ptr = free_list->trans; 6112855Sgabeblack@google.com empties = free_list; 6212855Sgabeblack@google.com free_list = free_list->next; 6312855Sgabeblack@google.com } 6412855Sgabeblack@google.com else 6512855Sgabeblack@google.com { 6612855Sgabeblack@google.com ptr = new gp_t(this); 6712855Sgabeblack@google.com } 6812855Sgabeblack@google.com return ptr; 6912855Sgabeblack@google.com} 7012855Sgabeblack@google.com 7112855Sgabeblack@google.comvoid mm::free(gp_t* trans) 7212855Sgabeblack@google.com{ 7312855Sgabeblack@google.com trans->reset(); // Delete auto extensions 7412855Sgabeblack@google.com if (!empties) 7512855Sgabeblack@google.com { 7612855Sgabeblack@google.com empties = new access; 7712855Sgabeblack@google.com empties->next = free_list; 7812855Sgabeblack@google.com empties->prev = 0; 7912855Sgabeblack@google.com if (free_list) 8012855Sgabeblack@google.com free_list->prev = empties; 8112855Sgabeblack@google.com } 8212855Sgabeblack@google.com free_list = empties; 8312855Sgabeblack@google.com free_list->trans = trans; 8412855Sgabeblack@google.com empties = free_list->prev; 8512855Sgabeblack@google.com} 86