在虚拟文件系统的消息队列里,主要就是LLVFSThread::Request类的请求,Request类是嵌套类,定义在LLVFSThread类里面。它主要实现对类LLVFS的封装访问,让操作更加方便一些,当然它是继续QueuedRequest类的,这样才可以添加到消息队列里去,否则不能添加到这个消息队列容器,也不能实现请求处理的多态了。
下面是类Request的构造函数。
#001 LLVFSThread::Request::Request(handle_t handle, U32 priority, U32 flags,
#002
operation_t op, LLVFS* vfs,
#003
const LLUUID &file_id, const LLAssetType::EType file_type,
#004
U8* buffer, S32 offset, S32 numbytes) :
#005
QueuedRequest(handle, priority, flags),
#006
mOperation(op),
#007
mVFS(vfs),
#008
mFileID(file_id),
#009
mFileType(file_type),
#010
mBuffer(buffer),
#011
mOffset(offset),
#012
mBytes(numbytes),
#013
mBytesRead(0)
#014 {
#015
llassert(mBuffer);
#016
判断是否非法出错。
#017
if (numbytes <= 0 && mOperation != FILE_RENAME)
#018
{
#019
llwarns << "LLVFSThread: Request with numbytes = " << numbytes
#020
<< " operation = " << op
#021
<< " offset " << offset
#022
<< " file_type " << file_type << llendl;
#023
}
写数据到虚拟文件系统。
#024
if (mOperation == FILE_WRITE)
#025
{
#026
S32 blocksize = mVFS->getMaxSize(mFileID, mFileType);
#027
if (blocksize < 0)
#028
{
#029
llwarns << "VFS write to temporary block (shouldn't happen)" << llendl;
#030
}
#031
mVFS->incLock(mFileID, mFileType, VFSLOCK_APPEND);
#032
}
重新命名文件名称。
#033
else if (mOperation == FILE_RENAME)
#034
{
#035
mVFS->incLock(mFileID, mFileType, VFSLOCK_APPEND);
#036
}
从虚拟文件系统里读取数据。
#037
else // if (mOperation == FILE_READ)
#038
{
#039
mVFS->incLock(mFileID, mFileType, VFSLOCK_READ);
#040
}
#041 }
#042
下面的函数是正式开始操作虚拟文件系统,
#001 bool LLVFSThread::Request::processRequest()
#002 {
#003
bool complete = false;
如果是读取操作,就调用虚拟文件系统的getData函数来读取数据。
#004
if (mOperation == FILE_READ)
#005
{
#006
llassert(mOffset >= 0);
#007
mBytesRead = mVFS->getData(mFileID, mFileType, mBuffer, mOffset, mBytes);
#008
complete = true;
#009
//llinfos << llformat("LLVFSThread::READ '%s': %d bytes arg:%d",getFilename(),mBytesRead) << llendl;
#010
}
如果是写数据,就调用虚拟文件系统的storeData函数来写数据。
#011
else if (mOperation == FILE_WRITE)
#012
{
#013
mBytesRead = mVFS->storeData(mFileID, mFileType, mBuffer, mOffset, mBytes);
#014
complete = true;
#015
//llinfos << llformat("LLVFSThread::WRITE '%s': %d bytes arg:%d",getFilename(),mBytesRead) << llendl;
#016
}
如果是重新命名文件名称,就调用虚拟文件系统的函数renameFile。
#017
else if (mOperation == FILE_RENAME)
#018
{
#019
LLUUID* new_idp = (LLUUID*)mBuffer;
#020
LLAssetType::EType new_type = (LLAssetType::EType)mBytes;
#021
mVFS->renameFile(mFileID, mFileType, *new_idp, new_type);
#022
mFileID = *new_idp;
#023
complete = true;
#024
//llinfos << llformat("LLVFSThread::RENAME '%s': %d bytes arg:%d",getFilename(),mBytesRead) << llendl;
#025
}
#026
else
#027
{
#028
llerrs << llformat("LLVFSThread::unknown operation: %d", mOperation) << llendl;
#029
}
#030
return complete;
#031 }
通过上面函数调用,就把其它对虚拟文件系统的操作转换为对成员mVFS的操作,这样就非常方便系统的更新,容易增加新的功能。