码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • MessageQueue创建


    MessageQueue在native层初始化

    jlong android_os_MessageQueue_nativeInit(JNIEnv* env,jclass clazz){

        NativeMessageQueue* nativeMessageQueue = new NativeMessageQueue();

        return reinterpret_cast(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::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

               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)));

    }

    }}

  • 相关阅读:
    解决Redis Object Cache Pro插件无法使用高性能配置的解决方案
    代码圈复杂度治理小结
    Lua与C交互API接口总结
    scp 跨服务器传输命令,把一个服务器上的文件复制传到当前服务器目录下
    (线段树) 基础线段树常见问题总结
    Diffusion Autoencoders: Toward a Meaningful and Decodable Representation
    【模型剪枝】|Learning Efficient Convolutional Networks through Network Slimming
    关于「气味体验创造」的 19 个创意方案 #N1 线上工作坊成果分享
    TiDB 悲观事务模式
    JVM之【字节码/Class文件/ClassFile 内容解析】
  • 原文地址:https://blog.csdn.net/cryeye123/article/details/133611816
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号