Main Page | Class Hierarchy | Class List | File List | Class 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 { // flag in accessCount field
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, size_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 
00099     bool  destructed() { return pages == NULL; }
00100 
00101     dbPagePool(dbDatabase* dbs, size_t size) : db(dbs), poolSize(size) {}
00102 };
00103 
00104 class GIGABASE_DLL_ENTRY dbGetTie {
00105     friend class dbDatabase;
00106     friend class dbAnyCursor;
00107     dbPagePool* pool;
00108     byte*       obj;
00109     byte*       page;
00110 
00111     void set(dbPagePool& pool, offs_t pos);
00112     void reset();
00113   public:
00114     byte* get() { return obj; }
00115 
00116     dbGetTie() {
00117         obj = NULL;
00118     }
00119     ~dbGetTie() {
00120         reset();
00121     }
00122 };
00123 
00124 class GIGABASE_DLL_ENTRY dbPutTie {
00125     friend class dbDatabase;
00126     friend class dbBtree;
00127     friend class dbRtree;
00128 
00129     dbPagePool* pool;
00130     byte*       obj;
00131     byte*       page;
00132     size_t      size;
00133     offs_t      pos;
00134     oid_t       oid;
00135 
00136     void set(dbPagePool& pool, oid_t oid, offs_t pos, size_t size);
00137     void reset();
00138     void unset() {
00139         if (obj != NULL) {
00140             if (page == NULL) { 
00141                 dbFree(obj);
00142             }
00143             obj = NULL;
00144         }
00145     }
00146   public:
00147     byte* get() { return obj; }
00148 
00149     dbPutTie() {
00150         obj = NULL;
00151         oid = 0;
00152     }
00153     ~dbPutTie() {
00154         reset();
00155     }
00156 };
00157 
00158 
00159 END_GIGABASE_NAMESPACE
00160 
00161 
00162 
00163 
00164 
00165 
00166 
00167 
00168 
00169 
00170 
00171 
00172 
00173 
00174 
00175 
00176 
00177 
00178 

Generated on Thu Feb 12 18:46:27 2004 for GigaBASE by doxygen 1.3.5