kern_reg.cc

00001 /* 
00002    EyeDB Object Database Management System
00003    Copyright (C) 1994-2008 SYSRA
00004    
00005    EyeDB is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Lesser General Public
00007    License as published by the Free Software Foundation; either
00008    version 2.1 of the License, or (at your option) any later version.
00009    
00010    EyeDB is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Lesser General Public License for more details.
00014    
00015    You should have received a copy of the GNU Lesser General Public
00016    License along with this library; if not, write to the Free Software
00017    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA 
00018 */
00019 
00020 /*
00021    Author: Eric Viara <viara@sysra.com>
00022 */
00023 
00024 #include <eyedbconfig.h>
00025 
00026 #include <kern_p.h>
00027 
00028 namespace eyedbsm {
00029 Status
00030 ESM_registerStart(DbHandle const *dbh, unsigned int reg_mask)
00031 {
00032   dbh->vd->reg = (Register *)m_calloc(sizeof(Register), 1);
00033   dbh->vd->reg_alloc = 0;
00034   dbh->vd->reg_mask = reg_mask;
00035   return Success;
00036 }
00037 
00038 Status
00039 ESM_registerClear(DbHandle const *dbh)
00040 {
00041   unsigned int reg_mask = dbh->vd->reg_mask;
00042   Status s = registerEnd(dbh);
00043   if (s) return s;
00044   return registerStart(dbh, reg_mask);
00045 }
00046 
00047 Status
00048 ESM_registerEnd(DbHandle const *dbh)
00049 {
00050   if (dbh->vd->reg)
00051     {
00052       dbh->vd->reg_alloc = 0;
00053 
00054       free(dbh->vd->reg->entries);
00055       dbh->vd->reg->entries = 0;
00056 
00057       free(dbh->vd->reg);
00058       dbh->vd->reg = 0;
00059     }
00060 
00061   return Success;
00062 }
00063 
00064 Status
00065 ESM_registerGet(DbHandle const *dbh, Register **reg)
00066 {
00067   *reg = dbh->vd->reg;
00068   return Success;
00069 }
00070 
00071 static void
00072 ESM_addToRegister(DbHandle const *dbh, OP op,
00073                   const Oid *oid, unsigned int create_size, int start_rw,
00074                   int length_rw, int sizemod_size)
00075 {
00076   if (!dbh->vd->reg)
00077     return;
00078 
00079   Register *reg = dbh->vd->reg;
00080   if (reg->oid_cnt >= dbh->vd->reg_alloc)
00081     {
00082       dbh->vd->reg_alloc += 1024;
00083       reg->entries = (RegisterEntry *)
00084         m_realloc(reg->entries,
00085                 sizeof(RegisterEntry)*dbh->vd->reg_alloc);
00086     }
00087 
00088   RegisterEntry *entry = &reg->entries[reg->oid_cnt++];
00089   entry->op = op;
00090   entry->oid = *oid;
00091   entry->create_size = create_size;
00092   entry->start_rw = start_rw;
00093   entry->length_rw = length_rw;
00094   entry->sizemod_size = sizemod_size;
00095 }
00096 
00097 void
00098 ESM_addToRegisterCreate(DbHandle const *dbh, const Oid *oid, unsigned int size)
00099 {
00100   ESM_addToRegister(dbh, CreateOP, oid, size, 0, 0, 0);
00101 }
00102 
00103 
00104 void
00105 ESM_addToRegisterRead(DbHandle const *dbh, const Oid *oid, int start, int length)
00106 {
00107   ESM_addToRegister(dbh, ReadOP, oid, 0, start, length, 0);
00108 }
00109 
00110 void
00111 ESM_addToRegisterWrite(DbHandle const *dbh, const Oid *oid, int start, int length)
00112 {
00113   ESM_addToRegister(dbh, WriteOP, oid, 0, start, length, 0);
00114 }
00115 
00116 void
00117 ESM_addToRegisterSizeMod(DbHandle const *dbh, const Oid *oid, unsigned int size)
00118 {
00119   ESM_addToRegister(dbh, SizeModOP, oid, 0, 0, 0, size);
00120 }
00121 
00122 void
00123 ESM_addToRegisterSizeGet(DbHandle const *dbh, const Oid *oid)
00124 {
00125   ESM_addToRegister(dbh, SizeGetOP, oid, 0, 0, 0, 0);
00126 }
00127 
00128 void
00129 ESM_addToRegisterDelete(DbHandle const *dbh, const Oid *oid)
00130 {
00131   ESM_addToRegister(dbh, DeleteOP, oid, 0, 0, 0, 0);
00132 }
00133 
00134 void
00135 ESM_addToRegisterLock(DbHandle const *dbh, const Oid *oid, OP lock)
00136 {
00137   ESM_addToRegister(dbh, lock, oid, 0, 0, 0, 0);
00138 }
00139 
00140 //
00141 // FRONTEND functions
00142 //
00143 
00144 const char *
00145 getOPString(OP op)
00146 {
00147   switch(op)
00148     {
00149     case CreateOP:
00150       return "CREATE";
00151 
00152     case ReadOP:
00153       return "READ";
00154 
00155     case WriteOP:
00156       return "WRITE";
00157 
00158     case DeleteOP:
00159       return "DELETE";
00160 
00161     case SizeModOP:
00162       return "SIZEMOD";
00163 
00164     case SizeGetOP:
00165       return "SIZEGET";
00166 
00167     case LockNOP:
00168       return "LOCKN";
00169 
00170     case LockSOP:
00171       return "LOCKS";
00172 
00173     case LockXOP:
00174       return "LOCKX";
00175 
00176     case LockSXOP:
00177       return "LOCKSX";
00178 
00179     case LockPOP:
00180       return "LOCKP";
00181     }
00182 
00183   return 0;
00184 }
00185 
00186 void
00187 registerEntryTrace(FILE *fd, const RegisterEntry *entry)
00188 {
00189   fprintf(fd, "%-25s %-10s ", getOidString(&entry->oid),
00190           getOPString(entry->op));
00191 
00192   switch(entry->op)
00193     {
00194     case CreateOP:
00195       fprintf(fd, "size=%d", entry->create_size);
00196       break;
00197 
00198     case ReadOP:
00199     case WriteOP:
00200       fprintf(fd, "start=%d, length=%d",
00201               entry->start_rw, entry->length_rw);
00202       break;
00203 
00204     case DeleteOP:
00205     case LockSOP:
00206     case LockNOP:
00207     case LockXOP:
00208     case LockSXOP:
00209     case LockPOP:
00210     case SizeGetOP:
00211       break;
00212 
00213     case SizeModOP:
00214       fprintf(fd, "size=%d", entry->sizemod_size);
00215       break;
00216     }
00217 
00218   fprintf(fd, "\n");
00219 }
00220 
00221 void
00222 registerTrace(FILE *fd, const Register *reg)
00223 {
00224   fprintf(fd, "Oid Count %d\n{\n", reg->oid_cnt);
00225   for (int i = 0; i < reg->oid_cnt; i++)
00226     {
00227       fprintf(fd, "\t");
00228       registerEntryTrace(fd, &reg->entries[i]);
00229     }
00230   fprintf(fd, "}\n");
00231 }
00232 
00233 }

Generated on Mon Dec 22 18:15:57 2008 for eyedb by  doxygen 1.5.3