blob: c91dd3ed5b94ed759fe9e1145647a235fd839082 [file] [log] [blame]
// *******************************************************************
// 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;
}