00001
00002
00003
00004
00005
00006
00007
00008 #ifndef __heap_h
00009 #define __heap_h
00010
00011 #include <utility/debug.h>
00012 #include <utility/string.h>
00013 #include <utility/list.h>
00014
00015 __BEGIN_SYS
00016
00017 class Heap: public Grouping_List<char>
00018 {
00019 public:
00020 Heap() {}
00021 Heap(void * addr, unsigned int bytes) { free(addr, bytes); }
00022
00023 void * alloc(unsigned int bytes) {
00024 char * addr = 0;
00025 if(bytes) {
00026 Element * e = search_decrementing(bytes);
00027 if(e)
00028 addr = e->object() + e->size();
00029
00030 db<System>(TRC) << "Heap::alloc(this=" << this
00031 << ",bytes=" << bytes
00032 << ") => " << (void *)addr << "\n";
00033 }
00034 return addr;
00035 }
00036 void * calloc(unsigned int bytes) {
00037 void * addr = alloc(bytes);
00038 memset(addr, bytes, 0);
00039 return addr;
00040 }
00041 void * realloc(void * ptr, unsigned int bytes);
00042
00043 void free(void * ptr) {
00044 free(ptr, 4);
00045 }
00046 void free(void * ptr, unsigned int bytes) {
00047 db<System>(TRC) << "Heap::free(this=" << this
00048 << ",ptr=" << ptr
00049 << ",bytes=" << bytes << ")\n";
00050
00051 if(ptr && (bytes >= sizeof(Element))) {
00052 Element * e = new (ptr)
00053 Element(reinterpret_cast<char *>(ptr), bytes);
00054 Element * m1, * m2;
00055 insert_merging(e, &m1, &m2);
00056 }
00057 }
00058 };
00059
00060 __END_SYS
00061
00062 #endif