aboutsummaryrefslogtreecommitdiff
path: root/lib/base/message.cpp
blob: dafbf3f88c0b9a49988daa365574b7bc379bd822 (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
44
45
46
47
48
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];
}