From be4abb4ec83a47477b254f2b3375742c4efbb063 Mon Sep 17 00:00:00 2001 From: Rainer Toebbicke Date: Thu, 27 Jan 2011 15:03:57 +0100 Subject: [PATCH] Early dispose of replies in rx_Multi Handles replies as soon as they arrive in rx_Multi, limiting strain on RX packet queues on massive rx_Multi loops. Change-Id: I345f7dba1707beeb75bcc65bb519afb9dc741973 Reviewed-on: http://gerrit.openafs.org/3765 Tested-by: BuildBot Reviewed-by: Andrew Deason Reviewed-by: Derrick Brashear --- src/rx/rx_multi.h | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/rx/rx_multi.h b/src/rx/rx_multi.h index 2a5ccc454..ad1c26427 100644 --- a/src/rx/rx_multi.h +++ b/src/rx/rx_multi.h @@ -27,20 +27,24 @@ struct multi_handle { do {\ struct multi_handle *multi_h;\ int multi_i;\ + int multi_i0;\ + afs_int32 multi_error;\ struct rx_call *multi_call;\ multi_h = multi_Init(conns, nConns);\ - for (multi_i = 0; multi_i < nConns; multi_i++) + for (multi_i0 = multi_i = 0; ; multi_i = multi_i0 ) #define multi_Body(startProc, endProc)\ - multi_call = multi_h->calls[multi_i];\ - startProc;\ - rx_FlushWrite(multi_call);\ - }\ - while ((multi_i = multi_Select(multi_h)) >= 0) {\ - afs_int32 multi_error;\ + if (multi_h->nextReady == multi_h->firstNotReady && multi_i < multi_h->nConns) {\ multi_call = multi_h->calls[multi_i];\ - multi_error = rx_EndCall(multi_call, endProc);\ - multi_h->calls[multi_i] = (struct rx_call *) 0 + startProc;\ + rx_FlushWrite(multi_call);\ + multi_i0++; /* THIS is the loop variable!! */\ + continue;\ + }\ + if ((multi_i = multi_Select(multi_h)) < 0) break;\ + multi_call = multi_h->calls[multi_i];\ + multi_error = rx_EndCall(multi_call, endProc);\ + multi_h->calls[multi_i] = (struct rx_call *) 0 #define multi_Abort break -- 2.39.5