00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include "DirShortId.H"
00037 #include "ShortIdKey.H"
00038 #include "logging.H"
00039 #include "VestaLog.H"
00040 #include "VRConcurrency.H"
00041 #include "VDirChangeable.H"
00042
00043 #include <VestaConfig.H>
00044 #include <Thread.H>
00045
00046 using std::fstream;
00047
00048
00049 struct DirShortIdInfo {
00050 Bit32 sp;
00051 };
00052 typedef Table<ShortIdKey, DirShortIdInfo>::Default DirShortIdTable;
00053 typedef Table<ShortIdKey, DirShortIdInfo>::Iterator DirShortIdIter;
00054
00055
00056 static Basics::mutex mu;
00057 static DirShortIdTable* dsidTable;
00058
00059
00060 void
00061 InitDirShortId() throw()
00062 {
00063 dsidTable = NEW(DirShortIdTable);
00064 }
00065
00066
00067
00068
00069 ShortId
00070 NewDirShortId(const FP::Tag& fptag, Bit32 sp) throw()
00071 {
00072 mu.lock();
00073 DirShortIdInfo info;
00074 ShortIdKey sidkey;
00075 Word hash = fptag.Hash();
00076 do {
00077 sidkey.sid =
00078 (ShortId) ((hash & ~ShortIdBlock::leafFlag) | ShortIdBlock::dirFlag);
00079 hash++;
00080 } while (dsidTable->Get(sidkey, info));
00081 info.sp = sp;
00082 dsidTable->Put(sidkey, info);
00083 mu.unlock();
00084 return sidkey.sid;
00085 }
00086
00087
00088 Bit32 GetDirShortId(ShortId sid) throw()
00089 {
00090 mu.lock();
00091 ShortIdKey sidkey(sid);
00092 DirShortIdInfo info;
00093 if (!dsidTable->Get(sidkey, info)) {
00094 info.sp = 0;
00095 }
00096 mu.unlock();
00097 return info.sp;
00098 }
00099
00100
00101
00102 void
00103 SetDirShortId(ShortId sid, Bit32 sp) throw()
00104 {
00105 mu.lock();
00106 ShortIdKey sidkey(sid);
00107 DirShortIdInfo info;
00108 info.sp = sp;
00109 (void) dsidTable->Put(sidkey, info);
00110 mu.unlock();
00111 }
00112
00113
00114 void
00115 DeleteDirShortId(ShortId sid) throw()
00116 {
00117 mu.lock();
00118 ShortIdKey sidkey(sid);
00119 DirShortIdInfo info;
00120 (void) dsidTable->Delete(sidkey, info);
00121 mu.unlock();
00122 }
00123
00124
00125
00126 void
00127 LogAllDirShortIds(char* tag)
00128 {
00129 mu.lock();
00130 DirShortIdIter iter(dsidTable);
00131 ShortIdKey sidkey;
00132 DirShortIdInfo info;
00133 VRLog.start();
00134 VRLog.put("(");
00135 VRLog.put(tag);
00136 while (iter.Next(sidkey, info)) {
00137 char sid[16];
00138 sprintf(sid, " 0x%08x", sidkey.sid);
00139 VRLog.put(sid);
00140 }
00141 VRLog.put(")\n");
00142 VRLog.commit();
00143 mu.unlock();
00144 }
00145
00146
00147
00148 void
00149 CheckpointAllDirShortIds(Bit32& nextSP, fstream& ckpt)
00150 {
00151 mu.lock();
00152 DirShortIdIter iter(dsidTable);
00153 ShortIdKey sidkey;
00154 DirShortIdInfo info;
00155 while (iter.Next(sidkey, info)) {
00156 VDirChangeable vs(VestaSource::immutableDirectory,
00157 (Bit8*) VMemPool::lengthenPointer(info.sp));
00158 (void) vs.checkpoint(nextSP, ckpt);
00159 }
00160 mu.unlock();
00161 }
00162
00163
00164
00165 void
00166 DeleteAllDirShortIds() throw()
00167 {
00168 mu.lock();
00169 dsidTable->Init(dsidTable->Size());
00170 mu.unlock();
00171 }
00172