Linux epoll 源码分析 3

在上一篇文章 Linux epoll 源码分析 2 中,我们分析了 epoll_ctl 的 ep_insert 方法,在这里我们继续看下 ep_remove 和 ep_modify 方法。

我们先看下 ep_remove 方法

// fs/eventpoll.c static int ep_remove(struct eventpoll *ep, struct epitem *epi) { ... struct file *file = epi->ffd.file; ... // 将epitem从tcp socket的事件变动通知队列中移除 ep_unregister_pollwait(ep, epi); ... // 从eventpoll中的红黑树数据结构中移除 rb_erase_cached(&epi->rbn, &ep->rbr); ... // 如果epitem在eventpoll的rdllist队列中,也移除 if (ep_is_linked(&epi->rdllink)) list_del_init(&epi->rdllink); ... return 0; }

再看下ep_modify 方法

static int ep_modify(struct eventpoll *ep, struct epitem *epi, struct epoll_event *event) { ... epi->event.events = event->events; epi->event.data = event->data; ... revents = ep_item_poll(epi, &pt, 1); ... if (revents & event->events) ... if (!ep_is_linked(&epi->rdllink)) { list_add_tail(&epi->rdllink, &ep->rdllist); ... if (waitqueue_active(&ep->wq)) wake_up_locked(&ep->wq); ... } spin_unlock_irq(&ep->lock); } ... return 0; }

该方法的逻辑和ep_insert方法里的逻辑比较像,它先覆盖epitem中epoll_event的旧值,然后检查该文件当前已经就绪的事件,如果这些事件中有我们感兴趣的事件,则把epitem放到eventpoll的rdllist队列中,最后通知因调用epoll_wait堵塞的线程,它们可以继续执行了。

至此,epoll的所有逻辑都已讲完。

有关tcp在何种情况下,会通知给epoll何种事件,我们会在其他文章中详细讲解。

本文分享自微信公众号 - Linux内核及JVM底层相关技术研究(ytcode)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 昨天去面试,这5个Python面试题都被考到了,Python面试题No6

    这个考点考了python的解压赋值的知识点,即 a,b,c,middle,d,e,f = list, middle = [1,2,3,4,5]。

    梦想橡皮擦
  • 18个Python高效编程技巧!

    初识Python语言,觉得python满足了我上学时候对编程语言的所有要求。python语言的高效编程技巧让我们这些大学曾经苦逼学了四年c或者c++的人,兴奋的...

    1480
  • 五一4天就背这些Python面试题了,Python面试题No12

    os 属于 python内置模块,所以细节在官网有详细的说明,本道面试题考察的是基础能力了,所以把你知道的都告诉面试官吧 官网地址 https://docs....

    梦想橡皮擦
  • 一个C#开发者重温C++的心路历程

    作为一个C#开发为什么要重新学习C++呢?因为在C#在很多业务场景需要调用一些C++编写的COM组件,如果不了解C++,那么,很容易注定是要被C++同事忽悠的。

    Kiba518
  • 「Python调试器」,快速定位各种疑难杂症!!!

    现在很多的编辑器其实都带着「调试程序」的功能,比如写 c/c++ 的 codeblocks,写 Python 的 pycharm,这种图形界面的使用和显示都相当...

    一墨编程学习
  • 揭秘PyTorch内核!核心开发者亲自全景解读(47页PPT)

    PyTorch是一个开源的Python机器学习库,基于Torch,已成为最受欢迎的机器学习框架之一。

    新智元
  • 2019年python、golang、java、c++如何选择?

    2019年python、golang、java、c++如何选择?那我们就这几门语言详细的比一比呗。

    李海彬
  • 你真的了解 Java 8 中的 lambda 表达式、方法引用、函数式接口、默认方式、静态方法吗

    lambda 表达式在项目中也是用到了,这种新的语法的加入,对于使用 Java 多年的我,我觉得是如虎添翼的感觉哈,这种新的语法,大大的改善了以前的 Java ...

    好好学java
  • Golang之变量去哪儿

    写过C/C++的同学都知道,调用著名的malloc和new函数可以在堆上分配一块内存,这块内存的使用和销毁的责任都在程序员。一不小心,就会发生内存泄露,搞得胆战...

    梦醒人间
  • 学C语言好,还是学C++好呢?这两个专业在哪些领域用得最多?

    从事嵌入式开发十几年,基本上围绕着这两种编程语言展开,都可以直接操作底层的编程语言,用的越熟练越是感觉工具属性越强。虽然两种编程语言分属于不同的编程思想,用的时...

    程序员互动联盟

扫码关注云+社区

领取腾讯云代金券