MessageQueue创建

MessageQueue在native层初始化

jlong android_os_MessageQueue_nativeInit(JNIEnv* env,jclass clazz){

    NativeMessageQueue* nativeMessageQueue = new NativeMessageQueue();

    return reinterpret_cast<jlong>(nativeMessageQueue);

}

当前线程Looper::getForThread()里面拿到局部缓存的looper,

NativeMessageQueue::NativeMessageQueue(){

    mLooper = Looper::getForThread();

     if(mLooper == NULL){

         mLooper = new Looper(flase);

         Looper::setForThread(mLooper);

     }

}

Looper::getForThread()局部缓存:调用了liunx的接口pthread_getspecific接口

  sp<Looper> Looper::getForThread(){

     int result = pthread__once(&gTLSOnce,initTLSKey);

     return(Looper*)pthread_getspecific(gTLSKey);

 }

native层的looper,消息循环的核心部分

Looper::Looper(bool allowNonCallbacks){

    mWakeEventFd = eventfd(0,EFD_NONBLOCK);

    rebuildEpollLocked();

}  eventfd计数器性能比普通管道好

void Looper::rebuildEpollLocked(){

  mEpollFd = epoll_create(EPOLL_SIZE_HINT);

  struct epoll_event eventltem;

  memset(&eventItem,0,sizeof(epoll_event));

  eventltem.events = EPOLLIN;

  eventltem.data.fd = mWakeEventFd;

  epoll_ctl(mEpollFd,EPOLL_CTL_ADD,mWakeEventFd,&eventltem);

  ......

}

void Looper::wake(){

    uint64_t inc = 1;

    ssize_t nWrite = write(mWakeEventFd,&inc,sizeof(uint64_t));

}

int Looper::pollOnce(int timeoutMillis,int*outFd,...){

for(::){

     polllnner(timeoutMillis);

   }

}

polllnner函数的核心是epoll_wait

int Loopet::polllnner(int timeoutMillis){

     struct epoll_event eventltems[EPOLL_MAX_EVENTS];

     int eventCount = epoll_wait(mEpollFd,eventltems,...);

     for(int i=0;i<eventCount;i++){

           int fd = eventltems[i].data.fd;

           uint32_t epollEvents = eventltems[i].events;

           if(fd==mWakeEventFd &&(epollEvents&EPOLLIN)){

             awoken();

           }

            ......}......}

awoken读事件,消化事件

        void Looper ::awoken(){

                uint64_t counter;

                 read(mWakeEventFd,&counter,sizeof(uint64_t)));

}

}}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值