summaryrefslogtreecommitdiff
path: root/modules/socketengines
diff options
context:
space:
mode:
Diffstat (limited to 'modules/socketengines')
-rw-r--r--modules/socketengines/m_socketengine_epoll.cpp20
-rw-r--r--modules/socketengines/m_socketengine_select.cpp16
2 files changed, 24 insertions, 12 deletions
diff --git a/modules/socketengines/m_socketengine_epoll.cpp b/modules/socketengines/m_socketengine_epoll.cpp
index 5a2561b25..5edc40502 100644
--- a/modules/socketengines/m_socketengine_epoll.cpp
+++ b/modules/socketengines/m_socketengine_epoll.cpp
@@ -80,8 +80,11 @@ class SocketEngineEPoll : public SocketEngineBase
--SocketCount;
}
- void MarkWriteable(Socket *s)
+ void MarkWritable(Socket *s)
{
+ if (s->HasFlag(SF_WRITABLE))
+ return;
+
epoll_event ev;
memset(&ev, 0, sizeof(ev));
@@ -91,10 +94,15 @@ class SocketEngineEPoll : public SocketEngineBase
if (epoll_ctl(EngineHandle, EPOLL_CTL_MOD, ev.data.fd, &ev) == -1)
Log() << "Unable to mark fd " << ev.data.fd << " as writable in socketengine epoll: " << strerror(errno);
+ else
+ s->SetFlag(SF_WRITABLE);
}
- void ClearWriteable(Socket *s)
+ void ClearWriteble(Socket *s)
{
+ if (!s->HasFlag(SF_WRITABLE))
+ return;
+
epoll_event ev;
memset(&ev, 0, sizeof(ev));
@@ -104,6 +112,8 @@ class SocketEngineEPoll : public SocketEngineBase
if (epoll_ctl(EngineHandle, EPOLL_CTL_MOD, ev.data.fd, &ev) == -1)
Log() << "Unable to mark fd " << ev.data.fd << " as unwritable in socketengine epoll: " << strerror(errno);
+ else
+ s->UnsetFlag(SF_WRITABLE);
}
void Process()
@@ -150,7 +160,7 @@ class SocketEngineEPoll : public SocketEngineBase
class ModuleSocketEngineEPoll : public Module
{
- SocketEngineEPoll *engine;
+ SocketEngineEPoll engine;
public:
ModuleSocketEngineEPoll(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator)
@@ -159,13 +169,11 @@ class ModuleSocketEngineEPoll : public Module
this->SetPermanent(true);
this->SetType(SOCKETENGINE);
- engine = new SocketEngineEPoll();
- SocketEngine = engine;
+ SocketEngine = &engine;
}
~ModuleSocketEngineEPoll()
{
- delete engine;
SocketEngine = NULL;
}
};
diff --git a/modules/socketengines/m_socketengine_select.cpp b/modules/socketengines/m_socketengine_select.cpp
index e708693d2..b966820bd 100644
--- a/modules/socketengines/m_socketengine_select.cpp
+++ b/modules/socketengines/m_socketengine_select.cpp
@@ -41,14 +41,20 @@ class SocketEngineSelect : public SocketEngineBase
Sockets.erase(s->GetSock());
}
- void MarkWriteable(Socket *s)
+ void MarkWritable(Socket *s)
{
+ if (s->HasFlag(SF_WRITABLE))
+ return;
FD_SET(s->GetSock(), &WriteFDs);
+ s->SetFlag(SF_WRITABLE);
}
- void ClearWriteable(Socket *s)
+ void ClearWritable(Socket *s)
{
+ if (!s->HasFlag(SF_WRITABLE))
+ return;
FD_CLR(s->GetSock(), &WriteFDs);
+ s->UnsetFlag(SF_WRITABLE);
}
void Process()
@@ -101,7 +107,7 @@ class SocketEngineSelect : public SocketEngineBase
class ModuleSocketEngineSelect : public Module
{
- SocketEngineSelect *engine;
+ SocketEngineSelect engine;
public:
ModuleSocketEngineSelect(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator)
@@ -110,13 +116,11 @@ class ModuleSocketEngineSelect : public Module
this->SetPermanent(true);
this->SetType(SOCKETENGINE);
- engine = new SocketEngineSelect();
- SocketEngine = engine;
+ SocketEngine = &engine;
}
~ModuleSocketEngineSelect()
{
- delete engine;
SocketEngine = NULL;
}
};