00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00020
00021 #include <iostream>
00022 #include <limits.h>
00023 #include <string.h>
00024
00025 #include "config.h"
00026
00027 #include "hoardheap.h"
00028 #include "threadheap.h"
00029 #include "persistentheap.h"
00030
00031
00032 threadHeap::threadHeap (void)
00033 : _pHeap (0), _persistentHeap(0)
00034 {}
00035
00036
00037
00038
00039
00040
00041
00042 void * threadHeap::malloc (const size_t size)
00043 {
00044 void *allocRegionPtr;
00045 const int sizeclass = sizeClass (size);
00046 block *b = NULL;
00047
00048 lock();
00049
00050
00051
00052
00053
00054 superblock * sb = findAvailableSuperblock (sizeclass, b, _persistentHeap);
00055
00056
00057
00058
00059 if (sb == NULL) {
00060
00061
00062
00063 assert (_persistentHeap);
00064 sb = _persistentHeap->acquire ((int) sizeclass, this);
00065
00066
00067
00068
00069 if (sb == NULL) {
00070
00071 unlock ();
00072 assert(0 && "We're out of memory!\n");
00073 return NULL;
00074 }
00075
00076
00077 b = sb->acquireBlock ();
00078 assert (b != NULL);
00079
00080 insertSuperblock (sizeclass, sb, _persistentHeap);
00081 }
00082
00083 assert (b != NULL);
00084 assert (b->isValid());
00085 assert (sb->isValid());
00086
00087 b->markAllocated();
00088
00089 allocRegionPtr = (void *) (b->getSuperblock()->getBlockRegion(b->getId()));
00090 #if HEAP_LOG
00091 MemoryRequest m;
00092 m.malloc (allocRegionPtr, align(size));
00093 _pHeap->getLog(getIndex()).append(m);
00094 #endif
00095 #if HEAP_FRAG_STATS
00096 b->setRequestedSize (align(size));
00097 _pHeap->setAllocated (align(size), 0);
00098 #endif
00099
00100 unlock();
00101
00102
00103 return allocRegionPtr;
00104 }