mozilla的IO实现是分层的,本质上和BIO是一样的,只是写法不同罢了,最上层,mozilla封装了一个结构体:
struct PRFileDesc {
const PRIOMethods *methods; //本层的IO函数的实现
PRFilePrivate *secret;
PRFileDesc *lower, *higher; //上下两层,如此所有的层次可以三个三个连成链表
void (PR_CALLBACK *dtor)(PRFileDesc *fd);
PRDescIdentity identity; //标识
};
关于mozilla对分层io描述符的实现请参考nsprpub/pr/src/io/prio.c和nsprpub/pr/src/io/prlayer.c,特别值得一提的是最具有代表性的push操作:
PR_IMPLEMENT(PRStatus) PR_PushIOLayer(PRFileDesc *stack, PRDescIdentity id, PRFileDesc *fd)
{
PRFileDesc *insert = PR_GetIdentitiesLayer(stack, id);
if (stack == insert) { //插入在当前IO栈的顶端
PRFileDesc copy = *stack;
*stack = *fd;
*fd = copy;
fd->higher = stack;
stack->lower = fd;
stack->higher = NULL;
} else { //插入在当前IO栈的任意位置
fd->lower = insert;
fd->higher = insert->higher;
insert->higher->lower = fd;
insert->higher = fd;
}
return PR_SUCCESS;
}
和OpenSSL的BIO_push是十分类似的,只是BIO_push只能在顶端push,是真正的push,而mozilla的实现命名为insert倒是更好。类似的,PR_CreateIOLayerStub和OpenSSL的BIO_new很类似,都是初始化一个新的“要插入”的io描述符,BIO_next在mozilla中直接通过结构体引用,即fd->lower,BIO中的BIO_METHOD实现了本层的io策略,而mozilla的prio实现中的PRIOMethods起着同样的作用。
通过使用PRFileDesc以及prio所提供的众接口,你可以将一系列的io例程堆积在一起,形成一个io栈,这就是分层的思想。分层的IO可以很方便的加入任何自定义的过滤策略和数据加工策略。突然想到,windows操作系统的drivers目录下有一个叫做tcpip.sys的文件,而unix在/dev目录下亦有一个ip,tcp文件。
分享到:
相关推荐
本文主要介绍了 Mozilla 的历史、现状、技术架构、应用前景等方面的内容。Mozilla 是一个开源的开发平台,可以跨平台地开发应用程序。其历史可以追溯到 Netscape 公司开发的浏览器,1998 年开源后,逐渐演变成一个...
### Mozilla源码编译详解 ...理解并掌握这些基础知识对于深入研究 Mozilla 的架构和特性非常有帮助。此外,随着技术的发展,虽然现在使用 Git 等版本控制系统更为普遍,但对于历史版本的学习和理解也是非常有价值的。
Mozilla 是一个开源软件项目,由Mozilla基金会领导,其主要成果是Firefox浏览器和Thunderbird电子邮件客户端。这个压缩包包含了两个关于Mozilla平台开发的重要资源:《Mozilla Developer Center》和《Prentice.Rapid...
Mozilla 架构理解 Mozilla 的核心是 Gecko 渲染引擎,负责解析和显示网页内容。它基于组件对象模型(Component Object Model, COM),提供了一种跨平台的方式来构建和运行应用程序。此外,XPCOM(跨平台组件对象...
《深入解析org.mozilla.javascript-1.7.2.jar》 在Java开发中,JavaScript引擎的使用日益广泛,其中Mozilla的Rhino引擎是备受开发者青睐的一款。本文将围绕"org.mozilla.javascript-1.7.2.jar"这个资源包,详细讲解...
《深入解析Mozilla JavaScript引擎:org.mozilla.javascript-1.7.2.jar.zip详解》 JavaScript,作为互联网上最广泛使用的脚本语言,其在Web开发中的地位不可动摇。而Mozilla的JavaScript实现,以其强大的功能和良好...
org.mozilla.universalchardet.jar org.mozilla.universalchardet.jar
该书深入探讨了Mozilla的架构和工具,旨在帮助开发者高效地利用这一开源浏览器技术构建跨平台的应用程序。 书中首先介绍了Mozilla的基础知识,包括其核心组件如XUL(XML User Interface Language)、XBL(XML ...
本电子书为MDC(Mozilla Developer Center)http://developer.mozilla.org/的离线浏览版,共收录网页计4143页,包括AJAX,CSS,DOM,HTML,Javascript,NSS,RDF,RSS,SVG,XBL,XForms,XML,XML Web Services,...
Mozilla Firefox 是一款非常流行的开源网络浏览器,以其安全性、速度和用户隐私保护而闻名。这款浏览器由Mozilla基金会维护,其核心是Gecko渲染引擎,能够解析并显示网页内容。"mozilla help.rar" 这个压缩包文件...
标题中的“mozilla检测网页编码的jar包”实际上指的是Mozilla开源项目中的一个子模块,用于识别网页的字符编码。这个jar包并非来自Mozilla浏览器的核心代码,而可能是Mozilla Foundation或相关的开源社区开发的一个...
Mozilla的SpiderMonkey是第一个JavaScript引擎,由Mozilla基金会开发,用于支持Firefox浏览器和其他Mozilla相关项目。这个引擎实现了ECMAScript标准,使得JavaScript代码能够被高效地解析和执行。 SpiderMonkey的...
IE和Mozilla兼容性汇总
Mozilla内核是网络浏览器的核心组件,它为许多流行的浏览器提供了基础,包括Firefox、Thunderbird以及一系列其他开源浏览器项目。这个核心是由Mozilla基金会开发的,它致力于维护一个开放、安全和可定制的网络浏览...
1. **Mozilla架构**:书中详细介绍了Mozilla的组件架构,包括XUL(XML User Interface Language)用于创建用户界面,XPCOM(Cross-Platform Component Object Model)用于组件间的通信,以及JavaScript作为主要的...
Firefox Lockwise 是一个元存储库,用于收集Mozilla的实验性(以前称为Lockbox)的文档和项目范围的任务。...docker build --tag mozilla-lockwise.github.io . 然后创建并运行一个容器来运行本地Je
Mozilla Firefox V3.5.4,若需要最新版本,请去mozilla官方网站:http://www.mozilla.com/en-US/
"mozilla-toolkit-versioning" 是一个专为处理Mozilla工具包版本控制的开源库,它专注于解析Mozilla工具包版本格式。这个库的重要性在于,它帮助开发者准确理解和操作与Mozilla相关的项目版本信息,从而确保软件的...
多进程架构(Electrolysis/E10S)让浏览器运行更稳定,每个标签页都在独立的进程中运行,避免一个页面崩溃影响其他页面。 在用户界面设计上,Firefox注重简洁与易用性,提供了多种主题供用户选择。同时,Firefox的...
这个项目的官方网站,mozilla-iot.github.io,提供了关于 Mozilla IoT 的各种资源、文档和项目信息,旨在促进开源软件在物联网领域的应用。 在该项目的 GitHub 页面上,你可以找到“mozilla-iot.github.io-master”...