Cleanup of some internals. Tested via m_httpd.

git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@10527 e03df62e-2008-0410-955e-edbf42e46eb7
This commit is contained in:
w00t 2008-09-12 12:08:25 +00:00
parent e462e71f10
commit 425fe205d0
2 changed files with 32 additions and 60 deletions

View File

@ -311,15 +311,9 @@ class CoreExport BufferedSocket : public EventHandler
*/ */
BufferedSocketState GetState(); BufferedSocketState GetState();
/** /** Mark a socket as being connected and call appropriate events.
* Only the core should call this function.
* When called, it is assumed the socket is ready
* to read data, and the method call routes the
* event to the various methods of BufferedSocket
* for you to handle. This can also cause the
* socket's state to change.
*/ */
bool Poll(); bool InternalMarkConnected();
/** /**
* This method causes the socket to close, and may * This method causes the socket to close, and may

View File

@ -512,54 +512,27 @@ void SocketTimeout::Tick(time_t)
this->sock->Timeout = NULL; this->sock->Timeout = NULL;
} }
bool BufferedSocket::Poll() bool BufferedSocket::InternalMarkConnected()
{ {
#ifndef WINDOWS /* Our socket was in write-state, so delete it and re-add it
if (!Instance->SE->BoundsCheckFd(this)) * in read-state.
return false; */
#endif this->SetState(I_CONNECTED);
if (Instance->SE->GetRef(this->fd) != this) if (this->GetIOHook())
return false;
switch (this->state)
{ {
case I_CONNECTING: Instance->Logs->Log("SOCKET",DEBUG,"Hook for raw connect");
/* Our socket was in write-state, so delete it and re-add it try
* in read-state. {
*/ this->GetIOHook()->OnRawSocketConnect(this->fd);
#ifndef WINDOWS }
if (this->fd > -1) catch (CoreException& modexcept)
{ {
this->Instance->SE->DelFd(this); Instance->Logs->Log("SOCKET",DEBUG,"%s threw an exception: %s", modexcept.GetSource(), modexcept.GetReason());
if (!this->Instance->SE->AddFd(this)) return false;
return false; }
}
#endif
this->SetState(I_CONNECTED);
if (this->GetIOHook())
{
Instance->Logs->Log("SOCKET",DEBUG,"Hook for raw connect");
try
{
this->GetIOHook()->OnRawSocketConnect(this->fd);
}
catch (CoreException& modexcept)
{
Instance->Logs->Log("SOCKET",DEBUG,"%s threw an exception: %s", modexcept.GetSource(), modexcept.GetReason());
}
}
return this->OnConnected();
break;
case I_CONNECTED:
/* Process the read event */
return this->OnDataReady();
break;
default:
break;
} }
return true; return this->OnConnected();
} }
void BufferedSocket::SetState(BufferedSocketState s) void BufferedSocket::SetState(BufferedSocketState s)
@ -599,6 +572,7 @@ void BufferedSocket::HandleEvent(EventType et, int errornum)
switch (et) switch (et)
{ {
case EVENT_ERROR: case EVENT_ERROR:
{
switch (errornum) switch (errornum)
{ {
case ETIMEDOUT: case ETIMEDOUT:
@ -621,24 +595,27 @@ void BufferedSocket::HandleEvent(EventType et, int errornum)
this->Instance->SocketCull[this] = this; this->Instance->SocketCull[this] = this;
return; return;
break; break;
}
case EVENT_READ: case EVENT_READ:
if (!this->Poll()) {
if (!this->OnDataReady())
{ {
if (this->Instance->SocketCull.find(this) == this->Instance->SocketCull.end()) if (this->Instance->SocketCull.find(this) == this->Instance->SocketCull.end())
this->Instance->SocketCull[this] = this; this->Instance->SocketCull[this] = this;
return; return;
} }
break; break;
}
case EVENT_WRITE: case EVENT_WRITE:
{
if (this->state == I_CONNECTING) if (this->state == I_CONNECTING)
{ {
/* This might look wrong as if we should be actually calling if (!this->InternalMarkConnected())
* with EVENT_WRITE, but trust me it is correct. There are some {
* writeability-state things in the read code, because of how if (this->Instance->SocketCull.find(this) == this->Instance->SocketCull.end())
* BufferedSocket used to work regarding write buffering in previous this->Instance->SocketCull[this] = this;
* versions of InspIRCd. - Brain return;
*/ }
this->HandleEvent(EVENT_READ);
return; return;
} }
else else
@ -651,6 +628,7 @@ void BufferedSocket::HandleEvent(EventType et, int errornum)
} }
} }
break; break;
}
} }
} }