Fennel: /home/pub/open/dev/fennel/segment/CrcSegInputStream.cpp Source File (original) (raw)

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(&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