为什么 libco 要删除epoll status .

新手上路,请多包涵

首先我们以 Tencent/libco 的使用样例 example_echosvr.cpp 为例,阐述我的疑惑,是真的搞不懂了,真心希望得到帮助.

 int fd = co_accept(g_listen_fd, (struct sockaddr *)&addr, &len); // accept
        if (fd < 0)
        {
            printf("  co_accept()  fd < 0 \n");
            struct pollfd pf = {0};
            pf.fd = g_listen_fd;
            pf.events = (POLLIN | POLLERR | POLLHUP);
            co_poll(co_get_epoll_ct(), &pf, 1, 1000);
            continue;
        }

co_poll->co_poll_inner函数将g_listen_fd注册进epoll,然后给他设置了一个定时器,然后切换出 CPU,(在这里将data.ptr指针指向一个结构,该结构中包含当前协程的指针.那这样当g_listen_fd上有连接到来时,epoll就可以通过data.ptr 指针直接唤醒对应的accept_routine 协程即可,唤醒后处在co_poll_inner函数中,

但是这时 Libco 删除了g_listen_fd和其所对应的定时器,然后回到上面函数accept即可.这看起来并没有什么不对之处.但是我想了一下,那这样的花,每次都要进过这个过程不是很麻烦吗?

实在是理解不了他那里为什么要把 fd 删除的原因????????

阅读 1.5k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进