aboutsummaryrefslogtreecommitdiff
path: root/lib/base/message.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/base/message.cpp')
-rw-r--r--lib/base/message.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/lib/base/message.cpp b/lib/base/message.cpp
new file mode 100644
index 00000000..dafbf3f8
--- /dev/null
+++ b/lib/base/message.cpp
@@ -0,0 +1,49 @@
+#include <lib/base/message.h>
+#include <unistd.h>
+#include <lib/base/eerror.h>
+
+eMessagePump::eMessagePump(int mt): content(1024*1024), ismt(mt)
+{
+ pipe(fd);
+}
+
+eMessagePump::~eMessagePump()
+{
+ if (ismt)
+ content.lock(); // blocks until all messages are processed.
+ close(fd[0]);
+ close(fd[1]);
+}
+
+int eMessagePump::send(const void *data, int len)
+{
+ if (ismt)
+ content.lock(len);
+ return ::write(fd[1], data, len)<0;
+}
+
+int eMessagePump::recv(void *data, int len)
+{
+ unsigned char*dst=(unsigned char*)data;
+ while (len)
+ {
+ if (ismt)
+ content.unlock(len);
+ int r=::read(fd[0], dst, len);
+ if (r<0)
+ return r;
+ dst+=r;
+ len-=r;
+ }
+ return 0;
+}
+
+int eMessagePump::getInputFD() const
+{
+ return fd[1];
+}
+
+int eMessagePump::getOutputFD() const
+{
+ return fd[0];
+}