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();
/**
* 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.
/** Mark a socket as being connected and call appropriate events.
*/
bool Poll();
bool InternalMarkConnected();
/**
* This method causes the socket to close, and may

View File

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