IPCThreadState
来源:互联网 发布:淘宝热线怎么转人工 编辑:程序博客网 时间:2024/05/18 02:23
1.先看看IPCThreadState的声明
class IPCThreadState{public: static IPCThreadState* self(); static IPCThreadState* selfOrNull(); // self(), but won't instantiate sp<ProcessState> process(); 。。。 void joinThreadPool(bool isMain = true); // Stop the local process. void stopProcess(bool immediate = true); status_t transact(int32_t handle, uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); 。。。 private: IPCThreadState(); ~IPCThreadState(); status_t sendReply(const Parcel& reply, uint32_t flags); status_t waitForResponse(Parcel *reply, status_t *acquireResult=NULL); status_t talkWithDriver(bool doReceive=true); status_t writeTransactionData(int32_t cmd, uint32_t binderFlags, int32_t handle, uint32_t code, const Parcel& data, status_t* statusBuffer); status_t executeCommand(int32_t command); void clearCaller(); static void threadDestructor(void *st); static void freeBuffer(Parcel* parcel, const uint8_t* data, size_t dataSize, const size_t* objects, size_t objectsSize, void* cookie); const sp<ProcessState> mProcess; const pid_t mMyThreadId; Vector<BBinder*> mPendingStrongDerefs; Vector<RefBase::weakref_type*> mPendingWeakDerefs; Parcel mIn; Parcel mOut; status_t mLastError; pid_t mCallingPid; uid_t mCallingUid; int32_t mStrictModePolicy; int32_t mLastTransactionBinderFlags;};
IPCThreadState的构造函数也是私有的,也只能通过IPCThreadState::self()来初始化类的实例。
过IPCThreadState::self()的定义:
IPCThreadState* IPCThreadState::self(){ if (gHaveTLS) {restart: const pthread_key_t k = gTLS; IPCThreadState* st = (IPCThreadState*)pthread_getspecific(k); if (st) return st; return new IPCThreadState; } if (gShutdown) return NULL; pthread_mutex_lock(&gTLSMutex); if (!gHaveTLS) { if (pthread_key_create(&gTLS, threadDestructor) != 0) { pthread_mutex_unlock(&gTLSMutex); return NULL; } gHaveTLS = true; } pthread_mutex_unlock(&gTLSMutex); goto restart;}这个方法用于返回单实例的IPCThreadState。
IPCThreadState::IPCThreadState()定义:
IPCThreadState::IPCThreadState() : mProcess(ProcessState::self()), mMyThreadId(androidGetTid()), mStrictModePolicy(0), mLastTransactionBinderFlags(0){ pthread_setspecific(gTLS, this); clearCaller(); mIn.setDataCapacity(256); mOut.setDataCapacity(256);}IPCThreadState::IPCThreadState()获取了一份ProcessState实例,保存在mProcess成员变量中。
void IPCThreadState::joinThreadPool(bool isMain){ LOG_THREADPOOL("**** THREAD %p (PID %d) IS JOINING THE THREAD POOL\n", (void*)pthread_self(), getpid()); mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER); // This thread may have been spawned by a thread that was in the background // scheduling group, so first we will make sure it is in the default/foreground // one to avoid performing an initial transaction in the background. androidSetThreadSchedulingGroup(mMyThreadId, ANDROID_TGROUP_DEFAULT); status_t result; do { int32_t cmd; // When we've cleared the incoming command queue, process any pending derefs if (mIn.dataPosition() >= mIn.dataSize()) { size_t numPending = mPendingWeakDerefs.size(); if (numPending > 0) { for (size_t i = 0; i < numPending; i++) { RefBase::weakref_type* refs = mPendingWeakDerefs[i]; refs->decWeak(mProcess.get()); } mPendingWeakDerefs.clear(); } numPending = mPendingStrongDerefs.size(); if (numPending > 0) { for (size_t i = 0; i < numPending; i++) { BBinder* obj = mPendingStrongDerefs[i]; obj->decStrong(mProcess.get()); } mPendingStrongDerefs.clear(); } } // now get the next command to be processed, waiting if necessary result = talkWithDriver(); if (result >= NO_ERROR) { size_t IN = mIn.dataAvail(); if (IN < sizeof(int32_t)) continue; cmd = mIn.readInt32(); IF_LOG_COMMANDS() { alog << "Processing top-level Command: " << getReturnString(cmd) << endl; } result = executeCommand(cmd); } // After executing the command, ensure that the thread is returned to the // default cgroup before rejoining the pool. The driver takes care of // restoring the priority, but doesn't do anything with cgroups so we // need to take care of that here in userspace. Note that we do make // sure to go in the foreground after executing a transaction, but // there are other callbacks into user code that could have changed // our group so we want to make absolutely sure it is put back. androidSetThreadSchedulingGroup(mMyThreadId, ANDROID_TGROUP_DEFAULT); // Let this thread exit the thread pool if it is no longer // needed and it is not the main process thread. if(result == TIMED_OUT && !isMain) { break; } } while (result != -ECONNREFUSED && result != -EBADF); LOG_THREADPOOL("**** THREAD %p (PID %d) IS LEAVING THE THREAD POOL err=%p\n", (void*)pthread_self(), getpid(), (void*)result); mOut.writeInt32(BC_EXIT_LOOPER); talkWithDriver(false);}
0 0
- IPCThreadState
- IPCThreadState
- IPCThreadState 详解
- IPCThreadState中的TLS
- binder 与 ProcessState & IPCThreadState
- Android - Binder机制 - ProcessState和IPCThreadState
- Android - Binder机制 - ProcessState和IPCThreadState
- Android - Binder机制 - ProcessState和IPCThreadState
- Binder中的ProcessState和IPCThreadState分析
- Android Binder ProcessState & IPCThreadState相关介绍
- Android Binder ProcessState & IPCThreadState相关介绍
- Android - Binder机制 - ProcessState和IPCThreadState
- Android开发之ProcessState和IPCThreadState类分析
- Android开发之ProcessState和IPCThreadState类分析
- Android5.0中Binder相关的ProcessState和IPCThreadState的认识.
- 关于oracle中varchar2的最大长度
- mysql常用函数集合
- 虚拟机配置上网
- 去掉Eclipse自动生成Android的TitleBar
- CentOs下Apache配置全过程
- IPCThreadState
- Devexpress的gridcontrol控件 禁止删除列
- 15个小方法让你每天不疲倦
- yii笔记
- Android软键盘弹出时把布局顶上去的解决方法
- DOM 操作表格及样式
- 网络游戏服务器架构设计
- kconfig-language.txt
- [IPHONE]游戏引擎剖析