IPC thread写法太晦涩

主要用到TLS,首次进入gHaveTLS为false,锁保护说明此函数很多其他函数在调用。通过if (pthread_key_create(&gTLS, threadDestructor) != 0),中threadDestructor(void *st)调用IPCThreadState::IPCThreadState()创建IPCThreadState对象,并将对象的索引设置为gTLS。再次进入后通过gTLS获取到IPCThreadState对象。
 1 IPCThreadState* IPCThreadState::self()
 2 {
 3     if (gHaveTLS) {
 4 restart:
 5         const pthread_key_t k = gTLS;
 6         IPCThreadState* st = (IPCThreadState*)pthread_getspecific(k);
 7         if (st) return st;
 8         return new IPCThreadState;
 9     }
10
11     if (gShutdown) return NULL;
12
13     pthread_mutex_lock(&gTLSMutex);
14     if (!gHaveTLS) {
15         if (pthread_key_create(&gTLS, threadDestructor) != 0) {
16             pthread_mutex_unlock(&gTLSMutex);
17             return NULL;
18         }
19         gHaveTLS = true;
20     }
21     pthread_mutex_unlock(&gTLSMutex);
22     goto restart;
23 }

通pthread_setspecific(gTLS, this);gTLS与IPCThreadState对象关联了。

 1 IPCThreadState::IPCThreadState()
 2     : mProcess(ProcessState::self()),
 3       mMyThreadId(androidGetTid()),
 4       mStrictModePolicy(0),
 5       mLastTransactionBinderFlags(0)
 6 {
 7     pthread_setspecific(gTLS, this);
 8     clearCaller();
 9     mIn.setDataCapacity(256);
10     mOut.setDataCapacity(256);
11 }
时间: 2024-11-09 06:23:09

IPC thread写法太晦涩的相关文章

Android深入浅出之Binder机制(转)

Android深入浅出之Binder机制 一 说明 Android系统最常见也是初学者最难搞明白的就是Binder了,很多很多的Service就是通过Binder机制来和客户端通讯交互的.所以搞明白Binder的话,在很大程度上就能理解程序运行的流程. 我们这里将以MediaService的例子来分析Binder的使用: l         ServiceManager,这是Android OS的整个服务的管理程序 l         MediaService,这个程序里边注册了提供媒体播放的服

Android深入浅出之Binder机制

一说明 Android系统最常见也是初学者最难搞明白的就是Binder了,很多很多的Service就是通过Binder机制来和客户端通讯交互的.所以搞明白Binder的话,在很大程度上就能理解程序运行的流程.我们这里将以MediaService的例子来分析Binder的使用:l        ServiceManager,这是Android OS的整个服务的管理程序l        MediaService,这个程序里边注册了提供媒体播放的服务程序MediaPlayerService,我们最后只

Android深入浅出之Binder机制【转】

Android深入浅出之Binder机制 一 说明 Android系统最常见也是初学者最难搞明白的就是Binder了,很多很多的Service就是通过Binder机制来和客户端通讯交互的.所以搞明白Binder的话,在很大程度上就能理解程序运行的流程. 我们这里将以MediaService的例子来分析Binder的使用: <!--[if !supportLists]-->l         <!--[endif]-->ServiceManager,这是Android OS的整个服务

漫谈并发编程(五):线程之间的协作

编写多线程程序需要进行线程协作,前面介绍的利用互斥来防止线程竞速是来解决线程协作的衍生危害的.编写线程协作程序的关键是解决线程之间的协调问题,在这些任务中,某些可以并行执行,但是某些步骤需要所有的任务都结束之后才能开动. wait()与notifyAll() wait()使你可以等待某个条件发生变化,wait()会在等待外部世界产生变化的时候将任务挂起,并且只有在notify()或notifyAll()发生时,即表示发生了某些感兴趣的事物,这个任务才会被唤醒并去检查所产生的变化. 调用sleep

Flume OutOfMemoryError错误

运行Flume没多久就报下面的异常: 2016-08-24 17:35:58,927 (Flume Thrift IPC Thread 8) [ERROR - org.apache.flume.channel.ChannelProcessor.processEventBatch(ChannelProcessor.java:196)] Error while writing to required channel: org.apache.flume.channel.MemoryChannel{na

GitHub 如何基於 Node.js 和 Chromium 開發 Atom?

看到回答里, 多数都没有回答到点子上, 还有些给了非常主观的意见而没有给出实际结论和分析过程. 题主的问题有四个: 1. Github 如何基于 Node.js 和 Chromium 开发 Atom? Atom 是基于 Atom-Shell (atom/atom-shell · GitHub) 开发的, atom-shell 是一个将 Chromium 和 Node.js (在最近的版本中已经替换成了 io.js 了) 整合在一起的 shell 框架. 那么他是如何整合 node.js 和 ch

RunLoop 总结:RunLoop的应用场景(一)

参考资料 好的书籍都是值得反复看的,那好的文章,好的资料也值得我们反复看.我们在不同的阶段来相同的文章或资料或书籍都能有不同的收获,那它就是好文章,好书籍,好资料. 关于iOS 中的RunLoop资料资料非常的少,以下几篇文章是总结的非常好的. CF框架源码(这是一份很重要的源码,可以看到CF框架的每一次迭代,我们可以下载最新的版本来分析,或与以下文章对比学习.目前最新的是CF-1153.18.tar.gz) RunLoop官方文档(学习iOS的任何技术,官方文档都是入门或深入的极好手册:我们也

用好lua+unity,让性能飞起来——lua与c#交互篇

前言 在看了uwa之前发布的<Unity项目常见Lua解决方案性能比较>,决定动手写一篇关于lua+unity方案的性能优化文. 整合lua是目前最强大的unity热更新方案,毕竟这是唯一可以支持ios热更新的办法.然而作为一个重度ulua用户,我们踩过了很多的坑才将ulua上升到一个可以在项目中大规模使用的状态.事实上即使到现在lua+unity的方案仍不能轻易的说可以肆意使用,要用好,你需要知道很多. 因此,这篇文章是从一堆简单的优化建议里头,逐步挖掘出背后的原因.只有理解了原因,才能很清

史上一流的好书都在这里!

阅读应该是伴随我们一生的事情,读什么应该是我们毕生都在思考的命题.其实,读书和吃饭一样,也有个人口味,但是最好不要挑食,人生最大的捷径就是,用时间和生命阅读和拥抱了世上一流的书.史上一流的好书都在这里,找来细细品读吧! 第一,文学不可不读.作家通过语言向人的想象力挑战,这是文学的基本功能.比如村上春树,他的题材和写法奇诡诱人,有人把他视为通俗作家中的摇滚乐手,推荐他的<挪威的森林>.<海边的卡夫卡>.卡尔维诺<树上的男爵>.米兰·昆德拉<生命中不能承受之轻>