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 #include "VestaSource.H"
00026 #include "VMemPool.H"
00027 #include "VForward.H"
00028 #include <assert.h>
00029 #include "logging.H"
00030
00031 Bit32
00032 VForward::create(const LongId& longid) throw ()
00033 {
00034 VForward* vf;
00035 vf = (VForward*) VMemPool::allocate(VMemPool::vForward, sizeof(VForward));
00036 *(vf->longid()) = longid;
00037 return VMemPool::shortenPointer(vf);
00038 }
00039
00040 void
00041 VForward::markCallback(void* closure, VMemPool::typeCode type) throw ()
00042 {
00043
00044 }
00045
00046 bool
00047 VForward::sweepCallback(void* closure, VMemPool::typeCode type,
00048 void* addr, Bit32& size) throw ()
00049 {
00050 VForward* vf = (VForward*) addr;
00051 bool ret = vf->visited();
00052 vf->setVisited(false);
00053 size = sizeof(VForward);
00054 return ret;
00055 }
00056
00057 void
00058 VForward::rebuildCallback(void* closure, VMemPool::typeCode type,
00059 void* addr, Bit32& size) throw ()
00060 {
00061
00062 VForward* vf = (VForward*) addr;
00063 size = sizeof(VForward);
00064 }
00065
00066 Bit32
00067 VForward::checkpoint(Bit32& nextSP, std::fstream& ckpt) throw ()
00068 {
00069 if (visited()) return redirection();
00070 Bit32 newSP = nextSP;
00071 int pad = (-sizeof(VForward)) & VMemPool::alignmentMask;
00072 nextSP += sizeof(VForward) + pad;
00073 ckpt.write((char *) rep, sizeof(VForward));
00074 while (pad--) {
00075 ckpt.put(VMemPool::freeByte);
00076 }
00077
00078 if (!ckpt.good()) {
00079 Repos::dprintf(DBG_ALWAYS,
00080 "write to checkpoint file failed: errno %d\n", errno);
00081 assert(ckpt.good());
00082 }
00083 setVisited(true);
00084 setRedirection(newSP);
00085 return newSP;
00086 }