Fixed occasional loss of SendMessage() return value.

diff --git a/windows/message.c b/windows/message.c
index e0b2315..5131bce 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -673,8 +673,10 @@
     if ( THREAD_IsWin16(THREAD_Current()) && THREAD_IsWin16(destQ->thdb) )
         DirectedYield16( destQ->thdb->teb.htask16 );
 
-    /* wait for the result */
-    while ( !(smsg->flags & SMSG_HAVE_RESULT) )
+    /* wait for the result, note that 16-bit apps almost always get out of
+     * DirectedYield() with SMSG_HAVE_RESULT flag already set */
+
+    while ( TRUE )
     {
         /*
          * The sequence is crucial to avoid deadlock situations:
@@ -686,21 +688,26 @@
          * we are guaranteed that -should we now clear the QS_SMRESULT that
          * was signalled already by the receiver- we will not start waiting.
          */
-        QUEUE_ClearWakeBit( queue, QS_SMRESULT );
-
-        if (   !(smsg->flags & SMSG_HAVE_RESULT)
-             && QUEUE_WaitBits( QS_SMRESULT, timeout ) == 0 )
-        {
-            /* return with timeout */
-            SetLastError( 0 );
-            retVal = 0;
-            break;
-        }
 
         if ( smsg->flags & SMSG_HAVE_RESULT )
         {
-            *pRes = smsg->lResult;
-            TRACE(sendmsg,"smResult = %08x\n", (unsigned)*pRes );
+got:
+             *pRes = smsg->lResult;
+             TRACE(sendmsg,"smResult = %08x\n", (unsigned)*pRes );
+             break;
+        }
+
+        QUEUE_ClearWakeBit( queue, QS_SMRESULT );
+
+        if ( smsg->flags & SMSG_HAVE_RESULT )
+             goto got;
+
+        if(  QUEUE_WaitBits( QS_SMRESULT, timeout ) == 0 )
+        {
+             /* return with timeout */
+             SetLastError( 0 );
+             retVal = 0;
+             break;
         }
     }