chromium之tracked_objects
- // For each thread, we have a ThreadData that stores all tracking info generated
- // on this thread. This prevents the need for locking as data accumulates.
该文件用到了chromium之ThreadLocalStorage
看看头文件
- class ThreadData {
- public:
- typedef std::map<Location, Births*> BirthMap;
- typedef std::map<const Births*, DeathData> DeathMap;
- ThreadData();
- // Using Thread Local Store, find the current instance for collecting data.
- // If an instance does not exist, construct one (and remember it for use on
- // this thread.
- // If shutdown has already started, and we don't yet have an instance, then
- // return null.
- static ThreadData* current();
- // For a given about:objects URL, develop resulting HTML, and append to
- // output.
- static void WriteHTML(const std::string& query, std::string* output);
- // For a given accumulated array of results, use the comparator to sort and
- // subtotal, writing the results to the output.
- static void WriteHTMLTotalAndSubtotals(
- const DataCollector::Collection& match_array,
- const Comparator& comparator, std::string* output);
- // In this thread's data, find a place to record a new birth.
- Births* FindLifetime(const Location& location);
- // Find a place to record a death on this thread.
- void TallyADeath(const Births& lifetimes, const base::TimeDelta& duration);
- // (Thread safe) Get start of list of instances.
- static ThreadData* first();
- // Iterate through the null terminated list of instances.
- ThreadData* next() const { return next_; }
- MessageLoop* message_loop() const { return message_loop_; }
- const std::string ThreadName() const;
- // Using our lock, make a copy of the specified maps. These calls may arrive
- // from non-local threads.
- void SnapshotBirthMap(BirthMap *output) const;
- void SnapshotDeathMap(DeathMap *output) const;
- static void RunOnAllThreads(void (*Func)());
- // Set internal status_ to either become ACTIVE, or later, to be SHUTDOWN,
- // based on argument being true or false respectively.
- // IF tracking is not compiled in, this function will return false.
- static bool StartTracking(bool status);
- static bool IsActive();
- #ifdef OS_WIN
- // WARNING: ONLY call this function when all MessageLoops are still intact for
- // all registered threads. IF you call it later, you will crash.
- // Note: You don't need to call it at all, and you can wait till you are
- // single threaded (again) to do the cleanup via
- // ShutdownSingleThreadedCleanup().
- // Start the teardown (shutdown) process in a multi-thread mode by disabling
- // further additions to thread database on all threads. First it makes a
- // local (locked) change to prevent any more threads from registering. Then
- // it Posts a Task to all registered threads to be sure they are aware that no
- // more accumulation can take place.
- static void ShutdownMultiThreadTracking();
- #endif
- // WARNING: ONLY call this function when you are running single threaded
- // (again) and all message loops and threads have terminated. Until that
- // point some threads may still attempt to write into our data structures.
- // Delete recursively all data structures, starting with the list of
- // ThreadData instances.
- static void ShutdownSingleThreadedCleanup();
大致想想怎么用
1. 开始
开始运行,
- StartTracking(true)
2. 结束,并输出
- StartTracking(false)
- WriteHTML(...)
- 有个测试用例,可以看看
- TEST_F(TrackedObjectsTest, MinimalStartupShutdown) {
- // Minimal test doesn't even create any tasks.
- if (!ThreadData::StartTracking(true))
- return;
- EXPECT_FALSE(ThreadData::first()); // No activity even on this thread.
- ThreadData* data = ThreadData::current();
- EXPECT_TRUE(ThreadData::first()); // Now class was constructed.
- EXPECT_TRUE(data);
- EXPECT_TRUE(!data->next());
- EXPECT_EQ(data, ThreadData::current());
- ThreadData::BirthMap birth_map;
- data->SnapshotBirthMap(&birth_map); // Get all birth data
- EXPECT_EQ(0u, birth_map.size());
- ThreadData::DeathMap death_map;
- data->SnapshotDeathMap(&death_map);
- EXPECT_EQ(0u, death_map.size());
- ThreadData::ShutdownSingleThreadedCleanup();
- // Do it again, just to be sure we reset state completely.
- ThreadData::StartTracking(true);
- EXPECT_FALSE(ThreadData::first()); // No activity even on this thread.
- data = ThreadData::current();
- EXPECT_TRUE(ThreadData::first()); // Now class was constructed.
- EXPECT_TRUE(data);
- EXPECT_TRUE(!data->next());
- EXPECT_EQ(data, ThreadData::current());
- birth_map.clear();
- data->SnapshotBirthMap(&birth_map);
- EXPECT_EQ(0u, birth_map.size());
- death_map.clear();
- data->SnapshotDeathMap(&death_map);
- EXPECT_EQ(0u, death_map.size());
- ThreadData::ShutdownSingleThreadedCleanup();
- }
chromium之tracked_objects的更多相关文章
- chromium之tracked
//------------------------------------------------------------------------------ // Tracked is the b ...
- 【Chromium中文文档】线程
线程 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Threading. ...
- chromium之task
// A task is a generic runnable thingy, usually used for running code on a // different thread or fo ...
- chromium源码阅读
linux下chromium的入口函数在文件:src/chrome/app/chrome_exe_main_aura.cc 中 int main(int argc, const char** argv ...
- Chromium多线程模型设计和实现分析
Chromium除了远近闻名的多进程架构之外,它的多线程模型也相当引人注目的.Chromium的多进程架构是为了解决网页的稳定性问题,而多线程模型则是为了解决网页的卡顿问题.为了达到这个目的,Chro ...
- QT5利用chromium内核与HTML页面交互
在QT5.4之前,做QT开发浏览器只能选择QWebkit,但是有过使用的都会发现,这个webkit不是出奇的慢,简直是慢的令人发指,Release模式下还行,debug下你就无语了,但是webkit毕 ...
- Google之Chromium浏览器源码学习——base公共通用库(一)
Google的优秀C++开源项目繁多,其中的Chromium浏览器项目可以说是很具有代表性的,此外还包括其第三开发开源库或是自己的优秀开源库,可以根据需要抽取自己感兴趣的部分.在研究.学习该项目前的时 ...
- 如何在windows上编译Chromium (CEF3) 并加入MP3支持(二)
时隔一年,再次编译cef3,独一无二的目的仍为加入mp3支持.新版本的编译环境和注意事项都已经发生了变化,于是再记录一下. 一.编译版本 cef版本号格式为X.YYYY.A.gHHHHHHH X为主版 ...
- 如何在Windows上从源码编译Chromium (CEF3) 加入mp3支持
一.什么是CEF CEF即Chromium Embeded Framework,由谷歌的开源浏览器项目Chromium扩展而来,可方便地嵌入其它程序中以得到浏览器功能. CEF包括CEF1和CEF3两 ...
随机推荐
- 当Activity出现Exception时是如何处理的?
1.ActivityThread 2.PerformStop 在这里会调用mWindow.closeAllPanels(),从而关闭OptionMenu, ContextMenu.如果自己通过Wind ...
- rest-framework框架——解析器、ur控制、分页、响应器、渲染器、版本
一.解析器(parser) 解析器在reqest.data取值的时候才执行. 对请求的数据进行解析:是针对请求体进行解析的.表示服务器可以解析的数据格式的种类. from rest_framework ...
- 【数据库】1.0 MySQL入门学习(一)——常识性知识
1.0 什么是MySQL(官方发音 My Ess Que Ell)? 是一个快速.多线程.多用户和强壮的SQL数据库服务器,SQL是世界上最流行的标准化数据库语言. 名字来源:共同创办人Monty W ...
- 转载《学习HTML5 canvas遇到的问题》
学习HTML5 canvas遇到的问题 1. 非零环绕原则(nonzZero rule) 非零环绕原则是canvas在进行填充的时候是否要进行填充的判断依据. 在判断填充的区域拉一条线出来,拉到图形的 ...
- r.js压缩打包
AMD模块化开发中的代码压缩打包工具——r.js 环境搭建基于nodejs:用于AMD模块化开发中的项目文件压缩打包,不是AMD模式也是可以的 javascript部分 压缩javascript项目开 ...
- 企业Web应用创新实验
我现在设计一个小而美的管理工具,为此费劲心思搞“创新”.“创新”一词已经被滥用,但我...真的想弄出一点创新. 基于Web的企业应用,如CRM.项目管理.OA等软件,尽管经历十几年发展,所谓的理论有所 ...
- arcgis版接合图表5.2 免费软件,支持国家2000坐标系,ArcGIS10.0,ArcGIS10.1,ArcGIS10.2都可以使用
下载地址:http://files.cnblogs.com/gisoracle/jionmap52.rar 1. 国家2000,西安80,北京54.坐标系的接合图表生成.根据经纬度范围,坐标 ...
- mybooklist.cn 书单de故事六月十六日
1.我的30年30本书 刘苏里书单北京万圣书园总经理,以经营人文社科类图书著称.生于1960年,1983年毕业于北京大学国际政治系,1986年毕业于中国政法大学研究生院.
- May 26th 2017 Week 21st Friday
One thorn of experience is worth a whole wilderness of warning. 一次痛彻心扉的经历,抵得上千百次的告诫. Several days ag ...
- Django运行SQL语句
1.Manager.raw(raw_query, params=None, translations=None) >>> for p in Person.objects.raw('S ...