chromium中使用scoped_ptr

之前也总结过chromium中scoped_ptr的用法,我又看了下代码,chromium43对scoped_ptr又做了一些修改。我再写篇博客总结一下。写博客如果像代码管理系统一样有版本号,那就可以持续对一篇博客维护更新了。 scoped_ptr顾名思义,就是作用域中的智能指针。scoped_ptr获得一个指针指向对象的管理权,然后在scoped_ptr超出自己的作用域的时候自动销毁这个对象。 比如这个类: scoped_ptr不能拷贝或者赋值,所以只能用在它的构造函数或者调用reset方法去接管一个对象的指针。 调用reset方法,scoped_ptr会销毁现有指针指向的对象,然后再管理新的对象的指针。可以用get获得对象的原始指针。 scoped_ptr可以通过release的方法返回自己管理的指针,之后自己不再管理这个指针了。这种情形下用户需要自己管理对象的生命周期,返回的指针需要用户自己管理,或者交给其他智能指针管理。 其实scoped_ptr跟c++11中的unique_ptr是非常类似的,scoped_ptr也实现了“移动但不能拷贝”的属性。你可以通过移动来转移对象,从而可以避免构造临时对象。 你可以通过Pass方法把一个scoped_ptr“转移”给另一个scoped_ptr,之前说scoped_ptr是不能拷贝或者赋值的。 get,release,Pass三者区别是: get是获得原始指针,scoped_ptr还是继续管理着指针 release是获得原始指针,scoped_ptr不再管理指针 Pass是转移指针管理权到另外一个scoped_ptr,自己不再管理指针 Pass()可以正确的处理向上的类型转换,比如: 另外scoped_ptr还支持数组: base库还提供了make_scoped_ptr的函数从原始指针中创建并返回一个scoped_ptr。 此外chromium中还有个ScopedVector。这个是对vector容器的封装,使其可以存放并管理对象指针,在ScopedVector超出作用域的时候销毁指针所指向的对象。 ... Read More | Share it now!

2015一个新的开始

上周提离职了,这周开始休年假。 2012年加入奇虎360,一转眼已是3年多了。毕业同一期进来的同学,还剩下三分之一,有种“知交半零落”的感觉,大家都在各自的人生方向上越走越远。 有很多感慨无处抒发,以后360浏览器就拜托尹大神,何大神了,还有小蔡、涛神。 前段时候,一直很忙,原以为过完年刚来不会很忙的,谁知需求一个接着一个。后来又赶上升级浏览器内核,更是忙的不得了。尹大神跟何大神也是,任劳任怨。现在想想,公司确实挺亏待我们几个的。 一忙起来,博客就好久没更新了。之前我跟自己定下的目标是一个星期至少要更新一次,否则这周就过得太糊涂了,连个总结都没有。 最近业余时间其实一直在研究chromium的ui底层,有些心得。但是要跟向别人表达清楚却比较难,我迫切的需要一种工具来帮我分析与表达软件工程。 我选择了UML。大学里学过UML,只知一点皮毛,但是一直没怎么实践过。现在也正是一个契机把UML运用起来。 我也对未来的生活充满了期望,总之加油,量变产生质变。 ... Read More | Share it now!

chromium browser端启动逻辑

chromium浏览器的入口是chrome_exe_main_win.cc,wWinMain主函数就在这个文件里。wWinMain里面的逻辑很简单,里面MainDllLoader会根据命令行type参数去加载chrome.dll或者chrome_child.dll,然后调用dll中的ChromeMain函数。   在ChromeMain中会创建ChromeMainDelegate对象,生成ContentMainParams传递给content::ContentMain,再通过ContentMainParams去初始化ContentMainRunner对象。 ChromeMainDelegate继承自content::ContentMainDelegate,主要是在围绕Sandbox初始化的前后做一些工作,另外创建一些ChromeContentBrowserClient,ChromeContentRendererClient,ChromeContentPluginClient,ChromeContentUtilityClient的对象,浏览器的更多逻辑都在ChromeContent*Client这些对象中。此外还调用content::SetContentClient设置ChromeContentClient。 ChromeMainDelegate的那些方法都会在ContentMainRunner中陆续调用到。 在ContentMainRunner::Initialize函数中又调用ChromeMainDelegate::BasicStartupComplete。ChromeMainDelegate::BasicStartupComplete做一些初始化工作并调用content::SetContentClient。 ContentMainRunner::Initialize又调用ContentClientInitializer通过ChromeMainDelegate去CreateContent*Client。然后ContentMainRunner::Initialize继续做一些初始化工作。 ContentMainRunner::Initialize中接着调用ChromeMainDelegate::PreSandboxStartup。 PreSandboxStartup中初始化UserDataDir。初始化logging系统。 ContentMainRunner::Initialize中接着初始化Sandbox。初始化工作完成。 然后调用ContentMainRunner::Run,在run里面调用RunNamedProcessTypeMain。RunNamedProcessTypeMain先调用ChromeMainDelegate::RunProcess,然后根据进程类型调用对应的BrowserMain,RendererMain,PluginMain,GpuMain等等。 在BrowserMain中,有个BrowserMainRunner,跟ContentMainRunner类似。BrowserMainRunner::Initialize中根据MainFunctionParams创建BrowserMainLoop。BrowserMainLoop::Init中调用ChromeContentBrowserClient::CreateBrowserMainParts创建BrowserMainParts*。同时还在这里Initialize创建其他线程消息循环。 最后BrowserMainRunnerImpl::Run调用BrowserMainLoop::RunMainMessageLoopParts开始了UI线程的循环。 ChromeContentBrowserClient是浏览器browser逻辑的枢纽。ChromeContentBrowserClient::CreateBrowserMainParts里面创建BrowserMainParts。BrowserMainParts又可以添加其他的ChromeBrowserMainExtraPartsViews,ChromeBrowserMainExtraPartsAsh,ChromeBrowserMainExtraPartsAura对象,这些对象封装的逻辑在BrowserMainRunner里面中被调用执行。 ChromeBrowserMainParts继承自BrowserMainParts,它是个非常总要的类。它创建了BrowserProcessImpl、StartupBrowserCreator、ChromeProcessSingleton、Profile、PrefService等对象。BrowserProcessImpl创建了各种Manager,Service,还有IO线程。StartupBrowserCreator,StartupBrowserCreatorImpl则是开始创建一个Browser,并初始化Profile。 Profile,ProfileImpl继承自content::BrowserContext,对应着browser回话上下文信息和用户配置信息。PrefService则是能把Profile里面的状态增删改查并保存到文件中。 OffTheRecordProfileImpl也是继承自Profile,它是用于隐身模式的浏览器上下文和用户配置信息。 WebContents代表着浏览器tab页中渲染出来的网页。WebContentsImpl则进一步继承了更多的网页方面的操控。Browser则是继承自WebContentsDelegate,它会收到来自WebContents的变化并做出响应。 ... Read More | Share it now!

