00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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 = ®->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
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, ®->entries[i]);
00229 }
00230 fprintf(fd, "}\n");
00231 }
00232
00233 }