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),作者:wangyuntao

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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux epoll 源码分析 1

    epoll的事件触发机制有两种,分别为 level-triggered 和 edge-triggered。

    wangyuntao
  • VirtualBox的internal网络模式进一步补充

    之前写过一篇文章 VirtualBox的各种网络模式要如何选择?里面总结了有关virtualbox的各种网络模式,以及应该如何选择。

    wangyuntao
  • Git示例教程 - 查看指定提交的修改内容

    wangyuntao
  • Linux Epoll 一网打尽

    epoll同样是linux上的IO多路复用的一种实现,内核在实现时使用的数据结构相比select要复杂,但原理上并不复杂,我们力求在下面的描述里抽出主干,理清思...

    扫帚的影子
  • 跨函数使用内存案例

    孙晨c
  • 递归简论递归的重要法则

    用户2436820
  • Python学习之类

    之前写的博客,都是借鉴别的博文或者是环境的配置,没有自己的东西,掌握的很少。以后的博文,我都会尽力加上一些自己的东西。现在开始进入我的python世界吧!

    py3study
  • qiime2学习笔记(一)

    最近学习肠道微生物方面的知识,有一部分测序数据需要学习分析。鉴于qiime已经升级为qiime2,还有了图形版本,真是越来越人性化了,但是图形版本还处于原型阶段...

    用户1075469
  • JavaScript设计模式--观察者模式

    观察者模式(发布-订阅模式):其定义对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。 在JavaScript中,一般使...

    奋飛
  • C++中的显式类型转化

      类型转化也许大家并不陌生,int i; float j; j = (float)i; i = (int)j; 像这样的显式转化其实很常见,强制类型转换可能会...

    弗兰克的猫

扫码关注云+社区

领取腾讯云代金券