有关TcpConnection::handleRead中的messageCallback_的小疑问
Closed this issue · 1 comments
tomatowithpotato commented
我看handleRead函数里会在判断接收到数据后,直接执行回调函数messageCallback_
ssize_t n = inputBuffer_.readFd(channel_->fd(), &savedErrno);
if (n > 0)
{
messageCallback_(shared_from_this(), &inputBuffer_, receiveTime);
}
但是在handleWrite中,回调函数writeCompleteCallback_是交给queueInLoop来执行的
if (writeCompleteCallback_)
{
loop_->queueInLoop(std::bind(writeCompleteCallback_, shared_from_this()));
}
为什么会有这种区别呢?求大佬赐教!!!!
chenshuo commented
为了防止 stack overflow,因为 writeCompleteCallback_ 往往会再次调用 TcpConnection::send()。
如果直接调用 writeCompleteCallback_,有可能出现递归:
send("a") -> sendInLoop("a") -> writeCompleteCallback_() -> send("b") -> sendInLoop("b") -> writeCompleteCallback_() -> send("c") -> sendInLoop("c") -> writeCompleteCallback_() -> ...