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

系统 1875 0
在虚拟文件系统的消息队列里,主要就是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的操作,这样就非常方便系统的更新,容易增加新的功能。

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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论