source: proiecte/swift/trunk/lib/hoard-371/src/heaplayers/fifodlfreelist.h @ 176

Last change on this file since 176 was 176, checked in by (none), 14 years ago
  • imported repo from "guagal"
File size: 2.0 KB
Line 
1/* -*- C++ -*- */
2
3#ifndef _FIFODLFREELIST_H_
4#define _FIFODLFREELIST_H_
5
6#include <assert.h>
7
8template <class Super>
9class FIFODLFreelistHeap : public Super {
10public:
11 
12  FIFODLFreelistHeap (void)
13    {
14      head.prev = &head;
15      head.next = &tail;
16      tail.prev = &head;
17      tail.next = &tail;
18      assert (isEmpty());
19    }
20
21  ~FIFODLFreelistHeap (void)
22    {
23      // Delete everything on the free list.
24      freeObject * ptr = head.next;
25      while (ptr != &tail) {
26        void * oldptr = ptr;
27        ptr = ptr->next;
28        Super::free (oldptr);
29      }
30    }
31
32  inline void * malloc (size_t sz) {
33    //printf ("flist malloc %d\n", sz);
34    // Check the free list first.
35    freeObject * ptr = tail.prev;
36    if (ptr == &head) {
37      assert (isEmpty());
38      ptr = (freeObject *) Super::malloc (sz);
39    } else {
40      ptr->prev->next = &tail;
41      tail.prev = ptr->prev;
42#if 0
43      ptr->prev = NULL;
44      ptr->next = NULL;
45#endif
46    }
47    assert (getSize(ptr) >= sz);
48    assert (getSize(ptr) >= sizeof(freeObject));
49    return (void *) ptr;
50  }
51 
52  inline void free (void * ptr) {
53    // Add this object to the free list.
54    assert (ptr != NULL);
55    freeObject * p = (freeObject *) ptr;
56    p->next = head.next;
57    p->next->prev = p;
58    p->prev = &head;
59    head.next = p;
60    assert (!isEmpty());
61  }
62
63#if 0
64  // Returns the entire linked list of freed objects.
65  inline void * multimalloc (size_t sz) {
66    freeObject * ptr = head.next;
67    ptr->prev = NULL;
68    tail.prev->next = NULL;
69    head.next = &tail;
70    tail.prev = &head;
71    return ptr;
72  }
73#endif
74
75  inline static void remove (void * rptr)
76    {
77      freeObject * p = (freeObject *) rptr;
78      assert (p->next != NULL);
79      assert (p->prev != NULL);
80      p->prev->next = p->next;
81      p->next->prev = p->prev;
82      p->prev = p->next = NULL;
83    }
84
85
86private:
87
88  int isEmpty (void) {
89    return (head.next == &tail);
90  }
91
92  class freeObject {
93  public:
94    freeObject * prev;
95    freeObject * next;
96  };
97
98  freeObject head, tail;
99};
100
101#endif
Note: See TracBrowser for help on using the repository browser.