aboutsummaryrefslogtreecommitdiff
path: root/lib/base/message.cpp
blob: 48fcd21035886d5ccce41f868cffc3aad792cd85 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#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)
{
	int wr = ::write(fd[1], data, len);
	if (ismt && wr > 0)
		content.lock(wr);
	return wr<0;
}

int eMessagePump::recv(void *data, int len)
{
	unsigned char*dst=(unsigned char*)data;
	int recv=::read(fd[0], dst, len);
	if (recv > 0 && ismt)
		content.unlock(recv);
	return recv;
}

int eMessagePump::getInputFD() const
{
	return fd[1];
}

int eMessagePump::getOutputFD() const
{
	return fd[0];
}