diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/ThirdParty/Neptune/Source/System/Posix/NptSelectableMessageQueue.cpp	Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,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_TIMEOUT_INFINITE */)
+{
+    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;
+}
+ 
+