From 28d2517c9cd3a1c6b21d0db91b93e01e9a84ed39 Mon Sep 17 00:00:00 2001 From: mdw Date: Fri, 22 Oct 1999 22:46:17 +0000 Subject: [PATCH] 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. --- endpt.c | 16 ++++++++++++---- endpt.h | 23 ++++++++++++++++++++++- exec.c | 23 +++++++++++++++++++++-- 3 files changed, 55 insertions(+), 7 deletions(-) diff --git a/endpt.c b/endpt.c index 348dd44..b9a1d4d 100644 --- 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 * @@ -29,6 +29,11 @@ /*----- 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 --- 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 * @@ -29,6 +29,11 @@ /*----- 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 --- 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 * @@ -29,6 +29,11 @@ /*----- 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); } -- 2.11.0