Main Page   Class Hierarchy   Compound List   File List   Compound Members  

pagepool.h

00001 //-< PAGEPOOL.H >----------------------------------------------------*--------*
00002 // GigaBASE                  Version 1.0         (c) 1999  GARRET    *     ?  *
00003 // (Post Relational Database Management System)                      *   /\|  *
00004 //                                                                   *  /  \  *
00005 //                          Created:      6-Feb-99    K.A. Knizhnik  * / [] \ *
00006 //                          Last update:  6-Feb-99    K.A. Knizhnik  * GARRET *
00007 //-------------------------------------------------------------------*--------*
00008 // Page pool interface
00009 //-------------------------------------------------------------------*--------*
00010 
00011 BEGIN_GIGABASE_NAMESPACE
00012 
00013 class dbPageLruList {
00014   public:
00015     int4   next;
00016     int4   prev;
00017 };
00018 
00019 class dbPageEvent : public dbEvent {
00020   public:
00021     union {
00022         int count;
00023         int next;
00024     };
00025 
00026     void reset() {
00027         count = 0;
00028         dbEvent::reset();
00029     }
00030 };
00031 
00032 class dbPageHeader : public dbPageLruList {
00033   public:
00034     int4   collisionChain;
00035     nat4   accessCount;
00036     offs_t offs;
00037     int4   writeQueueIndex;
00038     nat2   wob;
00039     nat1   state;
00040     enum PageState { 
00041         psDirty = 0x01, // page has been modified
00042         psRaw   = 0x02, // page is loaded from the disk
00043         psWait  = 0x04  // other thread(s) wait load operation completion
00044     };
00045 };
00046 
00047 class GIGABASE_DLL_ENTRY dbPagePool {
00048     friend class dbGetTie;
00049     friend class dbPutTie;
00050   protected:
00051     dbPageHeader*  pages;
00052     int*           hashTable;
00053     int            freePages;
00054     int            nPages;
00055 
00056     int            nWobs;
00057     int            freeWobs;
00058     dbPageEvent*   wobs;
00059 
00060     dbMutex        mutex;
00061     dbFile*        file;
00062     dbDatabase*    db;
00063     size_t         hashBits;
00064     size_t         poolSize;
00065     byte*          buffer;
00066     size_t         bufferSize;
00067     offs_t         fileSize;
00068 
00069     int            flushing;
00070 
00071     enum {
00072         initialWobArraySize = 8,
00073         minPoolSize = 256,
00074         minHashSize = 16*1024,
00075         maxUnusedMemory = 64*1024*1024
00076     };
00077 
00078     size_t         nDirtyPages;
00079     dbPageHeader** dirtyPages;
00080 
00081     byte*          find(offs_t addr, int state);
00082 
00083   public:
00084     byte* get(offs_t addr) {
00085         return find(addr, 0);
00086     }
00087     byte* put(offs_t addr) {
00088         return find(addr, dbPageHeader::psDirty);
00089     }
00090     void  copy(offs_t dst, offs_t src, offs_t size);
00091     void  unfix(void* ptr);
00092     void  unfixLIFO(void* ptr);
00093     void  fix(void* ptr);
00094     void  modify(void* ptr);
00095     bool  open(dbFile* file, offs_t fileSize);
00096     void  close();
00097     void  flush();
00098     void  clear(offs_t fileSize);
00099     void  setPoolSize(size_t newSize) { 
00100         poolSize = newSize;
00101     }
00102 
00103     bool  destructed() { return pages == NULL; }
00104 
00105     dbPagePool(dbDatabase* dbs, size_t size) : db(dbs), poolSize(size) {}
00106 };
00107 
00108 class GIGABASE_DLL_ENTRY dbGetTie {
00109     friend class dbDatabase;
00110     friend class dbAnyCursor;
00111     dbPagePool* pool;
00112     byte*       obj;
00113     byte*       page;
00114 
00115     void set(dbPagePool& pool, offs_t pos);
00116     void fetch(dbPagePool& pool, offs_t pos);
00117     void reset();
00118   public:
00119     byte* get() { return obj; }
00120 
00121     dbGetTie() {
00122         obj = NULL;
00123     }
00124     ~dbGetTie() {
00125         reset();
00126     }
00127 };
00128 
00129 class GIGABASE_DLL_ENTRY dbPutTie {
00130     friend class dbDatabase;
00131     friend class dbBtree;
00132     friend class dbRtree;
00133 
00134     dbPagePool* pool;
00135     byte*       obj;
00136     byte*       page;
00137     size_t      size;
00138     offs_t      pos;
00139     oid_t       oid;
00140     bool        updateCursors;
00141 
00142     void set(dbPagePool& pool, oid_t oid, offs_t pos, size_t size);
00143     void reset();
00144     void unset() {
00145         if (obj != NULL) {
00146             if (page == NULL) { 
00147                 dbFree(obj);
00148             }
00149             obj = NULL;
00150         }
00151     }
00152   public:
00153     byte* get() { return obj; }
00154 
00155     dbPutTie(bool updateCursors = false) {
00156         this->updateCursors = updateCursors;
00157         obj = NULL;
00158         oid = 0;
00159     }
00160     ~dbPutTie() {
00161         reset();
00162     }
00163 };
00164 
00165 
00166 END_GIGABASE_NAMESPACE
00167 
00168 
00169 
00170 
00171 
00172 
00173 
00174 
00175 
00176 
00177 
00178 
00179 
00180 
00181 
00182 
00183 
00184 
00185 

Generated on Thu Feb 14 21:46:03 2008 for GigaBASE by doxygen1.2.18