Eneboo - Documentación para desarrolladores
src/hoard/src/heaplayers/fifodlfreelist.h
Ir a la documentación de este archivo.
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
 Todo Clases Namespaces Archivos Funciones Variables 'typedefs' Enumeraciones Valores de enumeraciones Propiedades Amigas 'defines'