]> Zhao Yanbai Git Server - minix.git/commitdiff
Preserve the order of IPC messages between two parties.
authorCristiano Giuffrida <cristiano@minix3.org>
Sat, 27 Mar 2010 00:09:22 +0000 (00:09 +0000)
committerCristiano Giuffrida <cristiano@minix3.org>
Sat, 27 Mar 2010 00:09:22 +0000 (00:09 +0000)
Currently a sequence of messages between a sender A and a receiver B of the
form: A.asynsend(M1, B); A.send(M2, B) may result in the receiver receiving
M1 first and then M2 or viceversa. This patch makes sure that the original
order M1, M2 is always preserved.

Note that the order of a hypotetical sequence A.asynsend(M1, B);
A.asynsend(M2, B) is already guaranteed by the implementation of
asynsend by design. Other senda-based wrappers can define their own
semantics.

kernel/proc.c

index 193b6862d9ca7a347f01e72169e5cf5afd57527d..7062c58994ea6c3b3575a1020fd39823c6ed7f50 100644 (file)
@@ -684,6 +684,20 @@ int flags;
         }
     }
 
+    /* Check if there are pending senda(). */
+    if (caller_ptr->p_misc_flags & MF_ASYNMSG)
+    {
+       if (src_e != ANY)
+               r= try_one(proc_addr(src_p), caller_ptr, NULL);
+       else
+               r= try_async(caller_ptr);
+
+       if (r == OK) {
+               IPC_STATUS_ADD(caller_ptr, IPC_STATUS_CALL_TO(SENDA));
+               return OK;      /* Got a message */
+       }
+    }
+
     /* Check caller queue. Use pointer pointers to keep code simple. */
     xpp = &caller_ptr->p_caller_q;
     while (*xpp != NIL_PROC) {
@@ -706,19 +720,6 @@ int flags;
        }
        xpp = &(*xpp)->p_q_link;                /* proceed to next */
     }
-
-    if (caller_ptr->p_misc_flags & MF_ASYNMSG)
-    {
-       if (src_e != ANY)
-               r= try_one(proc_addr(src_p), caller_ptr, NULL);
-       else
-               r= try_async(caller_ptr);
-
-       if (r == OK) {
-               IPC_STATUS_ADD(caller_ptr, IPC_STATUS_CALL_TO(SENDA));
-               return OK;      /* Got a message */
-       }
-    }
   }
 
   /* No suitable message is available or the caller couldn't send in SENDREC.