this->state = I_CONNECTING;
- if (!ServerInstance->SE->AddFd(this, FD_WANT_NO_READ | FD_WANT_SINGLE_WRITE))
+ if (!ServerInstance->SE->AddFd(this, FD_WANT_NO_READ | FD_WANT_SINGLE_WRITE | FD_WRITE_WILL_BLOCK))
return I_ERR_NOMOREFDS;
this->Timeout = new SocketTimeout(this->GetFd(), this, timeout, ServerInstance->Time());
}
}
+/* Don't try to prepare huge blobs of data to send to a blocked socket */
+static const int MYIOV_MAX = IOV_MAX < 128 ? IOV_MAX : 128;
+
void StreamSocket::DoWrite()
{
if (sendq.empty())
{
// Prepare a writev() call to write all buffers efficiently
int bufcount = sendq.size();
-
- // cap the number of buffers at IOV_MAX
- if (bufcount > IOV_MAX)
+
+ // cap the number of buffers at MYIOV_MAX
+ if (bufcount > MYIOV_MAX)
{
- bufcount = IOV_MAX;
+ bufcount = MYIOV_MAX;
}
int rv_max = 0;
// connection.
this->sock->OnTimeout();
this->sock->OnError(I_ERR_TIMEOUT);
-
- /* NOTE: We must set this AFTER DelFd, as we added
- * this socket whilst writeable. This means that we
- * must DELETE the socket whilst writeable too!
- */
this->sock->state = I_ERROR;
ServerInstance->GlobalCulls.AddItem(sock);