Added SENDREC_BUSY flag to indicate that process is doing sendrec() -
if so, alerts are not received before reply message.
This commit is contained in:
		
							parent
							
								
									a1a7ccbd02
								
							
						
					
					
						commit
						31042a5a05
					
				@ -41,6 +41,7 @@ struct priv {
 | 
				
			|||||||
#define RDY_Q_HEAD      0x02	/* add to queue head instead of tail */
 | 
					#define RDY_Q_HEAD      0x02	/* add to queue head instead of tail */
 | 
				
			||||||
#define BILLABLE	0x04	/* some processes are not billable */
 | 
					#define BILLABLE	0x04	/* some processes are not billable */
 | 
				
			||||||
#define SYS_PROC	0x10	/* system processes are privileged */
 | 
					#define SYS_PROC	0x10	/* system processes are privileged */
 | 
				
			||||||
 | 
					#define SENDREC_BUSY	0x20	/* sendrec() in progress */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Magic system structure table addresses. */
 | 
					/* Magic system structure table addresses. */
 | 
				
			||||||
#define BEG_PRIV_ADDR (&priv[0])
 | 
					#define BEG_PRIV_ADDR (&priv[0])
 | 
				
			||||||
 | 
				
			|||||||
@ -167,7 +167,8 @@ message *m_ptr;			/* pointer to message in the caller's space */
 | 
				
			|||||||
   *   - ECHO:    nonblocking call; directly echo back the message 
 | 
					   *   - ECHO:    nonblocking call; directly echo back the message 
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  switch(function) {
 | 
					  switch(function) {
 | 
				
			||||||
  case SENDREC:					/* has FRESH_ANSWER flag */		
 | 
					  case SENDREC:
 | 
				
			||||||
 | 
					  	caller_ptr->p_priv->s_flags |= SENDREC_BUSY;
 | 
				
			||||||
      /* fall through */
 | 
					      /* fall through */
 | 
				
			||||||
  case SEND:			
 | 
					  case SEND:			
 | 
				
			||||||
      result = mini_send(caller_ptr, src_dst, m_ptr, flags);
 | 
					      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 */
 | 
					          break;				/* done, or SEND failed */
 | 
				
			||||||
      }						/* fall through for SENDREC */
 | 
					      }						/* fall through for SENDREC */
 | 
				
			||||||
  case RECEIVE:			
 | 
					  case RECEIVE:			
 | 
				
			||||||
 | 
					      if(function == RECEIVE)
 | 
				
			||||||
 | 
					      	caller_ptr->p_priv->s_flags &= ~SENDREC_BUSY;
 | 
				
			||||||
      result = mini_receive(caller_ptr, src_dst, m_ptr, flags);
 | 
					      result = mini_receive(caller_ptr, src_dst, m_ptr, flags);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
  case ALERT:
 | 
					  case ALERT:
 | 
				
			||||||
@ -275,7 +278,7 @@ unsigned flags;				/* system call flags */
 | 
				
			|||||||
  if (!(caller_ptr->p_rts_flags & SENDING)) {
 | 
					  if (!(caller_ptr->p_rts_flags & SENDING)) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Check if there are pending notifications, except for SENDREC. */
 | 
					    /* 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;
 | 
					        map = &priv(caller_ptr)->s_notify_pending;
 | 
				
			||||||
        for (chunk=&map->chunk[0]; chunk<&map->chunk[NR_SYS_CHUNKS]; chunk++) {
 | 
					        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.
 | 
					   * can be both sending and receiving during a SENDREC system call.
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  if ((dst_ptr->p_rts_flags & (RECEIVING|SENDING)) == RECEIVING &&
 | 
					  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)) {
 | 
					      (dst_ptr->p_getfrom == ANY || dst_ptr->p_getfrom == caller_ptr->p_nr)) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      /* Destination is indeed waiting for a message. Assemble a notification 
 | 
					      /* Destination is indeed waiting for a message. Assemble a notification 
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user