分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

上一次说到通过管道把接收到的HTTP数据通知另一个线程处理,它不是直接发送数据过去,而是把数据在共享内存里的句柄发送过去,达到高效通讯的目的。下面就来分析资源处理进程里,接收到这个消息之后,做些什么处理。这个消息的处理代码如下:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

#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来通知资源进程已经把网络的数据接收完成了,可以进入下一步处理。然后在资源进程里就会处理这个消息,下一次再来分析这方面的代码。

分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

谷歌浏览器的源码分析 31相关推荐

  1. 谷歌浏览器的源码分析 13

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 上一次说 ...

  2. 谷歌chrome浏览器的源码分析(四)

    上一次说到需要调用这个OpenURLFromTab函数,那么这个函数是做什么的呢?从名称上可能猜到它是打开网页,但是是从目前TAB页里打开呢?还是新建一个?或者使用每个TAB页一个进程呢?这些疑惑,只 ...

  3. JDK源码分析 NIO实现

    总列表:http://hg.openjdk.java.net/ 小版本:http://hg.openjdk.java.net/jdk8u jdk:http://hg.openjdk.java.net/ ...

  4. ConcurrentHashMap实现原理及源码分析

    ConcurrentHashMap是Java并发包中提供的一个线程安全且高效的HashMap实现(若对HashMap的实现原理还不甚了解,可参考我的另一篇文章HashMap实现原理及源码分析),Con ...

  5. Python3.5源码分析-内存管理

    Python3源码分析 本文环境python3.5.2. 参考书籍<<Python源码剖析>> python官网 Python3的内存管理概述 python提供了对内存的垃圾收 ...

  6. tornado源码分析

    tornado源码分析 本源码为tornado1.0版本 源码附带例子helloworld import tornado.httpserver import tornado.ioloop import ...

  7. 基于JDK1.8---HashMap源码分析

    基于JDK1.8-HashMap源码简要分析 HashMap继承关系 HashMap:根据键的 hashCode 值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不 ...

  8. Java源码详解四:String源码分析--openjdk java 11源码

    文章目录 注释 类的继承 数据的存储 构造函数 charAt函数 equals函数 hashCode函数 indexOf函数 intern函数 本系列是Java详解,专栏地址:Java源码分析 Str ...

  9. Spring Cloud源码分析(二)Ribbon(续)

    因文章长度限制,故分为两篇.上一篇:<Spring Cloud源码分析(二)Ribbon> 负载均衡策略 通过上一篇对Ribbon的源码解读,我们已经对Ribbon实现的负载均衡器以及其中 ...

最新文章

  1. Python IDE ——Anaconda+PyCharm的安装与配置
  2. (iOS-基本知识)int long NSInteger 入门与兼容问题讲解
  3. 安卓8.1 字体 ——现在6.0,7.0,8.0都可以体验
  4. Android初级第一讲---Android开发环境的配置
  5. 重磅!win10无法安装.NET Framework 3.5服务解决办法(附离线安装包下载)
  6. 2016 博客导读总结 amp; 个人感悟
  7. 疑似iPhone 13 mini原型机曝光:后置相机模组排布方式变化
  8. Windows Terminal v0.7 发布:支持分屏、重排选项卡和改进 UI
  9. windows c++ 服务 当前用户提权_windows xp 提权
  10. redis linux工具安装,linux 安装redis缓存工具
  11. Java String substring()方法示例
  12. 【Oracle学习笔记】索引
  13. Emotet***病毒升级,对抗杀毒软件的能力再次增强
  14. 360急速浏览器有道词典屏幕取词问题
  15. PHP+Swoole 搭建 Websocket 聊天室
  16. matplotlib绘制鼠标的十字光标(自定义方式,官方实例)
  17. Java内存监控程序_java内存监控工具及命令
  18. 4种Word文档解除密码保护的方法
  19. 文本标注工具-brat安装
  20. 情人节有哪些礼物可以送给男朋友的,情人节送礼推荐

热门文章

  1. 半导体激光器基础知识学习计划
  2. mysql数据库repair_MySQL数据库中的REPAIR TABLE语法介绍
  3. android dts配置_Android 4.0系统支持DTS音效_华为手机_手机Android频道-中关村在线
  4. 人工智能,深度学习,机器学习平台,界面UI
  5. 单片机系列(2)流水灯程序是如何写入单片机的
  6. VM下安装雪豹Mac OS系统
  7. weex解决scrollView嵌套webview高度问题,安卓自定义weex组件webview,
  8. 一周企业财报 | 安踏、易车、药明康德、贝塔斯曼等23家企业发布业绩
  9. K近邻法算法(KNN)及其R实现
  10. 温度传感器php,温度传感器基础知识介绍