Select is now done, and some debug removed. Not that anyone really should be using select()...

git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@5587 e03df62e-2008-0410-955e-edbf42e46eb7
This commit is contained in:
brain 2006-10-30 19:49:13 +00:00
parent b8f4ba8214
commit 2a31fe6038
3 changed files with 27 additions and 8 deletions

View File

@ -36,6 +36,9 @@ private:
/** Because select() does not track an fd list for us between calls, we have one of our own
*/
std::map<int,int> fds;
/** List of writeable ones (WantWrite())
*/
bool writeable[MAX_DESCRIPTORS];
/** The read set and write set, populated before each call to select().
*/
fd_set wfdset, rfdset;
@ -53,6 +56,7 @@ public:
virtual bool DelFd(EventHandler* eh);
virtual int DispatchEvents();
virtual std::string GetName();
virtual void WantWrite(EventHandler* eh);
};
/** Creates a SocketEngine

View File

@ -24,6 +24,7 @@ SelectEngine::SelectEngine(InspIRCd* Instance) : SocketEngine(Instance)
ServerInstance->Log(DEBUG,"SelectEngine::SelectEngine()");
EngineHandle = 0;
CurrentSetSize = 0;
memset(writeable, 0, sizeof(writeable));
}
SelectEngine::~SelectEngine()
@ -57,6 +58,15 @@ bool SelectEngine::AddFd(EventHandler* eh)
return true;
}
void SelectEngine::WantWrite(EventHandler* eh)
{
int fd = eh->GetFd();
writeable[fd] = true;
ServerInstance->Log(DEBUG,"Set %d to writeable", fd);
}
bool SelectEngine::DelFd(EventHandler* eh)
{
int fd = eh->GetFd();
@ -101,14 +111,11 @@ int SelectEngine::DispatchEvents()
for (std::map<int,int>::iterator a = fds.begin(); a != fds.end(); a++)
{
if (ref[a->second]->Readable())
{
FD_SET (a->second, &rfdset);
}
else
{
FD_SET (a->second, &wfdset);
}
if (writeable[a->second])
FD_SET (a->second, &wfdset);
}
tval.tv_sec = 0;
tval.tv_usec = 50L;
@ -131,8 +138,17 @@ int SelectEngine::DispatchEvents()
*/
for (int i = 0; i < result; i++)
{
ServerInstance->Log(DEBUG,"Handle %s event on fd %d",ev[i]->Readable() ? "read" : "write", ev[i]->GetFd());
ev[i]->HandleEvent(ev[i]->Readable() ? EVENT_READ : EVENT_WRITE);
ServerInstance->Log(DEBUG,"Handle %s event on fd %d",writeable[ev[i]->GetFd()] || !ev[i]->Readable() ? "write" : "read", ev[i]->GetFd());
if (writeable[ev[i]->GetFd()])
{
ev[i]->HandleEvent(EVENT_WRITE);
writeable[ev[i]->GetFd()] = false;
}
else
{
ev[i]->HandleEvent(ev[i]->Readable() ? EVENT_READ : EVENT_WRITE);
}
}
return result;

View File

@ -702,7 +702,6 @@ const char* userrec::GetWriteError()
void userrec::Oper(const std::string &opertype)
{
this->ServerInstance->SE->WantWrite(this);
try
{
this->modes[UM_OPERATOR] = 1;