From 7ecbfa5e4ebe92434b2183716153afc54d0e5dfe Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Wed, 10 Nov 2004 07:46:33 +0000
Subject: [PATCH] Created msgQueueWait().

---
 src/xpdev/msg_queue.c | 21 +++++++++++++++++++--
 src/xpdev/msg_queue.h |  1 +
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/xpdev/msg_queue.c b/src/xpdev/msg_queue.c
index cdc5f82545..ee940a7d08 100644
--- a/src/xpdev/msg_queue.c
+++ b/src/xpdev/msg_queue.c
@@ -38,6 +38,7 @@
 #include <stdlib.h>		/* malloc */
 #include <string.h>		/* memset */
 
+#include "genwrap.h"	/* msclock() */
 #include "threadwrap.h"	/* GetCurrentThreadId */
 #include "msg_queue.h"
 
@@ -151,17 +152,33 @@ long msgQueueReadLevel(msg_queue_t* q)
 static BOOL list_wait(link_list_t* list, long timeout)
 {
 #if defined(LINK_LIST_THREADSAFE)
-	if(timeout==-1)	/* infinite */
+	if(timeout<0)	/* infinite */
 		return listSemWait(list)==0;
 	if(timeout==0)	/* poll */
 		return listSemTryWait(list)==0;
 
 	return listSemTryWaitBlock(list,timeout)==0);
 #else
-	return(TRUE);
+	clock_t	start;
+	long	count;
+	
+	start=msclock();
+	while((count=listCountNodes(list))==0) {
+		if(timeout==0)
+			break;
+		if(timeout>0 && msclock()-start > timeout)
+			break;
+		YIELD();
+	}
+	return(INT_TO_BOOL(count));
 #endif
 }
 
+BOOL msgQueueWait(msg_queue_t* q, long timeout)
+{
+	return(list_wait(msgQueueReadList(q),timeout));
+}
+
 void* msgQueueRead(msg_queue_t* q, long timeout)
 {
 	if(!list_wait(msgQueueReadList(q),timeout))
diff --git a/src/xpdev/msg_queue.h b/src/xpdev/msg_queue.h
index 6ca7008a0d..f538d63bb0 100644
--- a/src/xpdev/msg_queue.h
+++ b/src/xpdev/msg_queue.h
@@ -67,6 +67,7 @@ long			msgQueueDetach(msg_queue_t*);
 void*			msgQueueSetPrivateData(msg_queue_t*, void*);
 void*			msgQueueGetPrivateData(msg_queue_t*);
 
+BOOL			msgQueueWait(msg_queue_t* q, long timeout);
 long			msgQueueReadLevel(msg_queue_t*);
 void*			msgQueueRead(msg_queue_t*, long timeout);
 void*			msgQueuePeek(msg_queue_t*, long timeout);
-- 
GitLab