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