黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

谷歌瀏覽器的源碼分析(31)

系統(tǒng) 2266 0
?

上一次說(shuō)到通過(guò)管道把接收到的 HTTP 數(shù)據(jù)通知另一個(gè)線程處理,它不是直接發(fā)送數(shù)據(jù)過(guò)去,而是把數(shù)據(jù)在共享內(nèi)存里的句柄發(fā)送過(guò)去,達(dá)到高效通訊的目的。下面就來(lái)分析資源處理進(jìn)程里,接收到這個(gè)消息之后,做些什么處理。這個(gè)消息的處理代碼如下:

?

#001 ? void ResourceDispatcher::OnReceivedData(int request_id,

#002 ????????????????????????????????????????? SharedMemoryHandle shm_handle,

#003 ????????????????????????????????????????? int data_len) {

#004 ??? // Acknowlegde the reception of this data.

回應(yīng)這個(gè)消息,說(shuō)已經(jīng)收到數(shù)據(jù)了。

#005 ??? IPC::Message::Sender* sender = message_sender();

#006 ??? if (sender)

#007 ????? sender->Send(

#008 ????????? new ViewHostMsg_DataReceived_ACK(MSG_ROUTING_NONE, request_id));

#009 ?

#010 ??? DCHECK((shm_handle && data_len > 0) || (!shm_handle && !data_len));

?

打開(kāi)共享內(nèi)存文件,使用只讀的方式。

#011 ??? SharedMemory shared_mem(shm_handle, true); ? // read only

#012 ?

?

查找到請(qǐng)求下載的資源的請(qǐng)求標(biāo)識(shí)號(hào)。

#013 ??? PendingRequestList::iterator it = pending_requests_.find(request_id);

?

如果沒(méi)有找到相應(yīng)的請(qǐng)求標(biāo)識(shí)號(hào),就直接返回,不用處理這些數(shù)據(jù)。

#014 ??? if (it == pending_requests_.end()) {

#015 ????? // this might happen for kill()ed requests on the webkit end, so perhaps

#016 ????? // it shouldn't be a warning...

#017 ????? DLOG(WARNING) << "Got data for a nonexistant or finished request";

#018 ????? return;

#019 ??? }

#020 ?

?

這里找到相應(yīng)的請(qǐng)求標(biāo)識(shí)號(hào),就把數(shù)據(jù)放到請(qǐng)求信息里處理。

#021 ??? PendingRequestInfo& request_info = it->second;

#022 ?

#023 ??? if (data_len > 0 && shared_mem.Map(data_len)) {

#024 ????? RESOURCE_LOG("Dispatching " << data_len << " bytes for " <<

#025 ?????????????????? request_info.peer->GetURLForDebugging());

#026 ????? const char* data = static_cast<char*>(shared_mem.memory());

#027 ????? request_info.peer->OnReceivedData(data, data_len);

#028 ??? }

#029 ? }

?

上面這個(gè)函數(shù)實(shí)現(xiàn)接收到 HTTP 數(shù)據(jù),并且把數(shù)據(jù)放到請(qǐng)求的緩沖區(qū)里,但它沒(méi)有知道什么時(shí)候接收數(shù)據(jù)完成,顯然有另外一個(gè)消息來(lái)做這些的工作,就是下面類 ResourceDispatcherHost 的函數(shù):

?

#001 ??? bool OnResponseCompleted(int request_id, const URLRequestStatus& status) {

#002 ????? receiver_->Send(new ViewMsg_Resource_RequestComplete(

#003 ????????? routing_id_, request_id, status));

#004 ?

#005 ????? // If we still have a read buffer, then see about caching it for later...

#006 ????? if (spare_read_buffer_) {

#007 ??????? read_buffer_.reset();

#008 ????? } else if (read_buffer_.get() && read_buffer_->memory()) {

#009 ??????? spare_read_buffer_ = read_buffer_.release();

#010 ????? }

#011 ????? return true;

#012 ??? }

?

這個(gè)函數(shù)里通過(guò)發(fā)送消息 ViewMsg_Resource_RequestComplete 來(lái)通知資源進(jìn)程已經(jīng)把網(wǎng)絡(luò)的數(shù)據(jù)接收完成了,可以進(jìn)入下一步處理。然后在資源進(jìn)程里就會(huì)處理這個(gè)消息,下一次再來(lái)分析這方面的代碼。

谷歌瀏覽器的源碼分析(31)


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

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

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

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

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論