您的位置:首页 > 其它

第二人生的源码分析(四十四)虚拟文件系统的请求处理

2008-04-23 22:32 579 查看
在虚拟文件系统的消息队列里,主要就是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的操作,这样就非常方便系统的更新,容易增加新的功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