When a non-file endpoint is attached to a file, keep the file endpoint
authormdw <mdw>
Fri, 22 Oct 1999 22:46:17 +0000 (22:46 +0000)
committermdw <mdw>
Fri, 22 Oct 1999 22:46:17 +0000 (22:46 +0000)
open until the nonfile is done.  This stops socket sources from
resetting their connection limits too early.

endpt.c
endpt.h
exec.c

diff --git a/endpt.c b/endpt.c
index 348dd44..b9a1d4d 100644 (file)
--- a/endpt.c
+++ b/endpt.c
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: endpt.c,v 1.1 1999/07/26 23:33:01 mdw Exp $
+ * $Id: endpt.c,v 1.2 1999/10/22 22:46:17 mdw Exp $
  *
  * Generic endpoint abstraction
  *
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: endpt.c,v $
+ * Revision 1.2  1999/10/22 22:46:17  mdw
+ * When a non-file endpoint is attached to a file, keep the file endpoint
+ * open until the nonfile is done.  This stops socket sources from
+ * resetting their connection limits too early.
+ *
  * Revision 1.1  1999/07/26 23:33:01  mdw
  * Infrastructure for the new design.
  *
@@ -324,11 +329,14 @@ void endpt_join(endpt *a, endpt *b)
       e = a; a = b; b = e;
     }
 
-    /* --- Attach the non-file endpoint to the file and run away --- */
+    /* --- Attach the non-file endpoint to the file and run away --- *
+     *
+     * Leave it as the non-file's responsibility to close the other endpoint
+     * when it's ready.  It should also close itself at that time.
+     */
 
     b->ops->attach(b, a->in, a->out);
-    a->ops->close(a);
-    b->ops->close(b);
+    b->ops->file(b, a);
     if (t->next)
       t->next->prev = t->prev;
     if (t->prev)
diff --git a/endpt.h b/endpt.h
index fb44aa9..21a31f3 100644 (file)
--- a/endpt.h
+++ b/endpt.h
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: endpt.h,v 1.1 1999/07/26 23:33:01 mdw Exp $
+ * $Id: endpt.h,v 1.2 1999/10/22 22:46:17 mdw Exp $
  *
  * Generic endpoint abstraction
  *
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: endpt.h,v $
+ * Revision 1.2  1999/10/22 22:46:17  mdw
+ * When a non-file endpoint is attached to a file, keep the file endpoint
+ * open until the nonfile is done.  This stops socket sources from
+ * resetting their connection limits too early.
+ *
  * Revision 1.1  1999/07/26 23:33:01  mdw
  * Infrastructure for the new design.
  *
@@ -81,6 +86,22 @@ typedef struct endpt_ops {
 
   void (*attach)(endpt */*e*/, reffd */*in*/, reffd */*out*/);
 
+  /* --- @file@ --- *
+   *
+   * Arguments:        @endpt *e@ = pointer to endpoint in question
+   *           @endpt *f@ = pointer to a file endpoint
+   *
+   * Returns:  ---
+   *
+   * Use:      Informs a non-file endpoint of a file endpoint which will
+   *           want to be closed when it's finished with.  At that time, the
+   *           endpoint should arrange to have both itself and its partner
+   *           closed.  If no file is registered, the endpoint manager will
+   *           close both endpoints itself.
+   */
+
+  void (*file)(endpt */*e*/, endpt */*f*/);
+
   /* --- @wclose@ --- *
    *
    * Arguments:        @endpt *e@ = endpoint to be partially closed
diff --git a/exec.c b/exec.c
index 1900017..d81aeae 100644 (file)
--- a/exec.c
+++ b/exec.c
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: exec.c,v 1.1 1999/07/26 23:33:32 mdw Exp $
+ * $Id: exec.c,v 1.2 1999/10/22 22:46:17 mdw Exp $
  *
  * Source and target for executable programs
  *
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: exec.c,v $
+ * Revision 1.2  1999/10/22 22:46:17  mdw
+ * When a non-file endpoint is attached to a file, keep the file endpoint
+ * open until the nonfile is done.  This stops socket sources from
+ * resetting their connection limits too early.
+ *
  * Revision 1.1  1999/07/26 23:33:32  mdw
  * New sources and targets.
  *
@@ -146,6 +151,7 @@ typedef struct xept {
   endpt e;
   struct xept *next, *prev;
   pid_t kid;
+  endpt *f;
   const char *desc;
   int st;
   xargs *xa;
@@ -627,12 +633,22 @@ static void xept_attach(endpt *e, reffd *in, reffd *out)
   return;
 }
 
+/* --- @xept_file@ --- */
+
+static void xept_file(endpt *e, endpt *f)
+{
+  xept *xe = (xept *)e;
+  xe->f = f;
+}
+
 /* --- @xept_close@ --- */
 
 static void xept_close(endpt *e)
 {
   xept *xe = (xept *)e;
   if (xe->kid == -1) {
+    if (xe->f)
+      xe->f->ops->close(xe->f);
     x_tidy(xe->xa, xe->xo);
     DESTROY(xe);
     fw_dec();
@@ -678,6 +694,8 @@ static void xept_destroy(xept *xe)
   else
     xept_list = xe->next;
 
+  if (xe->f)
+    xe->f->ops->close(xe->f);
   x_tidy(xe->xa, xe->xo);
   fw_dec();
   DESTROY(xe);
@@ -740,7 +758,7 @@ static void xept_error(char *p, void *v)
 
 /* --- Endpoint operations --- */
 
-static endpt_ops xept_ops = { xept_attach, 0, xept_close };
+static endpt_ops xept_ops = { xept_attach, xept_file, 0, xept_close };
 
 /*----- General operations on sources and targets -------------------------*/
 
@@ -1007,6 +1025,7 @@ static endpt *exec_endpt(xdata *x, const char *desc)
   xe->xa = x->xa; xe->xa->ref++;
   xe->xo = x->xo; xe->xo->ref++;
   xe->kid = -1;
+  xe->f = 0;
   xe->desc = desc;
   return (&xe->e);
 }