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
原创粉丝点击