// 存储格式 <MAGIC CODE> <LEN> <DATA> INT32 MessageStoreImpl::put(const MsgDataVector& msgs, const INT32 beginIndex, MapedFile& mapedFile, UINT32& wroteOffset) { INT32 storeCnt = 0; if(msgs.empty()) { return -1; } if(!this->m_MapedFileManager.getCurrentMapedFile(mapedFile, getMsgLen(msgs[beginIndex].len))) { return -1; } UINT32 writingOffset = mapedFile.write_offset; for(size_t i = beginIndex; i < msgs.size(); i++) { INT32 len = msgs[i].len; void* msg = msgs[i].msg; memcpy((char*)mapedFile.pmap + writingOffset, &MSG_BLOCK_MAGIC_CODE, sizeof(MSG_BLOCK_MAGIC_CODE)); writingOffset += sizeof(MSG_BLOCK_MAGIC_CODE); memcpy((char*)mapedFile.pmap + writingOffset, &len, sizeof(len)); writingOffset += sizeof(len); memcpy((char*)mapedFile.pmap + writingOffset, msg, len); writingOffset += len; storeCnt++; if((i + 1) < msgs.size()) { if((this->getMsgLen(msgs[i + 1].len) > (UINT32)(MAPED_FILE_SIZE_TMP1 - writingOffset))) { break; } } } wroteOffset = writingOffset; return storeCnt; }
EXTXMLMETHOD long OSXMLEncodeBuffer::write (FILE* fp) { return (long)fwrite (getMsgPtr(), 1, getMsgLen(), fp); }
void MessageStoreImpl::fetch(MsgIndexVector& msgIndexs, MSG_OFFSET& fetchedOffset, const INT32& max) { INT32 scanedMsgCnt = 0; MSG_OFFSET currentFetching = (MSG_OFFSET)m_fetchingOffset; const UINT32 minMsgLen = getMsgLen(0); while(scanedMsgCnt < max) { MapedFile mapedFile; MSG_OFFSET currentMapedKey = 0; if(!this->m_MapedFileManager.pickMapedFile(mapedFile, currentMapedKey, currentFetching)) { break; } bool currentMapedFileOver = false; // 数据在mmap memory buffer if(mapedFile.pmap != NULL) { UINT32 offset = currentFetching % MAPED_FILE_SIZE_TMP1; for(; (offset < mapedFile.write_offset) && (scanedMsgCnt < max);) { UINT32 lastOffset = offset; if((mapedFile.write_offset - offset) <= minMsgLen) { offset = mapedFile.write_offset; } else { INT32 magicCode = 0; INT32 msgLen = 0; memcpy(&magicCode, (char*)mapedFile.pmap + offset, sizeof(magicCode)); memcpy(&msgLen, (char*)mapedFile.pmap + offset + sizeof(magicCode), sizeof(msgLen)); // 有效Msg if(MSG_BLOCK_MAGIC_CODE == magicCode) { MsgIndex msgIndex; msgIndex.offset = lastOffset + getMsgLen(0); msgIndex.len = msgLen; msgIndexs.push_back(msgIndex); offset += getMsgLen(msgLen); scanedMsgCnt++; } #if MAPED_FILE_COMMIT_TYPE_FORWARD_ALIGN else { offset = mapedFile.write_offset; } #else // 长度>=8字节的空洞 else if(EMPTY_BLOCK_MAGIC_CODE == magicCode) { offset += getMsgLen(msgLen); } // 长度<8字节的空洞 else { while(0 == *((char*)mapedFile.pmap + offset)) offset++; } #endif } } currentMapedFileOver = offset >= mapedFile.write_offset; currentFetching += (offset - (currentFetching % MAPED_FILE_SIZE_TMP1)); }