Fix bug in OS2_receive_message. It's possible to arrive here with a
authorChris Hanson <org/chris-hanson/cph>
Tue, 11 Apr 1995 05:19:34 +0000 (05:19 +0000)
committerChris Hanson <org/chris-hanson/cph>
Tue, 11 Apr 1995 05:19:34 +0000 (05:19 +0000)
closed qid due to race conditions when the sending thread closes the
qid while the reading thread is about to read from it.  This was
happening under some circumstances when sending mail: the sendmail
program doesn't generate any output, and if it terminates before the
input thread's first read, the qid will be closed.

v7/src/microcode/os2msg.c

index a1e809d958d90dfc8c5d0b5250331fb3535e9111..6cf4b43062294b8ca86a7365a8d206106f2ff029 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-C-*-
 
-$Id: os2msg.c,v 1.5 1995/02/07 23:54:09 cph Exp $
+$Id: os2msg.c,v 1.6 1995/04/11 05:19:34 cph Exp $
 
 Copyright (c) 1994-95 Massachusetts Institute of Technology
 
@@ -324,6 +324,19 @@ OS2_receive_message (qid_t qid, int blockp, int interruptp)
 {
   tqueue_t * tqueue = (QID_TQUEUE (qid));
   msg_t * message;
+  if (tqueue == 0)
+    {
+      if ((OS2_current_tid ()) != OS2_scheme_tid)
+       /* This behavior is a little random, but it's based on the
+          idea that if an inferior thread is reading from a closed
+          channel, this is due to a race condition, and the fact that
+          the channel is closed means that the thread is no longer
+          needed.  So far this has only happened under one
+          circumstance, and in that case, this is the correct action.  */
+       OS2_endthread ();
+      else
+       OS2_error_anonymous ();
+    }
   while (1)
     {
       while ((read_tqueue (tqueue, 0)) != 0)
@@ -346,6 +359,8 @@ msg_avail_t
 OS2_message_availablep (qid_t qid, int blockp)
 {
   tqueue_t * tqueue = (QID_TQUEUE (qid));
+  if (tqueue == 0)
+    return (mat_not_available);
   while (1)
     {
       while ((read_tqueue (tqueue, 0)) != 0)
@@ -379,7 +394,7 @@ msg_t *
 OS2_message_transaction (qid_t qid, msg_t * request, msg_type_t reply_type)
 {
   OS2_send_message (qid, request);
-  OS2_wait_for_message (qid, reply_type);
+  return (OS2_wait_for_message (qid, reply_type));
 }
 \f
 static void