您的位置:首页 > 其它

谷歌浏览器的源码分析(31)

2008-11-09 23:30 330 查看
上一次说到通过管道把接收到的HTTP数据通知另一个线程处理,它不是直接发送数据过去,而是把数据在共享内存里的句柄发送过去,达到高效通讯的目的。下面就来分析资源处理进程里,接收到这个消息之后,做些什么处理。这个消息的处理代码如下:

#001 void ResourceDispatcher::OnReceivedData(int request_id,
#002 SharedMemoryHandle shm_handle,
#003 int data_len) {
#004 // Acknowlegde the reception of this data.
回应这个消息,说已经收到数据了。[/b]
#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));

打开共享内存文件,使用只读的方式。[/b]
#011 SharedMemory shared_mem(shm_handle, true); // read only
#012

查找到请求下载的资源的请求标识号。[/b]
#013 PendingRequestList::iterator it = pending_requests_.find(request_id);

如果没有找到相应的请求标识号,就直接返回,不用处理这些数据。[/b]
#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

这里找到相应的请求标识号,就把数据放到请求信息里处理。[/b]
#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来通知资源进程已经把网络的数据接收完成了,可以进入下一步处理。然后在资源进程里就会处理这个消息,下一次再来分析这方面的代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: