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);