summaryrefslogtreecommitdiff
path: root/src/users.cpp
diff options
context:
space:
mode:
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2006-10-30 18:22:36 +0000
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2006-10-30 18:22:36 +0000
commitdd168c56c95a870de3d178edda48507ca47168fe (patch)
treeccb5fecc49eb49286600edc250ff414fbb6d2931 /src/users.cpp
parent2aa6c66308126842ce386a3c3d699dd8ab505bdf (diff)
WARNING: This commit breaks kqueue and select -- work in progress!
epoll now allows both a write and a read event on a socket at the same time. git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@5580 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src/users.cpp')
-rw-r--r--src/users.cpp18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/users.cpp b/src/users.cpp
index 3be7225d4..4b7e38f3c 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -639,11 +639,14 @@ void userrec::FlushWriteBuf()
}
if ((sendq.length()) && (this->fd != FD_MAGIC_NUMBER))
{
+ int old_sendq_length = sendq.length();
const char* tb = this->sendq.c_str();
int n_sent = write(this->fd,tb,this->sendq.length());
if (n_sent == -1)
{
- if (errno != EAGAIN)
+ if (errno == EAGAIN)
+ this->ServerInstance->SE->WantWrite(this);
+ else
this->SetWriteError(strerror(errno));
}
else
@@ -654,6 +657,8 @@ void userrec::FlushWriteBuf()
// update the user's stats counters
this->bytes_out += n_sent;
this->cmds_out++;
+ if (n_sent != old_sendq_length)
+ this->ServerInstance->SE->WantWrite(this);
}
}
}
@@ -690,6 +695,7 @@ const char* userrec::GetWriteError()
void userrec::Oper(const std::string &opertype)
{
+ this->ServerInstance->SE->WantWrite(this);
try
{
this->modes[UM_OPERATOR] = 1;
@@ -2018,7 +2024,15 @@ void userrec::HandleEvent(EventType et)
/* WARNING: May delete this user! */
try
{
- ServerInstance->ProcessUser(this);
+ switch (et)
+ {
+ case EVENT_READ:
+ ServerInstance->ProcessUser(this);
+ break;
+ case EVENT_WRITE:
+ this->FlushWriteBuf();
+ break;
+ }
}
catch (...)
{