summaryrefslogtreecommitdiff
path: root/src/socketengines/pipeengine_eventfd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/socketengines/pipeengine_eventfd.cpp')
-rw-r--r--src/socketengines/pipeengine_eventfd.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/socketengines/pipeengine_eventfd.cpp b/src/socketengines/pipeengine_eventfd.cpp
new file mode 100644
index 000000000..713c73d34
--- /dev/null
+++ b/src/socketengines/pipeengine_eventfd.cpp
@@ -0,0 +1,67 @@
+#include "services.h"
+#include <sys/eventfd.h>
+
+class PipeIO : public SocketIO
+{
+ public:
+ /** Receive something from the buffer
+ * @param s The socket
+ * @param buf The buf to read to
+ * @param sz How much to read
+ * @return Number of bytes received
+ */
+ int Recv(Socket *s, char *buf, size_t sz) const
+ {
+ static eventfd_t dummy;
+ return !eventfd_read(s->GetFD(), &dummy);
+ }
+
+ /** Write something to the socket
+ * @param s The socket
+ * @param buf What to write
+ * @return Number of bytes written
+ */
+ int Send(Socket *s, const Anope::string &buf) const
+ {
+ return !eventfd_write(s->GetFD(), 1);
+ }
+} pipeSocketIO;
+
+Pipe::Pipe() : BufferedSocket()
+{
+ this->IO = &pipeSocketIO;
+ this->Sock = eventfd(0, EFD_NONBLOCK);
+ if (this->Sock < 0)
+ throw CoreException(Anope::string("Could not create pipe: ") + Anope::LastError());
+
+ this->IPv6 = false;
+
+ SocketEngine::AddSocket(this);
+}
+
+bool Pipe::ProcessRead()
+{
+ this->IO->Recv(this, NULL, 0);
+ return this->Read("");
+}
+
+bool Pipe::Read(const Anope::string &)
+{
+ this->OnNotify();
+ return true;
+}
+
+void Pipe::Notify()
+{
+ /* Note we send this immediatly. If use use Socket::Write and if this functions is called
+ * from a thread, only epoll is able to pick up the change to this sockets want flags immediately
+ * Other engines time out then pick up and write the change then read it back, which
+ * is too slow for most things.
+ */
+ this->IO->Send(this, "");
+}
+
+void Pipe::OnNotify()
+{
+}
+