comparison deps/Platinum/ThirdParty/Neptune/Source/System/Posix/NptSelectableMessageQueue.cpp @ 0:3425707ddbf6

Initial import (hopefully this mercurial stuff works...)
author fraserofthenight
date Mon, 06 Jul 2009 08:06:28 -0700
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:3425707ddbf6
1 /*****************************************************************
2 |
3 | Neptune - Selectable Message Queue
4 |
5 | (c) 2001-2003 Gilles Boccon-Gibod
6 | Author: Gilles Boccon-Gibod (bok@bok.net)
7 |
8 ****************************************************************/
9
10 /*----------------------------------------------------------------------
11 | includes
12 +---------------------------------------------------------------------*/
13 #include <unistd.h>
14
15 #include "NptSelectableMessageQueue.h"
16 #include "NptDebug.h"
17
18 /*----------------------------------------------------------------------
19 | NPT_SelectableMessageQueue::NPT_SelectableMessageQueue
20 +---------------------------------------------------------------------*/
21 NPT_SelectableMessageQueue::NPT_SelectableMessageQueue()
22 {
23 if (pipe(m_Pipe) != 0) {
24 m_Pipe[0] = -1;
25 m_Pipe[1] = -1;
26 }
27 }
28
29 /*----------------------------------------------------------------------
30 | NPT_SelectableMessageQueue::~NPT_SelectableMessageQueue
31 +---------------------------------------------------------------------*/
32 NPT_SelectableMessageQueue::~NPT_SelectableMessageQueue()
33 {
34 close(m_Pipe[0]);
35 close(m_Pipe[1]);
36 }
37
38 /*----------------------------------------------------------------------
39 | NPT_SelectableMessageQueue::QueueMessage
40 +---------------------------------------------------------------------*/
41 NPT_Result
42 NPT_SelectableMessageQueue::QueueMessage(NPT_Message* message,
43 NPT_MessageHandler* handler)
44 {
45 // first, queue the message
46 NPT_Result result = NPT_SimpleMessageQueue::QueueMessage(message, handler);
47
48 // then write a byte on the pipe to signal that there is a message
49 if (write(m_Pipe[1], "\0", 1) != 1) {
50 result = NPT_FAILURE;
51 }
52
53 return result;
54 }
55
56 /*----------------------------------------------------------------------
57 | NPT_SelectableMessageQueue::PumpMessage
58 +---------------------------------------------------------------------*/
59 NPT_Result
60 NPT_SelectableMessageQueue::PumpMessage(NPT_Timeout timeout /* = NPT_TIMEOUT_INFINITE */)
61 {
62 NPT_Result result = NPT_SimpleMessageQueue::PumpMessage(timeout);
63 if (NPT_SUCCEEDED(result)) {
64 // flush the event
65 FlushEvent();
66 }
67 return result;
68 }
69
70 /*----------------------------------------------------------------------
71 | NPT_SelectableMessageQueue::FlushEvent
72 +---------------------------------------------------------------------*/
73 NPT_Result
74 NPT_SelectableMessageQueue::FlushEvent()
75 {
76 char buffer[1];
77 if (read(m_Pipe[0], buffer, 1) != 1) {
78 return NPT_FAILURE;
79 }
80
81 return NPT_SUCCESS;
82 }
83
84