]> Zhao Yanbai Git Server - minix.git/commitdiff
A small mini_receive() cleanup
authorTomas Hruby <tom@minix3.org>
Fri, 7 May 2010 11:22:49 +0000 (11:22 +0000)
committerTomas Hruby <tom@minix3.org>
Fri, 7 May 2010 11:22:49 +0000 (11:22 +0000)
- this patch substitutes *xpp for sender to increase readability of
  mini_receive().

- makes sure that the dequeued sender has p_q_link == NULL and that
  this condition holds when enqueuing the sender again.

- it is a sanity check to make sure that the new sender is not
  enqueued already. Before this change the dequeued sender's p_q_link
  may not be NULL and it was only set to NULL when enqueued again.

kernel/proc.c

index 12dcc5681cca1e0733b81efcc5e625823dedb42f..c2b96edc394bde5513d73dfefb341b3ce8d8e27f 100644 (file)
@@ -581,10 +581,10 @@ const int flags;
        caller_ptr->p_sendto_e = dst_e;
 
        /* Process is now blocked.  Put in on the destination's queue. */
+       assert(caller_ptr->p_q_link == NULL);
        xpp = &dst_ptr->p_caller_q;             /* find end of list */
        while (*xpp) xpp = &(*xpp)->p_q_link;   
        *xpp = caller_ptr;                      /* add caller to end */
-       caller_ptr->p_q_link = NULL;    /* mark new end of list */
   }
   return(OK);
 }
@@ -690,37 +690,40 @@ const int flags;
     /* Check caller queue. Use pointer pointers to keep code simple. */
     xpp = &caller_ptr->p_caller_q;
     while (*xpp) {
-        if (src_e == ANY || src_p == proc_nr(*xpp)) {
+       struct proc * sender = *xpp;
+
+        if (src_e == ANY || src_p == proc_nr(sender)) {
             int call;
-           assert(!RTS_ISSET(*xpp, RTS_SLOT_FREE));
-           assert(!RTS_ISSET(*xpp, RTS_NO_ENDPOINT));
+           assert(!RTS_ISSET(sender, RTS_SLOT_FREE));
+           assert(!RTS_ISSET(sender, RTS_NO_ENDPOINT));
 
            /* Found acceptable message. Copy it and update status. */
            assert(!(caller_ptr->p_misc_flags & MF_DELIVERMSG));
-           caller_ptr->p_delivermsg = (*xpp)->p_sendmsg;
-           caller_ptr->p_delivermsg.m_source = (*xpp)->p_endpoint;
+           caller_ptr->p_delivermsg = sender->p_sendmsg;
+           caller_ptr->p_delivermsg.m_source = sender->p_endpoint;
            caller_ptr->p_misc_flags |= MF_DELIVERMSG;
-           RTS_UNSET(*xpp, RTS_SENDING);
+           RTS_UNSET(sender, RTS_SENDING);
 
-           call = ((*xpp)->p_misc_flags & MF_REPLY_PEND ? SENDREC : SEND);
+           call = (sender->p_misc_flags & MF_REPLY_PEND ? SENDREC : SEND);
            IPC_STATUS_ADD_CALL(caller_ptr, call);
 
            /*
             * if the message is originaly from the kernel on behalf of this
             * process, we must send the status flags accordingly
             */
-           if ((*xpp)->p_misc_flags & MF_SENDING_FROM_KERNEL) {
+           if (sender->p_misc_flags & MF_SENDING_FROM_KERNEL) {
                IPC_STATUS_ADD_FLAGS(caller_ptr, IPC_FLG_MSG_FROM_KERNEL);
                /* we can clean the flag now, not need anymore */
-               (*xpp)->p_misc_flags &= ~MF_SENDING_FROM_KERNEL;
+               sender->p_misc_flags &= ~MF_SENDING_FROM_KERNEL;
            }
-           if ((*xpp)->p_misc_flags & MF_SIG_DELAY)
-               sig_delay_done(*xpp);
+           if (sender->p_misc_flags & MF_SIG_DELAY)
+               sig_delay_done(sender);
 
-            *xpp = (*xpp)->p_q_link;           /* remove from queue */
+            *xpp = sender->p_q_link;           /* remove from queue */
+           sender->p_q_link = NULL;
             return(OK);                                /* report success */
        }
-       xpp = &(*xpp)->p_q_link;                /* proceed to next */
+       xpp = &sender->p_q_link;                /* proceed to next */
     }
   }