mirror of
https://github.com/inspircd/inspircd.git
synced 2025-03-10 02:59:01 -04:00
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:
parent
e462e71f10
commit
425fe205d0
@ -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
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user