diff --git a/src/xpdev/msg_queue.c b/src/xpdev/msg_queue.c
index cdc5f825457ab14f3862cc9fd0ef847e20f225bf..ee940a7d088c8a72e53dc1e022c54c182b41ee94 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 6ca7008a0df5ebf33684e87dfa3ab0cdefe518b8..f538d63bb05d2ba0efd7c1c2009b4f5b33d03a4b 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);