亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統 1834 0
?

上一次說到通過管道把接收到的 HTTP 數據通知另一個線程處理,它不是直接發送數據過去,而是把數據在共享內存里的句柄發送過去,達到高效通訊的目的。下面就來分析資源處理進程里,接收到這個消息之后,做些什么處理。這個消息的處理代碼如下:

?

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

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

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

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

回應這個消息,說已經收到數據了。

#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));

?

打開共享內存文件,使用只讀的方式。

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

#012 ?

?

查找到請求下載的資源的請求標識號。

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

?

如果沒有找到相應的請求標識號,就直接返回,不用處理這些數據。

#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 ?

?

這里找到相應的請求標識號,就把數據放到請求信息里處理。

#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 ? }

?

上面這個函數實現接收到 HTTP 數據,并且把數據放到請求的緩沖區里,但它沒有知道什么時候接收數據完成,顯然有另外一個消息來做這些的工作,就是下面類 ResourceDispatcherHost 的函數:

?

#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 ??? }

?

這個函數里通過發送消息 ViewMsg_Resource_RequestComplete 來通知資源進程已經把網絡的數據接收完成了,可以進入下一步處理。然后在資源進程里就會處理這個消息,下一次再來分析這方面的代碼。

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


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产高清一级视频在线观看 | 97在线免费 | 狠狠综合久久久久综合小说网 | 久久www香蕉免费人成 | 国产在线精品成人一区二区三区 | 91精品成人免费国产 | 亚洲欧美综合区自拍另类 | 欧美大吊视频 | 久久国产亚洲观看 | 女人洗澡一级毛片一级毛片 | 国产成人精品视频一区二区不卡 | 日日夜夜免费精品视频 | 黑人巨大精品战中国美女 | 日韩毛片在线免费观看 | 国产伦精品一区二区三区高清 | 久草在线看片 | 四虎成人免费网站在线 | 一级一片免费播放 | 国产婷婷色一区二区三区 | 天堂一区二区三区精品 | 老头做爰xxxx视频 | 波多野结衣一区 | 国产亚洲精品久久久久久久网站 | 久久中文字幕一区二区 | 美女视频免费在线观看 | 性生生活三级视频观看 | 精品免费视频 | 国产欧美乱码在线看 | 国产这里有精品 | 黄色网址亚洲 | 亚洲欧美日韩高清在线看 | 欧美成人性生活视频 | 操美女在线| 玖玖中文字幕 | 中文亚洲日韩欧美 | 成人精品mv视频在线观看 | 日本一级黄色录像 | 日日摸夜夜摸无需播放器 | 鲁一鲁中文字幕久久 | 黄色免费看网站 | 久久99久久 |