⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filestreammanager_test.cpp

📁 机甲指挥官2源代码
💻 CPP
字号:
//===========================================================================//
// File:	filestrmmgr_test.cpp                                             //
// Contents: Implementation Details of resource management                   //
//---------------------------------------------------------------------------//
// Copyright (C) Microsoft Corporation. All rights reserved.                 //
//===========================================================================//

#include <Munga.hpp>
#pragma hdrstop

#if !defined(FILESTREAMMANAGER_HPP)
	#include <FileStreamManager.hpp>
#endif

#if !defined(APPLICATION_HPP)
	#include <Application.hpp>
#endif

//#############################################################################
//######################    TestFileManagerReceiver    ########################
//#############################################################################

#define FILE_BUFFERSIZE (1024*1024)
#define RandInt(x) (rand() % x)

class TestFileManagerReceiver:
	public Receiver
{
public:	
	TestFileManagerReceiver();
	~TestFileManagerReceiver();

	void
		Request(FileStream *file_stream);
	Logical
		IsDone()
			{return data == NULL;}
	
	static void
		InitializeClass();
	static void
		TerminateClass();

	static ClassID
		testFileManagerReceiverClassID;

	static const MessageEntry
		MessageEntries[];

	void
		FileReadFinishedMessageHandler(FileReadFinishedMessage *message);

	static ClassData
		*DefaultData;
		
	FileStream
		*fileStream;	
	size_t
		offset,
		size;
	void
		*data;		
	int
		tag;
};

const Receiver::MessageEntry
	TestFileManagerReceiver::MessageEntries[]=
{
	MESSAGE_ENTRY(TestFileManagerReceiver, FileReadFinished)
};

TestFileManagerReceiver::ClassData*
	TestFileManagerReceiver::DefaultData = NULL;

RegisteredClass::ClassID
	TestFileManagerReceiver::testFileManagerReceiverClassID;

void
	TestFileManagerReceiver::InitializeClass()
{
	testFileManagerReceiverClassID = RegisteredClass::AllocateTemporaryClassID();

	Verify(!DefaultData);
	DefaultData =
		new ClassData(
			testFileManagerReceiverClassID,
			"TestFileManagerReceiver",
			Receiver::DefaultData,
			ELEMENTS(MessageEntries),
			MessageEntries
		);
	Register_Object(DefaultData);
}

void
	TestFileManagerReceiver::TerminateClass()
{
	Unregister_Object(DefaultData);
	delete DefaultData;
	DefaultData = NULL;
}

TestFileManagerReceiver::TestFileManagerReceiver():
	Receiver(DefaultData)
{		
	data = NULL;
}

TestFileManagerReceiver::~TestFileManagerReceiver()
{
}

void
	TestFileManagerReceiver::Request(FileStream *file_stream)
{
	Check_Object(file_stream);
	fileStream = file_stream;
	tag = RandInt(256);
	
	//
	// Choose offset and size
	//
	offset = RandInt(FILE_BUFFERSIZE-1);
	size = RandInt(FILE_BUFFERSIZE-1) + 1;
	size = Min(size, (FILE_BUFFERSIZE - offset));	

	//
	// Allocate memory for read
	//
	data = new char[size];
	Register_Pointer(data);
	
	//
	// Request read
	//
	Check_Object(Munga_Application);
	Check_Object(Munga_Application->GetFileStreamManager());
	Munga_Application->GetFileStreamManager()->ReadRequest(
		data,
		file_stream,
		offset,
		size,
		this,
		&tag
	);	
}

void
	TestFileManagerReceiver::FileReadFinishedMessageHandler(
		FileReadFinishedMessage *message
	)
{
	Check_Object(this);
	Check_Object(message);
	Verify(message->memoryAddress == data);
	Verify(message->clientField == &tag);
	
	//
	// Load the segment directly from file
	//
	char *confirm_data = new char[size];
	Register_Pointer(confirm_data);
	Check_Object(fileStream);
	fileStream->SetPointer(offset);
	fileStream->ReadBytes(confirm_data, size);
	
	//
	// Verify that the data is the same as that received
	//
	Verify(memcmp(data, confirm_data, size) == 0);

	Unregister_Pointer(confirm_data);
	delete[] confirm_data;
	Unregister_Pointer(data);
	delete[] data;
	data = NULL;
}	

//
//#############################################################################
//#############################################################################
//
void
	FileStreamManager::TestClass()
{	
	DEBUG_STREAM << "Starting FileStreamManager Test...\n";

	TestFileManagerReceiver::InitializeClass();

	//
	// Create a file for testing.  Fill with a sequence numbers.
	//
	unsigned char *buffer;
	size_t i;
	
	buffer = new unsigned char[FILE_BUFFERSIZE];
	Register_Pointer(buffer);
	for (i = 0; i < FILE_BUFFERSIZE; i++)
	{
		buffer[i] = (unsigned char)(i % 255);
	}	

	Check_Object(Munga_Application);
	FileStreamManager *file_mgr = Munga_Application->GetFileStreamManager();
	Check_Object(file_mgr);
	FileStream *output_file_stream = file_mgr->MakeFileStream();
	Register_Object(output_file_stream);

	output_file_stream->Open("filestrmtest.dat", FileStream::WriteOnly);
	output_file_stream->WriteBytes(buffer, FILE_BUFFERSIZE);

	output_file_stream->Close();
	Unregister_Object(output_file_stream);
	delete output_file_stream;
	Unregister_Pointer(buffer);
	delete[] buffer;

	FileStream *file_stream = file_mgr->MakeFileStream();
	Register_Object(file_stream);
	file_stream->Open("filestrmtest.dat", FileStream::ReadOnly);

	//
	// Perform test
	//	
	const int iterations = 1000;	
	TestFileManagerReceiver *receiver;
	ChainOf<TestFileManagerReceiver*> socket(NULL);
	
	for (i = 0; i < iterations; i++)
	{
		//
		// Request reads
		//
		receiver = new TestFileManagerReceiver;
		Register_Object(receiver);
		socket.Add(receiver);
		receiver->Request(file_stream);

		//
		// Process events and the file stream manager
		//
		Check_Object(Munga_Application);
		Munga_Application->ProcessOneEvent();
		Check_Object(Munga_Application->GetFileStreamManager());
		Munga_Application->GetFileStreamManager()->Execute();
	}
	
	ChainIteratorOf<TestFileManagerReceiver*> iterator(&socket);
	
	while ((receiver = iterator.GetCurrent()) != NULL)
	{
		//
		// Delete receivers as they finish
		//
		Check_Object(receiver);
		if (receiver->IsDone())
		{
			Unregister_Object(receiver);
			delete receiver;
		}
		iterator.First();
		
		//
		// Process events and the file stream manager
		//
		Check_Object(Munga_Application);
		Munga_Application->ProcessOneEvent();
		Check_Object(Munga_Application->GetFileStreamManager());
		Munga_Application->GetFileStreamManager()->Execute();
	}

	file_stream->Close();	
	Unregister_Object(file_stream);
	delete file_stream;

	TestFileManagerReceiver::TerminateClass();	
}	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -