--- ht-original/globals-structtypes.h	2005-05-26 02:25:09.000000000 -0500
+++ ht/globals-structtypes.h	2005-05-26 11:23:42.298802242 -0500
@@ -2390,6 +2390,11 @@
       queueBufferCount,
       processBufferInit,
       processBufferCount;
+#if NUM_DISPATCH_THREADS > 1
+  int idleBufferInit,
+      idleBufferCount;
+  float idleBuffer[MAX_PROCESS_BUFFER];
+#endif
 #endif
 
 #ifdef PARM_ENABLE_EXPERIMENTAL
--- ht-original/pbuf.c	2005-05-26 02:25:09.000000000 -0500
+++ ht/pbuf.c	2005-05-26 11:28:48.594308304 -0500
@@ -2490,7 +2490,11 @@
 #ifdef MAX_PROCESS_BUFFER
   struct timeval pktStartOfProcessing,
                  pktEndOfProcessing;
+
+#if NUM_DISPATCH_THREADS > 1
+  static struct timeval idleStartOfProcessing;
 #endif
+#endif /* MAX_PROCESS_BUFFER */
 
 #ifdef MEMORY_DEBUG
   if(0) {
@@ -2521,7 +2525,14 @@
   gettimeofday(&pktStartOfProcessing, NULL);
   myGlobals.queueBuffer[++myGlobals.queueBufferCount & (MAX_PROCESS_BUFFER - 1)] = 
       timeval_subtract(pktStartOfProcessing, h->ts);
+
+#if NUM_DISPATCH_THREADS > 1
+  if((idleStartOfProcessing.tv_sec != 0) || (idleStartOfProcessing.tv_usec != 0)) {
+    myGlobals.idleBuffer[++myGlobals.idleBufferCount & (MAX_PROCESS_BUFFER - 1)] = 
+        timeval_subtract(pktStartOfProcessing, idleStartOfProcessing);
+  }
 #endif
+#endif /* MAX_PROCESS_BUFFER */
 
   h_save = h, p_save = p;
 
@@ -3593,6 +3604,11 @@
     traceEvent(CONST_TRACE_INFO, "User requested stats reset complete");
     myGlobals.resetHashNow = 0;
   }
+
+#if defined(MAX_PROCESS_BUFFER) && (NUM_DISPATCH_THREADS > 1)
+  gettimeofday(&idleStartOfProcessing, NULL);
+#endif
+
 }
 
 /* ************************************ */
--- ht-original/webInterface.c	2005-05-26 05:29:17.000000000 -0500
+++ ht/webInterface.c	2005-05-26 11:33:52.716128070 -0500
@@ -7276,6 +7276,33 @@
         pminDelay=99999.0, pmaxDelay=0.0, 
         /*stddev:*/ pM, pT, pQ, pR, pSD, pXBAR;
 
+#if NUM_DISPATCH_THREADS > 1
+  float iminDelay=99999.0, imaxDelay=0.0, 
+        /*stddev:*/ iM, iT, iQ, iR, iSD, iXBAR;
+
+  if(myGlobals.idleBufferCount >= MAX_PROCESS_BUFFER) {
+    for(i=0; i<MAX_PROCESS_BUFFER; i++) {
+      if(myGlobals.idleBuffer[i] > imaxDelay) imaxDelay = myGlobals.idleBuffer[i];
+      if(myGlobals.idleBuffer[i] < iminDelay) iminDelay = myGlobals.idleBuffer[i];
+      if(i==0) {
+        iM = myGlobals.idleBuffer[0];
+        iT = 0.0;
+      } else {
+        iQ = myGlobals.idleBuffer[i] - iM;
+        iR = iQ / (float)(i+1);
+        iM += iR;
+        iT = iT + i * iQ * iR;
+      }
+    }
+    iSD = sqrtf(iT / (MAX_PROCESS_BUFFER - 1));
+    iXBAR /*average*/ = iM;
+
+    safe_snprintf(__FILE__, __LINE__, buf, sizeof(buf), "%.6f/%.6f/%.6f", iminDelay, iXBAR, imaxDelay);
+    printFeatureConfigInfo(textPrintFlag, "pcap_loop() idle (min/avg/max)", buf);
+  }
+
+#endif
+
   if(myGlobals.queueBufferCount >= MAX_PROCESS_BUFFER) {
 
     for(i=0; i<MAX_PROCESS_BUFFER; i++) {
