1 /* -*- C++ -*- */ 2 3 #ifndef HL_SIZETHREADHEAP_H 4 #define HL_SIZETHREADHEAP_H 5 6 #include <assert.h> 7 8 #include "threads/cpuinfo.h" 9 10 namespace HL { 11 12 template <class Super> 13 class SizeThreadHeap : public Super { 14 public: 15 malloc(size_t sz)16 inline void * malloc (size_t sz) { 17 // Add room for a size field & a thread field. 18 // Both of these must fit in a double. 19 assert (sizeof(st) <= sizeof(double)); 20 st * ptr = (st *) Super::malloc (sz + sizeof(double)); 21 // Store the requested size. 22 ptr->size = sz; 23 assert (getOrigPtr(ptr + 1) == ptr); 24 return (void *) (ptr + 1); 25 } 26 free(void * ptr)27 inline void free (void * ptr) { 28 void * origPtr = (void *) getOrigPtr(ptr); 29 Super::free (origPtr); 30 } 31 size(void * ptr)32 static inline size_t& size (void * ptr) { 33 return getOrigPtr(ptr)->size; 34 } 35 thread(void * ptr)36 static inline int& thread (void * ptr) { 37 return getOrigPtr(ptr)->tid; 38 } 39 40 private: 41 42 typedef struct _st { 43 size_t size; 44 int tid; 45 } st; 46 getOrigPtr(void * ptr)47 static inline st * getOrigPtr (void * ptr) { 48 return (st *) ((double *) ptr - 1); 49 } 50 51 }; 52 53 } 54 55 #endif 56