示例#1
0
	// 存储格式 <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;
	}
示例#2
0
EXTXMLMETHOD long OSXMLEncodeBuffer::write (FILE* fp)
{
   return (long)fwrite (getMsgPtr(), 1, getMsgLen(), fp);
}
示例#3
0
	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));
			}