00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef ALLOCATOR_H
00017 #define ALLOCATOR_H
00018 #include<os.h>
00019 #include<Mutex.h>
00020 #include<ErrorType.h>
00021
00022 typedef void Page;
00023
00024 enum AllocType
00025 {
00026 FixedSizeAllocator = 0,
00027 VariableSizeAllocator = 1,
00028 UnknownAllocator
00029 };
00030
00031
00032 class VarSizeInfo
00033 {
00034 public:
00035 size_t size_;
00036 int isUsed_;
00037 };
00038
00039
00040
00041
00042
00043
00044
00045
00046 class PageInfo
00047 {
00048 public:
00049 int isUsed_;
00050 int hasFreeSpace_;
00051
00052 Page *nextPageAfterMerge_;
00053
00054
00055
00056
00057 Page *nextPage_;
00058 void setPageAsUsed(size_t offset);
00059 void setFirstPageAsUsed();
00060
00061
00062 };
00063 class Chunk;
00064
00065
00066
00067
00068
00069 class ChunkIterator
00070 {
00071 int chunkID_;
00072 size_t allocSize_;
00073 AllocType allocType_;
00074
00075
00076 Page *iterPage_;
00077
00078
00079
00080 int nodeOffset_;
00081
00082
00083
00084
00085 int noOfNodes_;
00086
00087 public:
00088 void* nextElement();
00089 friend class Chunk;
00090 };
00091
00092 class Database;
00093 class DatabaseManagerImpl;
00094
00095 class Chunk
00096 {
00097 int chunkID_;
00098
00099
00100 size_t allocSize_;
00101 AllocType allocType_;
00102
00103
00104 Page *curPage_;
00105
00106
00107
00108
00109 Page *firstPage_;
00110
00111 Mutex chunkMutex_;
00112
00113 public:
00114
00115
00116
00117 void setSize(size_t size);
00118
00119 size_t getSize() { return allocSize_; }
00120 void setChunkID(unsigned int id) { chunkID_ = id; }
00121 int getChunkID() { return chunkID_; }
00122 void setAllocType(AllocType type) { allocType_ = type; }
00123 AllocType getAllocType() { return allocType_; }
00124
00125
00126 PageInfo* getPageInfo(Database *db, void *ptr);
00127 void* allocate(Database *db, DbRetVal *status = NULL);
00128
00129 void* allocate(Database *db, size_t size, DbRetVal *status = NULL);
00130
00131 void free(Database *db, void* ptr);
00132 ChunkIterator getIterator();
00133 void print(){}
00134
00135 long getTotalDataNodes();
00136 int totalPages();
00137 int compact();
00138
00139 private:
00140
00141 int initMutex();
00142 int getChunkMutex(int procSlot);
00143 int releaseChunkMutex(int procSlot);
00144 int destroyMutex();
00145 void createDataBucket(Page *page, size_t totalSize, size_t needSize);
00146 void splitDataBucket(VarSizeInfo *varInfo, size_t needSize);
00147 void* varSizeFirstFitAllocate(size_t size);
00148 void freeForLargeAllocator(void *ptr, int pslot);
00149 void freeForVarSizeAllocator(void *ptr, int pslot);
00150
00151 void* allocateForLargeDataSize(Database *db);
00152 void* allocateFromFirstPage(Database *db, int noOfDataNodes);
00153 void* allocateFromNewPage(Database *db);
00154
00155 void* allocateForLargeDataSize(Database *db, size_t size);
00156 void* allocFromNewPageForVarSize(Database *db, size_t size);
00157 void* allocateFromCurPageForVarSize(size_t size);
00158
00159
00160 friend class Database;
00161 friend class DatabaseManagerImpl;
00162 };
00163 #endif