/*
- * $Id: client_side.cc,v 1.379 1998/08/17 16:38:07 wessels Exp $
+ * $Id: client_side.cc,v 1.380 1998/08/17 16:44:02 wessels Exp $
*
* DEBUG: section 33 Client-side Routines
* AUTHOR: Duane Wessels
storeUnlockObject(entry);
entry = http->entry = http->old_entry;
entry->refcount++;
-#if DELAY_POOLS
- http->request->delay_id = 0;
-#endif
} else if (STORE_PENDING == entry->store_status && 0 == status) {
debug(33, 3) ("clientHandleIMSReply: Incomplete headers for '%s'\n", url);
if (size >= 4096) {
storeUnlockObject(entry);
entry = http->entry = http->old_entry;
entry->refcount++;
-#if DELAY_POOLS
- http->request->delay_id = 0;
-#endif
/* continue */
} else {
storeClientCopy(entry,
requestUnlink(entry->mem_obj->request);
entry->mem_obj->request = NULL;
}
-#if DELAY_POOLS
- http->request->delay_id = 0;
-#endif
} else {
/* the client can handle this reply, whatever it is */
http->log_type = LOG_TCP_REFRESH_MISS;
assert(http->log_type == LOG_TCP_HIT);
if (checkNegativeHit(e)) {
http->log_type = LOG_TCP_NEGATIVE_HIT;
-#if DELAY_POOLS
- http->request->delay_id = 0;
-#endif
clientSendMoreData(data, buf, size);
} else if (refreshCheck(e, r, 0) && !http->flags.internal) {
/*
*/
if (e->mem_status == IN_MEMORY)
http->log_type = LOG_TCP_MEM_HIT;
-#if DELAY_POOLS
- http->request->delay_id = 0;
-#endif
clientSendMoreData(data, buf, size);
}
}
/*
- * $Id: delay_pools.cc,v 1.2 1998/08/14 09:22:34 wessels Exp $
+ * $Id: delay_pools.cc,v 1.3 1998/08/17 16:44:03 wessels Exp $
*
* DEBUG: section 77 Delay Pools
* AUTHOR: David Luyer <luyer@ucs.uwa.edu.au>
#if DELAY_POOLS
#include "squid.h"
-
struct _delayData {
int class1_aggregate;
int class2_aggregate;
delayClient(clientHttpRequest * http)
{
aclCheck_t ch;
- int i, j;
+ int i;
+ int j;
unsigned int host;
unsigned char net;
unsigned char class = 0;
* into account bytes already buffered - that is up to the caller.
*/
int
-delayBytesWanted(delay_id d, int max)
+delayBytesWanted(delay_id d, int min, int max)
{
int position = d & 0xFFFF;
unsigned char class = (d & 0xFF0000) >> 16;
fatalf("delayBytesWanted: Invalid class %d\n", class);
break;
}
- assert(nbytes > 0);
+ nbytes = XMAX(min, nbytes);
+ assert(nbytes >= min);
assert(nbytes <= max);
return nbytes;
}
/*
* this records actual bytes recieved. always recorded, even if the
- * class is disabled - see above for all the cases which would be needed
- * to efficiently not record it, so it's just ignored if not wanted.
+ * class is disabled - it's more efficient to just do it than to do all
+ * the checks.
*/
void
delayBytesIn(delay_id d, int qty)
delayMostBytesWanted(const MemObject * mem, int max)
{
int i = 0;
+ int found = 0;
store_client *sc;
for (sc = mem->clients; sc; sc = sc->next) {
if (sc->callback_data == NULL) /* open slot */
continue;
if (sc->type != STORE_MEM_CLIENT)
continue;
- i = XMAX(delayBytesWanted(sc->delay_id, max), i);
+ i = delayBytesWanted(sc->delay_id, i, max);
+ found = 1;
}
- return i;
+ return found ? i : max;
}
delay_id
delayMostBytesAllowed(const MemObject * mem)
{
int j;
- int jmax = 0;
+ int jmax = -1;
store_client *sc;
delay_id d = 0;
for (sc = mem->clients; sc; sc = sc->next) {
continue;
if (sc->type != STORE_MEM_CLIENT)
continue;
- j = delayBytesWanted(sc->delay_id, SQUID_TCP_SO_RCVBUF);
+ j = delayBytesWanted(sc->delay_id, 0, SQUID_TCP_SO_RCVBUF);
if (j > jmax) {
jmax = j;
d = sc->delay_id;
/*
- * $Id: ftp.cc,v 1.244 1998/08/14 19:25:19 wessels Exp $
+ * $Id: ftp.cc,v 1.245 1998/08/17 16:44:04 wessels Exp $
*
* DEBUG: section 9 File Transfer Protocol (FTP)
* AUTHOR: Harvest Derived
errno = 0;
read_sz = ftpState->data.size - ftpState->data.offset;
#if DELAY_POOLS
- read_sz = delayBytesWanted(delay_id, read_sz);
- assert(read_sz > 0);
+ read_sz = delayBytesWanted(delay_id, 1, read_sz);
#endif
memset(ftpState->data.buf + ftpState->data.offset, '\0', read_sz);
len = read(fd, ftpState->data.buf + ftpState->data.offset, read_sz);
/*
- * $Id: gopher.cc,v 1.135 1998/08/14 09:22:36 wessels Exp $
+ * $Id: gopher.cc,v 1.136 1998/08/17 16:44:06 wessels Exp $
*
* DEBUG: section 10 Gopher
* AUTHOR: Harvest Derived
buf = memAllocate(MEM_4K_BUF);
read_sz = 4096 - 1; /* leave room for termination */
#if DELAY_POOLS
- read_sz = delayBytesWanted(delay_id, read_sz);
- assert(read_sz > 0);
+ read_sz = delayBytesWanted(delay_id, 1, read_sz);
#endif
/* leave one space for \0 in gopherToHTML */
len = read(fd, buf, read_sz);
/*
- * $Id: http.cc,v 1.306 1998/08/14 19:25:20 wessels Exp $
+ * $Id: http.cc,v 1.307 1998/08/17 16:44:07 wessels Exp $
*
* DEBUG: section 11 Hypertext Transfer Protocol (HTTP)
* AUTHOR: Harvest Derived
errno = 0;
read_sz = SQUID_TCP_SO_RCVBUF;
#if DELAY_POOLS
- read_sz = delayBytesWanted(delay_id, read_sz);
- assert(read_sz > 0);
+ read_sz = delayBytesWanted(delay_id, 1, read_sz);
#endif
len = read(fd, buf, read_sz);
debug(11, 5) ("httpReadReply: FD %d: len %d.\n", fd, len);
/*
- * $Id: protos.h,v 1.247 1998/08/14 23:53:09 wessels Exp $
+ * $Id: protos.h,v 1.248 1998/08/17 16:44:09 wessels Exp $
*
*
* SQUID Internet Object Cache http://squid.nlanr.net/Squid/
extern int delayMostBytesAllowed(const MemObject * mem);
extern void delayBytesIn(delay_id, int qty);
extern void delaySetStoreClient(StoreEntry * e, void *data, delay_id delay_id);
-extern int delayBytesWanted(delay_id d, int max);
+extern int delayBytesWanted(delay_id d, int min, int max);
#endif
/*
/*
- * $Id: ssl.cc,v 1.86 1998/08/14 09:22:40 wessels Exp $
+ * $Id: ssl.cc,v 1.87 1998/08/17 16:44:11 wessels Exp $
*
* DEBUG: section 26 Secure Sockets Layer Proxy
* AUTHOR: Duane Wessels
sslDeferServerRead(int fdnotused, void *data)
{
request_t *r = data;
- return delayBytesWanted(r->delay_id, 1) == 0;
+ return delayBytesWanted(r->delay_id, 0, 1) == 0;
}
#endif
0);
}
#if DELAY_POOLS
- read_sz = delayBytesWanted(sslState->request->delay_id, read_sz);
- assert(read_sz > 0);
+ /* If this was allowed to return 0, there would be a possibility
+ * of the socket becoming "hung" with data accumulating but no
+ * write handler (server.len==0) and no read handler (!(0<0)) and
+ * no data flowing in the other direction. Hence the argument of
+ * 1 as min.
+ */
+ read_sz = delayBytesWanted(sslState->request->delay_id, 1, read_sz);
#endif
if (sslState->server.len < read_sz) {
/* Have room to read more */
fd, read_sz, sslState->server.len);
errno = 0;
#if DELAY_POOLS
- read_sz = delayBytesWanted(sslState->request->delay_id, read_sz);
- assert(read_sz > 0);
+ read_sz = delayBytesWanted(sslState->request->delay_id, 1, read_sz);
#endif
len = read(fd, sslState->server.buf + sslState->server.len, read_sz);
debug(26, 3) ("sslReadServer: FD %d, read %d bytes\n", fd, len);
/*
- * $Id: structs.h,v 1.198 1998/08/16 06:35:18 wessels Exp $
+ * $Id: structs.h,v 1.199 1998/08/17 16:44:12 wessels Exp $
*
*
* SQUID Internet Object Cache http://squid.nlanr.net/Squid/
relist *next;
};
+#if DELAY_POOLS
struct _delay_spec {
int restore_bps;
int max_bytes;
};
+#endif
struct _SquidConfig {
struct {
/*
- * $Id: tunnel.cc,v 1.86 1998/08/14 09:22:40 wessels Exp $
+ * $Id: tunnel.cc,v 1.87 1998/08/17 16:44:11 wessels Exp $
*
* DEBUG: section 26 Secure Sockets Layer Proxy
* AUTHOR: Duane Wessels
sslDeferServerRead(int fdnotused, void *data)
{
request_t *r = data;
- return delayBytesWanted(r->delay_id, 1) == 0;
+ return delayBytesWanted(r->delay_id, 0, 1) == 0;
}
#endif
0);
}
#if DELAY_POOLS
- read_sz = delayBytesWanted(sslState->request->delay_id, read_sz);
- assert(read_sz > 0);
+ /* If this was allowed to return 0, there would be a possibility
+ * of the socket becoming "hung" with data accumulating but no
+ * write handler (server.len==0) and no read handler (!(0<0)) and
+ * no data flowing in the other direction. Hence the argument of
+ * 1 as min.
+ */
+ read_sz = delayBytesWanted(sslState->request->delay_id, 1, read_sz);
#endif
if (sslState->server.len < read_sz) {
/* Have room to read more */
fd, read_sz, sslState->server.len);
errno = 0;
#if DELAY_POOLS
- read_sz = delayBytesWanted(sslState->request->delay_id, read_sz);
- assert(read_sz > 0);
+ read_sz = delayBytesWanted(sslState->request->delay_id, 1, read_sz);
#endif
len = read(fd, sslState->server.buf + sslState->server.len, read_sz);
debug(26, 3) ("sslReadServer: FD %d, read %d bytes\n", fd, len);
/*
- * $Id: typedefs.h,v 1.67 1998/08/14 09:22:41 wessels Exp $
+ * $Id: typedefs.h,v 1.68 1998/08/17 16:44:13 wessels Exp $
*
*
* SQUID Internet Object Cache http://squid.nlanr.net/Squid/
#if DELAY_POOLS
typedef int delay_id;
-#else
-typedef int delay_id;
#endif
/*
- * $Id: wais.cc,v 1.116 1998/08/14 09:22:43 wessels Exp $
+ * $Id: wais.cc,v 1.117 1998/08/17 16:44:14 wessels Exp $
*
* DEBUG: section 24 WAIS Relay
* AUTHOR: Harvest Derived
errno = 0;
read_sz = 4096;
#if DELAY_POOLS
- read_sz = delayBytesWanted(delay_id, read_sz);
- assert(read_sz > 0);
+ read_sz = delayBytesWanted(delay_id, 1, read_sz);
#endif
len = read(fd, buf, read_sz);
if (len > 0) {