日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

第二人生的源碼分析(四十四)虛擬文件系統(tǒng)的請(qǐng)求

系統(tǒng) 2233 0
在虛擬文件系統(tǒng)的消息隊(duì)列里,主要就是LLVFSThread::Request類的請(qǐng)求,Request類是嵌套類,定義在LLVFSThread類里面。它主要實(shí)現(xiàn)對(duì)類LLVFS的封裝訪問,讓操作更加方便一些,當(dāng)然它是繼續(xù)QueuedRequest類的,這樣才可以添加到消息隊(duì)列里去,否則不能添加到這個(gè)消息隊(duì)列容器,也不能實(shí)現(xiàn)請(qǐng)求處理的多態(tài)了。
?
下面是類Request的構(gòu)造函數(shù)。
#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?
?
判斷是否非法出錯(cuò)。
#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? ???? }
?
寫數(shù)據(jù)到虛擬文件系統(tǒng)。
#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? ???? }
?
從虛擬文件系統(tǒng)里讀取數(shù)據(jù)。
#037? ???? else // if (mOperation == FILE_READ)
#038? ???? {
#039? ??????????? mVFS->incLock(mFileID, mFileType, VFSLOCK_READ);
#040? ???? }
#041?}
#042?
?
下面的函數(shù)是正式開始操作虛擬文件系統(tǒng),
#001?bool LLVFSThread::Request::processRequest()
#002?{
#003? ???? bool complete = false;
?
如果是讀取操作,就調(diào)用虛擬文件系統(tǒng)的getData函數(shù)來讀取數(shù)據(jù)。
#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? ???? }
?
如果是寫數(shù)據(jù),就調(diào)用虛擬文件系統(tǒng)的storeData函數(shù)來寫數(shù)據(jù)。
#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? ???? }
?
如果是重新命名文件名稱,就調(diào)用虛擬文件系統(tǒng)的函數(shù)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?}
?
通過上面函數(shù)調(diào)用,就把其它對(duì)虛擬文件系統(tǒng)的操作轉(zhuǎn)換為對(duì)成員mVFS的操作,這樣就非常方便系統(tǒng)的更新,容易增加新的功能。

第二人生的源碼分析(四十四)虛擬文件系統(tǒng)的請(qǐng)求處理


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。。?/p>

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 赣州市| 池州市| 子洲县| 同江市| 疏勒县| 元朗区| 桃园市| 广汉市| 安远县| 淳化县| 邵东县| 贵溪市| 凤冈县| 芦溪县| 区。| 珠海市| 乌海市| 铜鼓县| 皮山县| 来安县| 隆安县| 大宁县| 宣城市| 南昌县| 团风县| 兰州市| 台东县| 嵊泗县| 洪江市| 错那县| 松潘县| 贵阳市| 信宜市| 宣恩县| 政和县| 淮北市| 水富县| 威远县| 旌德县| 崇州市| 岱山县|