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 reset();
00117   public:
00118     byte* get() { return obj; }
00119 
00120     dbGetTie() {
00121         obj = NULL;
00122     }
00123     ~dbGetTie() {
00124         reset();
00125     }
00126 };
00127 
00128 class GIGABASE_DLL_ENTRY dbPutTie {
00129     friend class dbDatabase;
00130     friend class dbBtree;
00131     friend class dbRtree;
00132 
00133     dbPagePool* pool;
00134     byte*       obj;
00135     byte*       page;
00136     size_t      size;
00137     offs_t      pos;
00138     oid_t       oid;
00139 
00140     void set(dbPagePool& pool, oid_t oid, offs_t pos, size_t size);
00141     void reset();
00142     void unset() {
00143         if (obj != NULL) {
00144             if (page == NULL) { 
00145                 dbFree(obj);
00146             }
00147             obj = NULL;
00148         }
00149     }
00150   public:
00151     byte* get() { return obj; }
00152 
00153     dbPutTie() {
00154         obj = NULL;
00155         oid = 0;
00156     }
00157     ~dbPutTie() {
00158         reset();
00159     }
00160 };
00161 
00162 
00163 END_GIGABASE_NAMESPACE
00164 
00165 
00166 
00167 
00168 
00169 
00170 
00171 
00172 
00173 
00174 
00175 
00176 
00177 
00178 
00179 
00180 
00181 
00182 

Generated on Mon Oct 23 13:22:59 2006 for GigaBASE by doxygen1.2.18