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

在虚拟文件系统的消息队列里,主要就是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的操作,这样就非常方便系统的更新,容易增加新的功能。
posted @ 2008-04-23 22:32  ajuanabc  阅读(155)  评论(0)    收藏  举报