blob: 3b48e2b2b8c4611f357765cc858c58757b17c1c5 (
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
/*****************************************************************
|
| Neptune - Selectable Message Queue
|
| (c) 2001-2003 Gilles Boccon-Gibod
| Author: Gilles Boccon-Gibod (bok@bok.net)
|
****************************************************************/
/*----------------------------------------------------------------------
| includes
+---------------------------------------------------------------------*/
#include <unistd.h>
#include "NptSelectableMessageQueue.h"
#include "NptDebug.h"
/*----------------------------------------------------------------------
| NPT_SelectableMessageQueue::NPT_SelectableMessageQueue
+---------------------------------------------------------------------*/
NPT_SelectableMessageQueue::NPT_SelectableMessageQueue()
{
if (pipe(m_Pipe) != 0) {
m_Pipe[0] = -1;
m_Pipe[1] = -1;
}
}
/*----------------------------------------------------------------------
| NPT_SelectableMessageQueue::~NPT_SelectableMessageQueue
+---------------------------------------------------------------------*/
NPT_SelectableMessageQueue::~NPT_SelectableMessageQueue()
{
close(m_Pipe[0]);
close(m_Pipe[1]);
}
/*----------------------------------------------------------------------
| NPT_SelectableMessageQueue::QueueMessage
+---------------------------------------------------------------------*/
NPT_Result
NPT_SelectableMessageQueue::QueueMessage(NPT_Message* message,
NPT_MessageHandler* handler)
{
// first, queue the message
NPT_Result result = NPT_SimpleMessageQueue::QueueMessage(message, handler);
// then write a byte on the pipe to signal that there is a message
if (write(m_Pipe[1], "\0", 1) != 1) {
result = NPT_FAILURE;
}
return result;
}
/*----------------------------------------------------------------------
| NPT_SelectableMessageQueue::PumpMessage
+---------------------------------------------------------------------*/
NPT_Result
NPT_SelectableMessageQueue::PumpMessage(NPT_Timeout timeout)
{
NPT_Result result = NPT_SimpleMessageQueue::PumpMessage(timeout);
if (NPT_SUCCEEDED(result)) {
// flush the event
FlushEvent();
}
return result;
}
/*----------------------------------------------------------------------
| NPT_SelectableMessageQueue::FlushEvent
+---------------------------------------------------------------------*/
NPT_Result
NPT_SelectableMessageQueue::FlushEvent()
{
char buffer[1];
if (read(m_Pipe[0], buffer, 1) != 1) {
return NPT_FAILURE;
}
return NPT_SUCCESS;
}
|