diff options
Diffstat (limited to 'src/systemc/tests/tlm/nb2b_adapter/mm.h')
-rw-r--r-- | src/systemc/tests/tlm/nb2b_adapter/mm.h | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/systemc/tests/tlm/nb2b_adapter/mm.h b/src/systemc/tests/tlm/nb2b_adapter/mm.h new file mode 100644 index 000000000..c91dd3ed5 --- /dev/null +++ b/src/systemc/tests/tlm/nb2b_adapter/mm.h @@ -0,0 +1,85 @@ + +// ******************************************************************* +// 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; +} |