]> Zhao Yanbai Git Server - minix.git/commitdiff
Added SENDREC_BUSY flag to indicate that process is doing sendrec() -
authorBen Gras <ben@minix3.org>
Wed, 27 Jul 2005 14:08:59 +0000 (14:08 +0000)
committerBen Gras <ben@minix3.org>
Wed, 27 Jul 2005 14:08:59 +0000 (14:08 +0000)
if so, alerts are not received before reply message.

kernel/priv.h
kernel/proc.c

index 8dc5ed68677ac872511dc7a6a89c5e8cb31f824c..6444204c4d7b5e5da8fc605f4411b2ace26def6c 100755 (executable)
@@ -41,6 +41,7 @@ struct priv {
 #define RDY_Q_HEAD      0x02   /* add to queue head instead of tail */
 #define BILLABLE       0x04    /* some processes are not billable */
 #define SYS_PROC       0x10    /* system processes are privileged */
+#define SENDREC_BUSY   0x20    /* sendrec() in progress */
 
 /* Magic system structure table addresses. */
 #define BEG_PRIV_ADDR (&priv[0])
index 8a01ef221d066c541cae8962ca9e1ff891af750e..9cbbc424afc507d67f7a856688e20dcf372ee9f6 100755 (executable)
@@ -167,7 +167,8 @@ message *m_ptr;                     /* pointer to message in the caller's space */
    *   - ECHO:    nonblocking call; directly echo back the message 
    */
   switch(function) {
-  case SENDREC:                                        /* has FRESH_ANSWER flag */             
+  case SENDREC:
+       caller_ptr->p_priv->s_flags |= SENDREC_BUSY;
       /* fall through */
   case SEND:                   
       result = mini_send(caller_ptr, src_dst, m_ptr, flags);
@@ -175,6 +176,8 @@ message *m_ptr;                     /* pointer to message in the caller's space */
           break;                               /* done, or SEND failed */
       }                                                /* fall through for SENDREC */
   case RECEIVE:                        
+      if(function == RECEIVE)
+       caller_ptr->p_priv->s_flags &= ~SENDREC_BUSY;
       result = mini_receive(caller_ptr, src_dst, m_ptr, flags);
       break;
   case ALERT:
@@ -275,7 +278,7 @@ unsigned flags;                             /* system call flags */
   if (!(caller_ptr->p_rts_flags & SENDING)) {
 
     /* Check if there are pending notifications, except for SENDREC. */
-    if (! (flags & FRESH_ANSWER)) {
+    if (! (caller_ptr->p_priv->s_flags & SENDREC_BUSY)) {
 
         map = &priv(caller_ptr)->s_notify_pending;
         for (chunk=&map->chunk[0]; chunk<&map->chunk[NR_SYS_CHUNKS]; chunk++) {
@@ -363,6 +366,7 @@ int dst;                            /* which process to notify */
    * can be both sending and receiving during a SENDREC system call.
    */
   if ((dst_ptr->p_rts_flags & (RECEIVING|SENDING)) == RECEIVING &&
+      !(dst_ptr->p_priv->s_flags & SENDREC_BUSY) &&
       (dst_ptr->p_getfrom == ANY || dst_ptr->p_getfrom == caller_ptr->p_nr)) {
 
       /* Destination is indeed waiting for a message. Assemble a notification