From 7031d3ceb04161c4711d4737d0c3055556a67f24 Mon Sep 17 00:00:00 2001 From: yhy Date: Mon, 23 Dec 2024 19:17:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84write=20read=20hook=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/coroutine/coroutine_hook.cc | 34 +++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/coroutine/coroutine_hook.cc b/src/coroutine/coroutine_hook.cc index 2b77ad6..6143553 100644 --- a/src/coroutine/coroutine_hook.cc +++ b/src/coroutine/coroutine_hook.cc @@ -1,6 +1,8 @@ #include "coroutine_hook.hpp" #include "coroutine.hpp" #include "logger.hpp" +#include "fd_event.hpp" +#include "reactor.hpp" #include @@ -22,24 +24,44 @@ namespace tinyrpc { ssize_t read_hook(int fd, void *buf, size_t count) { logger() << "read_hook is calling"; - // TODO ... + FdEvent fe(fd); + fe.addListenEvent(IOEvent::READ); + Coroutine* curCoro = Coroutine::getCurrCoroutine(); + fe.setReadCallback([curCoro] () -> void{ + curCoro->resume(); + }); // fd 设置为 nonblock + fe.setNonblock(); // 尝试一下系统read, 返回值大于0直接返回 + int ret = g_sys_read_fun(fd, buf, count); + if(ret > 0) return ret; // fd 添加到 epoll 中 + Reactor::getReactor()->addFdEvent(&fe); Coroutine::yeild(); // yeild + Reactor::getReactor()->delFdEvent(&fe); // 调用系统 read 返回 - return -1; + return g_sys_read_fun(fd, buf, count); } ssize_t write_hook(int fd, const void *buf, size_t count) { logger() << "write_hook is calling"; - // TODO ... + FdEvent fe(fd); + fe.addListenEvent(IOEvent::WRITE); + Coroutine* curCoro = Coroutine::getCurrCoroutine(); + fe.setWriteCallback([curCoro] () -> void{ + curCoro->resume(); + }); // fd 设置为 nonblock - // 尝试一下系统read, 返回值大于0直接返回 + fe.setNonblock(); + // 尝试一下系统 write 返回值大于0直接返回 + int ret = g_sys_write_fun(fd, buf, count); + if(ret > 0) return ret; // fd 添加到 epoll 中 + Reactor::getReactor()->addFdEvent(&fe); Coroutine::yeild(); // yeild - // 调用系统 read 返回 - return -1; + Reactor::getReactor()->delFdEvent(&fe); + // 调用系统 write 返回 + return g_sys_write_fun(fd, buf, count); } }