一次失败的游戏开发经历

心里纠结了很久,今天决定放弃开发unity3d游戏。开发这个unity3d游戏占据了我太多的精力,而且还看不到这个项目的终点,所以决定先放弃了。 从刚开始的信心满满,意气风发,到现在垂头丧气,不得不承认自己的能力有限。说实话,要进入一个自己不熟悉的领域,还是需要谨慎的。为了开发unity3d游戏,我买了5本书,看了好几个视频教程。可以说对unity3d这个软件本身的使用,我还是比较熟悉了。但是之前没有开发3D游戏的经验,对于自己做一个游戏没有思路,不知道路从哪里开始走,怎么走。 最开始没有3d模型和模型的动作动画,后来去淘宝买了一些资源,从里面淘到一些有用的。素材问题算是初步解决了。 后来开始做场景,这个完全没有经验。不知道做多大,只能一次次尝试。工作量比预想中的大多了。一开始想把游戏的三个关卡都完成,实际上光完成一个关卡就很费劲了。 还有诸多游戏的细节,角色、敌人的攻击,生命值,跑动,环境的特效。太多太多了东西了,而我有太多太多方面不熟悉了。 放弃心里真是不甘,毕竟已经投入了这么多心血。逃避责任就会带来轻松,可那恰恰是“生命中不能承受之轻”。 不过要承认自己的能力的局限,原谅自己,迎接一个新的开始。 ... Read More | Share it now!

chromium开发设置代理

在中国,由于某些客观原因,经常无法访问google服务。在做chromium开发的时候,depot_tools工具经常无法正常运行,用git或者svn也不能从服务器获取到代码。 如果有vpn,开启vpn就好了。但是公司内部偏偏又不能使用vpn。不过路并未堵死,我们可以使用http代理来访问google服务。 depot_tools代理 运行gclient... Read More | Share it now!

深入chromium中的多线程

  Callback 绑定到一个函数上。 绑定到一个类成员函数上。 Bind 动态绑定参数。 这个局部绑定函数内部是根据重载函数实现的,所以参数的顺序是绑定的放在前面,定义MyFunc时,未绑定的参数放在后面。 WeakPtr可取消task。 参数包装函数 base::Unretained()。解除传递给base::Bind()的第一个参数类成员函数的类必须是引用计数类型的限制。但是你需要确保参数的生命周期必须持续到callback执行完成。 base::Owned()。把一个原始指针的管理器转移给base::Callback。TaskRunners关闭的时候不能保证callbacks会被执行,所以把管理器转移给Callback,可以防资源泄漏。 base::Passed()。传递scoped对象的给callback。base::Passed()需要scoped的参数类型,这样意味着callback只能执行一次。 base::ConstRef()。把参数当作const... Read More | Share it now!

chromium中的多线程概述

刚开始接触chromium代码的时候,觉得它的多线程非常别扭,有些事情只能在某些线程上才能做,还得bind函数PostTask来PostTask去的。有时候在不同地方获取几个不同的参数,写出的代码支离破碎,PostTask导致逻辑不连贯,非常不习惯这样的。 即使非常讨厌也不得不接受,只有掌握了chromium的多线程,才能随心所欲的写出正确的代码。以前走过很多弯路,再把chromium的多线程文档翻译一遍,写篇博客总结一下。 一般来说我们不必在chromium中创建新的线程,chromium一开始就为我们创建好了几个线程。大多数线程都是属于BrowserProcess对象管理的。 ui_thread:程序起来的主线程。 io_thread:处理browser进程跟其他子进程通信的线程,网络资源的请求也在通过这个线程调度。 file_thread:文件操作线程。 db_thread:数据库操作线程,比如cookie数据库的读取。 safe_browsing_thread:不知道干嘛的。 History:历史记录数据库读取线程。 Proxy... Read More | Share it now!