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
2 changed files with 7 additions and 2 deletions
|
@ -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…
Reference in a new issue