Early dispose of replies in rx_Multi
authorRainer Toebbicke <rtb@pclella.cern.ch>
Thu, 27 Jan 2011 14:03:57 +0000 (15:03 +0100)
committerDerrick Brashear <shadow@dementia.org>
Wed, 9 Feb 2011 03:01:58 +0000 (19:01 -0800)
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 <buildbot@rampaginggeek.com>
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Derrick Brashear <shadow@dementia.org>

src/rx/rx_multi.h

index 2a5ccc4..ad1c264 100644 (file)
@@ -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