diff -urN squid-2.2.STABLE3/src/comm_select.c squid-2.2.STABLE3-DJL2/src/comm_select.c --- squid-2.2.STABLE3/src/comm_select.c Tue Jan 19 06:23:33 1999 +++ squid-2.2.STABLE3-DJL2/src/comm_select.c Thu Jul 1 20:22:49 1999 @@ -528,6 +528,31 @@ statHistCount(&Counter.comm_http_incoming, nevents); } +#if DELAY_POOLS +static int slowfdcnt = 0; +static int slowfdarr[SQUID_MAXFD]; + +static void +commAddSlowFd(int fd) +{ + assert(slowfdcnt < SQUID_MAXFD); + slowfdarr[slowfdcnt++] = fd; +} + +static int +commGetSlowFd(void) +{ + int whichfd, retfd; + + if(!slowfdcnt) + return -1; + whichfd = squid_random() % slowfdcnt; + retfd = slowfdarr[whichfd]; + slowfdarr[whichfd] = slowfdarr[--slowfdcnt]; + return retfd; +} +#endif + #define DEBUG_FDBITS 0 /* Select on all sockets; call handlers for those that are ready. */ int @@ -535,6 +560,9 @@ { fd_set readfds; fd_set writefds; +#if DELAY_POOLS + fd_set slowfds; +#endif PF *hdl = NULL; int fd; int maxfd; @@ -569,6 +597,9 @@ howmany(maxfd, FD_MASK_BITS) * FD_MASK_BYTES); xmemcpy(&writefds, &global_writefds, howmany(maxfd, FD_MASK_BITS) * FD_MASK_BYTES); +#if DELAY_POOLS + FD_ZERO(&slowfds); +#endif /* remove stalled FDs */ maxindex = howmany(maxfd, FD_MASK_BITS); fdsp = (fd_mask *) & readfds; @@ -580,14 +611,33 @@ continue; /* Found a set bit */ fd = (j * FD_MASK_BITS) + k; +#if DELAY_POOLS + switch (commDeferRead(fd)) { + case 0: + break; + case 1: + FD_CLR(fd, &readfds); + break; + case -1: + FD_SET(fd, &slowfds); + break; + default: + assert(!"commDeferRead(fd) should return 0,1,-1"); + } +#else if (commDeferRead(fd)) FD_CLR(fd, &readfds); +#endif } } #if DEBUG_FDBITS for (i = 0; i < maxfd; i++) { /* Check each open socket for a handler. */ +#if DELAY_POOLS + if (fd_table[i].read_handler && commDeferRead(i) != 1) { +#else if (fd_table[i].read_handler && !commDeferRead(i)) { +#endif assert(FD_ISSET(i, &readfds)); } if (fd_table[i].write_handler) { @@ -651,12 +701,18 @@ #endif if (fdIsIcp(fd)) { callicp = 1; - continue; + goto out_r; } if (fdIsHttp(fd)) { callhttp = 1; - continue; + goto out_r; + } +#if DELAY_POOLS + if (FD_ISSET(fd, &slowfds)) { + commAddSlowFd(fd); + goto out_r; } +#endif F = &fd_table[fd]; debug(5, 6) ("comm_select: FD %d ready for reading\n", fd); if (F->read_handler) { @@ -670,6 +726,7 @@ comm_select_icp_incoming(); if (commCheckHTTPIncoming) comm_select_http_incoming(); + out_r: EBIT_CLR(tmask, k); /* this bit is done */ if (tmask == 0) break; /* and no more bits left */ @@ -690,11 +747,11 @@ #endif if (fdIsIcp(fd)) { callicp = 1; - continue; + goto out_w; } if (fdIsHttp(fd)) { callhttp = 1; - continue; + goto out_w; } F = &fd_table[fd]; debug(5, 5) ("comm_select: FD %d ready for writing\n", fd); @@ -709,6 +766,7 @@ comm_select_icp_incoming(); if (commCheckHTTPIncoming) comm_select_http_incoming(); + out_w: EBIT_CLR(tmask, k); /* this bit is done */ if (tmask == 0) break; /* and no more bits left */ @@ -718,6 +776,23 @@ comm_select_icp_incoming(); if (callhttp) comm_select_http_incoming(); +#if DELAY_POOLS + while((fd = commGetSlowFd()) != -1) { + F = &fd_table[fd]; + debug(5, 6) ("comm_select: slow FD %d selected for reading\n", fd); + if (F->read_handler) { + hdl = F->read_handler; + F->read_handler = NULL; + commUpdateReadBits(fd, NULL); + hdl(fd, F->read_data); + Counter.select_fds++; + } + if (commCheckICPIncoming) + comm_select_icp_incoming(); + if (commCheckHTTPIncoming) + comm_select_http_incoming(); + } +#endif return COMM_OK; } while (timeout > current_dtime); debug(5, 8) ("comm_select: time out: %d\n", (int) squid_curtime); diff -urN squid-2.2.STABLE3/src/forward.c squid-2.2.STABLE3-DJL2/src/forward.c --- squid-2.2.STABLE3/src/forward.c Wed May 12 04:37:52 1999 +++ squid-2.2.STABLE3-DJL2/src/forward.c Thu Jul 1 19:25:39 1999 @@ -455,6 +455,12 @@ { StoreEntry *e = data; MemObject *mem = e->mem_obj; +#ifdef DELAY_POOLS + int i = 0; +#else +#define i 0 +#endif + if (mem == NULL) return 0; #if DELAY_POOLS @@ -462,14 +468,21 @@ (void) 0; else if (delayIsNoDelay(fd)) (void) 0; - else if (delayMostBytesWanted(mem, 1) == 0) - return 1; + else { + i = delayMostBytesWanted(mem, INT_MAX); + if (i == 0) + return 1; + i = -(i != INT_MAX); + } #endif if (EBIT_TEST(e->flags, ENTRY_FWD_HDR_WAIT)) - return 0; + return i; if (mem->inmem_hi - storeLowestMemReaderOffset(e) < READ_AHEAD_GAP) - return 0; + return i; return 1; +#ifndef DELAY_POOLS +#undef i +#endif } void diff -urN squid-2.2.STABLE3/src/ssl.c squid-2.2.STABLE3-DJL2/src/ssl.c --- squid-2.2.STABLE3/src/ssl.c Thu May 13 02:49:20 1999 +++ squid-2.2.STABLE3-DJL2/src/ssl.c Thu Jul 1 19:19:48 1999 @@ -118,7 +118,14 @@ sslDeferServerRead(int fdnotused, void *data) { SslStateData *s = data; - return delayBytesWanted(s->delay_id, 0, 1) == 0; + int i; + + i = delayBytesWanted(s->delay_id, 0, INT_MAX); + if(i == INT_MAX) + return 0; + if(i == 0) + return 1; + return -1; } #endif