Eneboo - Documentación para desarrolladores
|
00001 /* -*- C++ -*- */ 00002 00003 #ifndef _FIFODLFREELIST_H_ 00004 #define _FIFODLFREELIST_H_ 00005 00006 #include <assert.h> 00007 00008 template <class Super> 00009 class FIFODLFreelistHeap : public Super { 00010 public: 00011 00012 FIFODLFreelistHeap (void) 00013 { 00014 head.prev = &head; 00015 head.next = &tail; 00016 tail.prev = &head; 00017 tail.next = &tail; 00018 assert (isEmpty()); 00019 } 00020 00021 ~FIFODLFreelistHeap (void) 00022 { 00023 // Delete everything on the free list. 00024 freeObject * ptr = head.next; 00025 while (ptr != &tail) { 00026 void * oldptr = ptr; 00027 ptr = ptr->next; 00028 Super::free (oldptr); 00029 } 00030 } 00031 00032 inline void * malloc (size_t sz) { 00033 //printf ("flist malloc %d\n", sz); 00034 // Check the free list first. 00035 freeObject * ptr = tail.prev; 00036 if (ptr == &head) { 00037 assert (isEmpty()); 00038 ptr = (freeObject *) Super::malloc (sz); 00039 } else { 00040 ptr->prev->next = &tail; 00041 tail.prev = ptr->prev; 00042 #if 0 00043 ptr->prev = NULL; 00044 ptr->next = NULL; 00045 #endif 00046 } 00047 assert (getSize(ptr) >= sz); 00048 assert (getSize(ptr) >= sizeof(freeObject)); 00049 return (void *) ptr; 00050 } 00051 00052 inline void free (void * ptr) { 00053 // Add this object to the free list. 00054 assert (ptr != NULL); 00055 freeObject * p = (freeObject *) ptr; 00056 p->next = head.next; 00057 p->next->prev = p; 00058 p->prev = &head; 00059 head.next = p; 00060 assert (!isEmpty()); 00061 } 00062 00063 #if 0 00064 // Returns the entire linked list of freed objects. 00065 inline void * multimalloc (size_t sz) { 00066 freeObject * ptr = head.next; 00067 ptr->prev = NULL; 00068 tail.prev->next = NULL; 00069 head.next = &tail; 00070 tail.prev = &head; 00071 return ptr; 00072 } 00073 #endif 00074 00075 inline static void remove (void * rptr) 00076 { 00077 freeObject * p = (freeObject *) rptr; 00078 assert (p->next != NULL); 00079 assert (p->prev != NULL); 00080 p->prev->next = p->next; 00081 p->next->prev = p->prev; 00082 p->prev = p->next = NULL; 00083 } 00084 00085 00086 private: 00087 00088 int isEmpty (void) { 00089 return (head.next == &tail); 00090 } 00091 00092 class freeObject { 00093 public: 00094 freeObject * prev; 00095 freeObject * next; 00096 }; 00097 00098 freeObject head, tail; 00099 }; 00100 00101 #endif