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 "fennel/common/CommonPreamble.h"
00025 #include "fennel/segment/CrcSegInputStream.h"
00026
00027 FENNEL_BEGIN_CPPFILE("$Id: //open/dev/fennel/segment/CrcSegInputStream.cpp#8 $");
00028
00029 SharedSegInputStream CrcSegInputStream::newCrcSegInputStream(
00030 SegmentAccessor const &segmentAccessor,
00031 PseudoUuid onlineUuid,
00032 PageId beginPageId)
00033 {
00034 return SharedSegInputStream(
00035 new CrcSegInputStream(
00036 segmentAccessor,onlineUuid,beginPageId),
00037 ClosableObjectDestructor());
00038 }
00039
00040 CrcSegInputStream::CrcSegInputStream(
00041 SegmentAccessor const &segmentAccessorInit,
00042 PseudoUuid onlineUuidInit,
00043 PageId beginPageId)
00044 : SegInputStream(segmentAccessorInit,beginPageId,sizeof(SegStreamCrc))
00045 {
00046 onlineUuid = onlineUuidInit;
00047 }
00048
00049 bool CrcSegInputStream::lockBufferParanoid()
00050 {
00051 if (!segmentAccessor.pSegment->isPageIdAllocated(currPageId)) {
00052 return false;
00053 }
00054 pageLock.lockShared(currPageId);
00055 if (!pageLock.getPage().isDataValid()) {
00056 return false;
00057 }
00058 if (!pageLock.isMagicNumberValid()) {
00059 return false;
00060 }
00061 SegStreamNode const &node = pageLock.getNodeForRead();
00062 SegStreamCrc const *pCrc =
00063 reinterpret_cast<SegStreamCrc const *>(&node+1);
00064 if (pCrc->pageId != currPageId) {
00065 return false;
00066 }
00067 if (pCrc->onlineUuid != onlineUuid) {
00068 return false;
00069 }
00070 crcComputer.reset();
00071 crcComputer.process_bytes(pCrc + 1,node.cbData);
00072 if (pCrc->checksum != crcComputer.checksum()) {
00073 return false;
00074 }
00075 PConstBuffer pFirstByte =
00076 reinterpret_cast<PConstBuffer>(&node) + cbPageHeader;
00077 setBuffer(pFirstByte,node.cbData);
00078 return true;
00079 }
00080
00081 void CrcSegInputStream::lockBuffer()
00082 {
00083 if (!lockBufferParanoid()) {
00084 pageLock.unlock();
00085 currPageId = NULL_PAGE_ID;
00086 nullifyBuffer();
00087 }
00088 }
00089
00090 FENNEL_END_CPPFILE("$Id: //open/dev/fennel/segment/CrcSegInputStream.cpp#8 $");
00091
00092