From: adrian <> Date: Sun, 7 May 2000 22:18:19 +0000 (+0000) Subject: Killing the abuse of storeClientListSearch() in the code. Now the X-Git-Tag: SQUID_3_0_PRE1~1986 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=06d2839d890bd9ca841c0d9da67f26a47abf802f;p=thirdparty%2Fsquid.git Killing the abuse of storeClientListSearch() in the code. Now the client list per memObject is a dlink_list rather than a single linked list. storeClientListAdd() returns a store_client * which is then used whenever storeClientCopy()/storeUnregister() is called. --- diff --git a/src/asn.cc b/src/asn.cc index 6129b7dfdc..2981caa276 100644 --- a/src/asn.cc +++ b/src/asn.cc @@ -1,5 +1,5 @@ /* - * $Id: asn.cc,v 1.59 2000/03/06 16:23:28 wessels Exp $ + * $Id: asn.cc,v 1.60 2000/05/07 16:18:19 adrian Exp $ * * DEBUG: section 53 AS Number handling * AUTHOR: Duane Wessels, Kostas Anagnostakis @@ -62,6 +62,7 @@ struct _as_info { struct _ASState { StoreEntry *entry; + store_client *sc; request_t *request; int as_number; off_t seen; @@ -195,16 +196,17 @@ asnCacheStart(int as) asState->request = requestLink(req); if ((e = storeGetPublic(asres, METHOD_GET)) == NULL) { e = storeCreateEntry(asres, asres, null_request_flags, METHOD_GET); - storeClientListAdd(e, asState); + asState->sc = storeClientListAdd(e, asState); fwdStart(-1, e, asState->request); } else { storeLockObject(e); - storeClientListAdd(e, asState); + asState->sc = storeClientListAdd(e, asState); } asState->entry = e; asState->seen = 0; asState->offset = 0; - storeClientCopy(e, + storeClientCopy(asState->sc, + e, asState->seen, asState->offset, 4096, @@ -259,7 +261,8 @@ asHandleReply(void *data, char *buf, ssize_t size) asState->seen, asState->offset); if (e->store_status == STORE_PENDING) { debug(53, 3) ("asHandleReply: store_status == STORE_PENDING: %s\n", storeUrl(e)); - storeClientCopy(e, + storeClientCopy(asState->sc, + e, asState->seen, asState->offset, SM_PAGE_SIZE, @@ -268,7 +271,8 @@ asHandleReply(void *data, char *buf, ssize_t size) asState); } else if (asState->seen < e->mem_obj->inmem_hi) { debug(53, 3) ("asHandleReply: asState->seen < e->mem_obj->inmem_hi %s\n", storeUrl(e)); - storeClientCopy(e, + storeClientCopy(asState->sc, + e, asState->seen, asState->offset, SM_PAGE_SIZE, @@ -287,7 +291,7 @@ asStateFree(void *data) { ASState *asState = data; debug(53, 3) ("asnStateFree: %s\n", storeUrl(asState->entry)); - storeUnregister(asState->entry, asState); + storeUnregister(asState->sc, asState->entry, asState); storeUnlockObject(asState->entry); requestUnlink(asState->request); cbdataFree(asState); diff --git a/src/client_side.cc b/src/client_side.cc index 8c7d97dd6a..fda78752c9 100644 --- a/src/client_side.cc +++ b/src/client_side.cc @@ -1,6 +1,6 @@ /* - * $Id: client_side.cc,v 1.479 2000/05/02 22:32:37 hno Exp $ + * $Id: client_side.cc,v 1.480 2000/05/07 16:18:19 adrian Exp $ * * DEBUG: section 33 Client-side Routines * AUTHOR: Duane Wessels @@ -192,11 +192,11 @@ clientCreateStoreEntry(clientHttpRequest * h, method_t m, request_flags flags) if (h->request == NULL) h->request = requestLink(requestCreate(m, PROTO_NONE, null_string)); e = storeCreateEntry(h->uri, h->log_uri, flags, m); - storeClientListAdd(e, h); + h->sc = storeClientListAdd(e, h); #if DELAY_POOLS - delaySetStoreClient(e, h, delayClient(h->request)); + delaySetStoreClient(h->sc, delayClient(h->request)); #endif - storeClientCopy(e, 0, 0, CLIENT_SOCK_SZ, + storeClientCopy(h->sc, e, 0, 0, CLIENT_SOCK_SZ, memAllocate(MEM_CLIENT_SOCK_BUF), clientSendMoreData, h); return e; } @@ -349,16 +349,18 @@ clientProcessExpired(void *data) * it is not, then the beginning of the object data might get * freed from memory before we need to access it. */ +#if STORE_CLIENT_LIST_SEARCH assert(storeClientListSearch(http->old_entry->mem_obj, http)); +#endif entry = storeCreateEntry(url, http->log_uri, http->request->flags, http->request->method); /* NOTE, don't call storeLockObject(), storeCreateEntry() does it */ - storeClientListAdd(entry, http); + http->sc = storeClientListAdd(entry, http); #if DELAY_POOLS /* delay_id is already set on original store client */ - delaySetStoreClient(entry, http, delayClient(http->request)); + delaySetStoreClient(http->sc, delayClient(http->request)); #endif http->request->lastmod = http->old_entry->lastmod; debug(33, 5) ("clientProcessExpired: lastmod %d\n", (int) entry->lastmod); @@ -368,7 +370,7 @@ clientProcessExpired(void *data) /* Register with storage manager to receive updates when data comes in. */ if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) debug(33, 0) ("clientProcessExpired: found ENTRY_ABORTED object\n"); - storeClientCopy(entry, + storeClientCopy(http->sc, entry, http->out.offset, http->out.offset, CLIENT_SOCK_SZ, @@ -442,7 +444,7 @@ clientHandleIMSReply(void *data, char *buf, ssize_t size) /* We have an existing entry, but failed to validate it */ /* Its okay to send the old one anyway */ http->log_type = LOG_TCP_REFRESH_FAIL_HIT; - storeUnregister(entry, http); + storeUnregister(http->sc, entry, http); storeUnlockObject(entry); entry = http->entry = http->old_entry; } else if (STORE_PENDING == entry->store_status && 0 == status) { @@ -452,12 +454,12 @@ clientHandleIMSReply(void *data, char *buf, ssize_t size) debug(33, 3) ("clientHandleIMSReply: Reply is too large '%s', using old entry\n", url); /* use old entry, this repeats the code abovez */ http->log_type = LOG_TCP_REFRESH_FAIL_HIT; - storeUnregister(entry, http); + storeUnregister(http->sc, entry, http); storeUnlockObject(entry); entry = http->entry = http->old_entry; /* continue */ } else { - storeClientCopy(entry, + storeClientCopy(http->sc, entry, http->out.offset + size, http->out.offset, CLIENT_SOCK_SZ, @@ -482,7 +484,7 @@ clientHandleIMSReply(void *data, char *buf, ssize_t size) * not the body they refer to. */ httpReplyUpdateOnNotModified(oldentry->mem_obj->reply, mem->reply); storeTimestampsSet(oldentry); - storeUnregister(entry, http); + storeUnregister(http->sc, entry, http); storeUnlockObject(entry); entry = http->entry = oldentry; entry->timestamp = squid_curtime; @@ -499,14 +501,14 @@ clientHandleIMSReply(void *data, char *buf, ssize_t size) storeTimestampsSet(http->old_entry); http->log_type = LOG_TCP_REFRESH_HIT; } - storeUnregister(http->old_entry, http); + storeUnregister(http->sc, http->old_entry, http); storeUnlockObject(http->old_entry); recopy = 0; } http->old_entry = NULL; /* done with old_entry */ assert(!EBIT_TEST(entry->flags, ENTRY_ABORTED)); if (recopy) { - storeClientCopy(entry, + storeClientCopy(http->sc, entry, http->out.offset, http->out.offset, CLIENT_SOCK_SZ, @@ -685,7 +687,7 @@ httpRequestFree(void *data) */ if ((e = http->entry)) { http->entry = NULL; - storeUnregister(e, http); + storeUnregister(http->sc, e, http); storeUnlockObject(e); } #endif @@ -740,14 +742,14 @@ httpRequestFree(void *data) stringClean(&http->range_iter.boundary); if ((e = http->entry)) { http->entry = NULL; - storeUnregister(e, http); + storeUnregister(http->sc, e, http); storeUnlockObject(e); } /* old_entry might still be set if we didn't yet get the reply * code in clientHandleIMSReply() */ if ((e = http->old_entry)) { http->old_entry = NULL; - storeUnregister(e, http); + storeUnregister(http->sc, e, http); storeUnlockObject(e); } requestUnlink(http->request); @@ -1300,7 +1302,7 @@ clientCacheHit(void *data, char *buf, ssize_t size) http->log_type = LOG_TCP_SWAPFAIL_MISS; if ((e = http->entry)) { http->entry = NULL; - storeUnregister(e, http); + storeUnregister(http->sc, e, http); storeUnlockObject(e); } clientProcessMiss(http); @@ -1322,7 +1324,7 @@ clientCacheHit(void *data, char *buf, ssize_t size) clientProcessMiss(http); } else { debug(33, 3) ("clientCacheHit: waiting for HTTP reply headers\n"); - storeClientCopy(e, + storeClientCopy(http->sc, e, http->out.offset + size, http->out.offset, CLIENT_SOCK_SZ, @@ -1408,7 +1410,7 @@ clientCacheHit(void *data, char *buf, ssize_t size) MemBuf mb = httpPacked304Reply(e->mem_obj->reply); http->log_type = LOG_TCP_IMS_HIT; memFree(buf, MEM_CLIENT_SOCK_BUF); - storeUnregister(e, http); + storeUnregister(http->sc, e, http); storeUnlockObject(e); e = clientCreateStoreEntry(http, http->request->method, null_request_flags); http->entry = e; @@ -1673,7 +1675,7 @@ clientSendMoreData(void *data, char *buf, ssize_t size) if (rep && clientReplyBodyTooLarge(rep->content_length)) { ErrorState *err = errorCon(ERR_TOO_BIG, HTTP_FORBIDDEN); err->request = requestLink(http->request); - storeUnregister(http->entry, http); + storeUnregister(http->sc, http->entry, http); storeUnlockObject(http->entry); http->entry = clientCreateStoreEntry(http, http->request->method, null_request_flags); @@ -1689,7 +1691,7 @@ clientSendMoreData(void *data, char *buf, ssize_t size) body_size, rep->hdr_sz); } else if (size < CLIENT_SOCK_SZ && entry->store_status == STORE_PENDING) { /* wait for more to arrive */ - storeClientCopy(entry, + storeClientCopy(http->sc, entry, http->out.offset + size, http->out.offset, CLIENT_SOCK_SZ, @@ -1783,10 +1785,10 @@ clientKeepaliveNextRequest(clientHttpRequest * http) debug(33, 1) ("clientKeepaliveNextRequest: FD %d Sending next\n", conn->fd); assert(entry); - if (0 == storeClientCopyPending(entry, http)) { + if (0 == storeClientCopyPending(http->sc, entry, http)) { if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) debug(33, 0) ("clientKeepaliveNextRequest: ENTRY_ABORTED\n"); - storeClientCopy(entry, + storeClientCopy(http->sc, entry, http->out.offset, http->out.offset, CLIENT_SOCK_SZ, @@ -1845,7 +1847,7 @@ clientWriteComplete(int fd, char *bufnotused, size_t size, int errflag, void *da * storage manager. */ if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) debug(33, 0) ("clientWriteComplete 2: ENTRY_ABORTED\n"); - storeClientCopy(entry, + storeClientCopy(http->sc, entry, http->out.offset, http->out.offset, CLIENT_SOCK_SZ, @@ -1874,7 +1876,7 @@ clientProcessOnlyIfCachedMiss(clientHttpRequest * http) err->request = requestLink(r); err->src_addr = http->conn->peer.sin_addr; if (http->entry) { - storeUnregister(http->entry, http); + storeUnregister(http->sc, http->entry, http); storeUnlockObject(http->entry); } http->entry = clientCreateStoreEntry(http, r->method, null_request_flags); @@ -2002,11 +2004,11 @@ clientProcessRequest(clientHttpRequest * http) storeLockObject(http->entry); storeCreateMemObject(http->entry, http->uri, http->log_uri); http->entry->mem_obj->method = r->method; - storeClientListAdd(http->entry, http); + http->sc = storeClientListAdd(http->entry, http); #if DELAY_POOLS - delaySetStoreClient(http->entry, http, delayClient(r)); + delaySetStoreClient(http->sc, delayClient(r)); #endif - storeClientCopy(http->entry, + storeClientCopy(http->sc, http->entry, http->out.offset, http->out.offset, CLIENT_SOCK_SZ, @@ -2037,7 +2039,7 @@ clientProcessMiss(clientHttpRequest * http) if (http->entry) { if (EBIT_TEST(http->entry->flags, ENTRY_SPECIAL)) debug(33, 0) ("clientProcessMiss: miss on a special object (%s).\n", url); - storeUnregister(http->entry, http); + storeUnregister(http->sc, http->entry, http); storeUnlockObject(http->entry); http->entry = NULL; } diff --git a/src/delay_pools.cc b/src/delay_pools.cc index 38be59aa55..484107f412 100644 --- a/src/delay_pools.cc +++ b/src/delay_pools.cc @@ -1,6 +1,6 @@ /* - * $Id: delay_pools.cc,v 1.14 2000/05/02 18:55:11 hno Exp $ + * $Id: delay_pools.cc,v 1.15 2000/05/07 16:18:19 adrian Exp $ * * DEBUG: section 77 Delay Pools * AUTHOR: David Luyer @@ -609,7 +609,9 @@ delayMostBytesWanted(const MemObject * mem, int max) int i = 0; int found = 0; store_client *sc; - for (sc = mem->clients; sc; sc = sc->next) { + dlink_node *node; + for (node = mem->clients.head; node; node = node->next) { + sc = (store_client *)node->data; if (sc->callback_data == NULL) /* open slot */ continue; if (sc->type != STORE_MEM_CLIENT) @@ -626,8 +628,10 @@ delayMostBytesAllowed(const MemObject * mem) int j; int jmax = -1; store_client *sc; + dlink_node *node; delay_id d = 0; - for (sc = mem->clients; sc; sc = sc->next) { + for (node = mem->clients.head; node; node = node->next) { + sc = (store_client *)node->data; if (sc->callback_data == NULL) /* open slot */ continue; if (sc->type != STORE_MEM_CLIENT) @@ -642,9 +646,8 @@ delayMostBytesAllowed(const MemObject * mem) } void -delaySetStoreClient(StoreEntry * e, void *data, delay_id delay_id) +delaySetStoreClient(store_client *sc, delay_id delay_id) { - store_client *sc = storeClientListSearch(e->mem_obj, data); assert(sc != NULL); sc->delay_id = delay_id; delayRegisterDelayIdPtr(&sc->delay_id); diff --git a/src/net_db.cc b/src/net_db.cc index c8006a98e9..aedb2e3992 100644 --- a/src/net_db.cc +++ b/src/net_db.cc @@ -1,6 +1,6 @@ /* - * $Id: net_db.cc,v 1.143 2000/05/02 20:41:23 hno Exp $ + * $Id: net_db.cc,v 1.144 2000/05/07 16:18:19 adrian Exp $ * * DEBUG: section 38 Network Measurement Database * AUTHOR: Duane Wessels @@ -40,6 +40,7 @@ typedef struct { peer *p; StoreEntry *e; + store_client *sc; request_t *r; off_t seen; off_t used; @@ -591,11 +592,11 @@ netdbExchangeHandleReply(void *data, char *buf, ssize_t size) netdbExchangeDone(ex); } else if (ex->e->store_status == STORE_PENDING) { debug(38, 3) ("netdbExchangeHandleReply: STORE_PENDING\n"); - storeClientCopy(ex->e, ex->seen, ex->used, ex->buf_sz, + storeClientCopy(ex->sc, ex->e, ex->seen, ex->used, ex->buf_sz, ex->buf, netdbExchangeHandleReply, ex); } else if (ex->seen < ex->e->mem_obj->inmem_hi) { debug(38, 3) ("netdbExchangeHandleReply: ex->e->mem_obj->inmem_hi\n"); - storeClientCopy(ex->e, ex->seen, ex->used, ex->buf_sz, + storeClientCopy(ex->sc, ex->e, ex->seen, ex->used, ex->buf_sz, ex->buf, netdbExchangeHandleReply, ex); } else { debug(38, 3) ("netdbExchangeHandleReply: Done\n"); @@ -610,7 +611,7 @@ netdbExchangeDone(void *data) debug(38, 3) ("netdbExchangeDone: %s\n", storeUrl(ex->e)); memFree(ex->buf, MEM_4K_BUF); requestUnlink(ex->r); - storeUnregister(ex->e, ex); + storeUnregister(ex->sc, ex->e, ex); storeUnlockObject(ex->e); cbdataUnlock(ex->p); cbdataFree(ex); @@ -968,8 +969,8 @@ netdbExchangeStart(void *data) ex->buf_sz = 4096;; ex->buf = memAllocate(MEM_4K_BUF); assert(NULL != ex->e); - storeClientListAdd(ex->e, ex); - storeClientCopy(ex->e, ex->seen, ex->used, ex->buf_sz, + ex->sc = storeClientListAdd(ex->e, ex); + storeClientCopy(ex->sc, ex->e, ex->seen, ex->used, ex->buf_sz, ex->buf, netdbExchangeHandleReply, ex); ex->r->flags.loopdetect = 1; /* cheat! -- force direct */ if (p->login) diff --git a/src/peer_digest.cc b/src/peer_digest.cc index 17fbc8b1e6..ad0c422b9a 100644 --- a/src/peer_digest.cc +++ b/src/peer_digest.cc @@ -1,6 +1,6 @@ /* - * $Id: peer_digest.cc,v 1.73 2000/03/06 16:23:33 wessels Exp $ + * $Id: peer_digest.cc,v 1.74 2000/05/07 16:18:19 adrian Exp $ * * DEBUG: section 72 Peer Digest Routines * AUTHOR: Alex Rousskov @@ -312,11 +312,11 @@ peerDigestRequest(PeerDigest * pd) debug(72, 5) ("peerDigestRequest: found old entry\n"); storeLockObject(old_e); storeCreateMemObject(old_e, url, url); - storeClientListAdd(old_e, fetch); + fetch->old_sc = storeClientListAdd(old_e, fetch); } e = fetch->entry = storeCreateEntry(url, url, req->flags, req->method); assert(EBIT_TEST(e->flags, KEY_PRIVATE)); - storeClientListAdd(e, fetch); + fetch->sc = storeClientListAdd(e, fetch); /* set lastmod to trigger IMS request if possible */ if (old_e) e->lastmod = old_e->lastmod; @@ -326,7 +326,7 @@ peerDigestRequest(PeerDigest * pd) fwdStart(-1, e, req); cbdataLock(fetch); cbdataLock(fetch->pd); - storeClientCopy(e, 0, 0, 4096, memAllocate(MEM_4K_BUF), + storeClientCopy(fetch->sc, e, 0, 0, 4096, memAllocate(MEM_4K_BUF), peerDigestFetchReply, fetch); } @@ -365,7 +365,7 @@ peerDigestFetchReply(void *data, char *buf, ssize_t size) httpReplyUpdateOnNotModified(fetch->old_entry->mem_obj->reply, reply); storeTimestampsSet(fetch->old_entry); /* get rid of 304 reply */ - storeUnregister(fetch->entry, fetch); + storeUnregister(fetch->sc, fetch->entry, fetch); storeUnlockObject(fetch->entry); fetch->entry = fetch->old_entry; fetch->old_entry = NULL; @@ -376,7 +376,7 @@ peerDigestFetchReply(void *data, char *buf, ssize_t size) /* get rid of old entry if any */ if (fetch->old_entry) { debug(72, 3) ("peerDigestFetchReply: got new digest, releasing old one\n"); - storeUnregister(fetch->old_entry, fetch); + storeUnregister(fetch->old_sc, fetch->old_entry, fetch); storeReleaseRequest(fetch->old_entry); storeUnlockObject(fetch->old_entry); fetch->old_entry = NULL; @@ -391,14 +391,14 @@ peerDigestFetchReply(void *data, char *buf, ssize_t size) if (status == HTTP_NOT_MODIFIED && fetch->pd->cd) peerDigestFetchStop(fetch, buf, "Not modified"); else - storeClientCopy(fetch->entry, /* have to swap in */ + storeClientCopy(fetch->sc, fetch->entry, /* have to swap in */ 0, 0, SM_PAGE_SIZE, buf, peerDigestSwapInHeaders, fetch); } else { /* need more data, do we have space? */ if (size >= SM_PAGE_SIZE) peerDigestFetchAbort(fetch, buf, "reply header too big"); else - storeClientCopy(fetch->entry, size, 0, SM_PAGE_SIZE, buf, + storeClientCopy(fetch->sc, fetch->entry, size, 0, SM_PAGE_SIZE, buf, peerDigestFetchReply, fetch); } } @@ -425,7 +425,7 @@ peerDigestSwapInHeaders(void *data, char *buf, ssize_t size) return; } fetch->offset += hdr_size; - storeClientCopy(fetch->entry, size, fetch->offset, + storeClientCopy(fetch->sc, fetch->entry, size, fetch->offset, SM_PAGE_SIZE, buf, peerDigestSwapInCBlock, fetch); } else { @@ -433,7 +433,7 @@ peerDigestSwapInHeaders(void *data, char *buf, ssize_t size) if (size >= SM_PAGE_SIZE) peerDigestFetchAbort(fetch, buf, "stored header too big"); else - storeClientCopy(fetch->entry, size, 0, SM_PAGE_SIZE, buf, + storeClientCopy(fetch->sc, fetch->entry, size, 0, SM_PAGE_SIZE, buf, peerDigestSwapInHeaders, fetch); } } @@ -459,7 +459,7 @@ peerDigestSwapInCBlock(void *data, char *buf, ssize_t size) memFree(buf, MEM_4K_BUF); buf = NULL; assert(pd->cd->mask); - storeClientCopy(fetch->entry, + storeClientCopy(fetch->sc, fetch->entry, seen, fetch->offset, pd->cd->mask_size, @@ -473,7 +473,7 @@ peerDigestSwapInCBlock(void *data, char *buf, ssize_t size) if (size >= SM_PAGE_SIZE) peerDigestFetchAbort(fetch, buf, "digest cblock too big"); else - storeClientCopy(fetch->entry, size, 0, SM_PAGE_SIZE, buf, + storeClientCopy(fetch->sc, fetch->entry, size, 0, SM_PAGE_SIZE, buf, peerDigestSwapInCBlock, fetch); } } @@ -501,7 +501,7 @@ peerDigestSwapInMask(void *data, char *buf, ssize_t size) } else { const size_t buf_sz = pd->cd->mask_size - fetch->mask_offset; assert(buf_sz > 0); - storeClientCopy(fetch->entry, + storeClientCopy(fetch->sc, fetch->entry, fetch->offset, fetch->offset, buf_sz, @@ -684,7 +684,7 @@ peerDigestFetchFinish(DigestFetchState * fetch, int err) if (fetch->old_entry) { debug(72, 2) ("peerDigestFetchFinish: deleting old entry\n"); - storeUnregister(fetch->old_entry, fetch); + storeUnregister(fetch->sc, fetch->old_entry, fetch); storeReleaseRequest(fetch->old_entry); storeUnlockObject(fetch->old_entry); fetch->old_entry = NULL; @@ -696,7 +696,7 @@ peerDigestFetchFinish(DigestFetchState * fetch, int err) Counter.cd.msgs_recv += fetch->recv.msg; /* unlock everything */ - storeUnregister(fetch->entry, fetch); + storeUnregister(fetch->sc, fetch->entry, fetch); storeUnlockObject(fetch->entry); requestUnlink(fetch->request); fetch->entry = NULL; diff --git a/src/protos.h b/src/protos.h index 9d06e61fd4..44f55e76ef 100644 --- a/src/protos.h +++ b/src/protos.h @@ -1,6 +1,6 @@ /* - * $Id: protos.h,v 1.363 2000/05/03 17:15:42 adrian Exp $ + * $Id: protos.h,v 1.364 2000/05/07 16:18:19 adrian Exp $ * * * SQUID Internet Object Cache http://squid.nlanr.net/Squid/ @@ -807,14 +807,6 @@ extern void storeAppend(StoreEntry *, const char *, int); extern void storeLockObject(StoreEntry *); extern void storeRelease(StoreEntry *); extern int storeUnlockObject(StoreEntry *); -extern int storeUnregister(StoreEntry *, void *); -extern void storeClientCopy(StoreEntry * e, - off_t seen_offset, - off_t copy_offset, - size_t size, - char *buf, - STCB * callback, - void *data); extern int storePendingNClients(const StoreEntry *); extern EVH storeMaintainSwapSpace; extern void storeExpireNow(StoreEntry *); @@ -824,7 +816,6 @@ extern void storeConfigure(void); extern void storeNegativeCache(StoreEntry *); extern void storeFreeMemory(void); extern int expiresMoreThan(time_t, time_t); -extern int storeClientCopyPending(StoreEntry *, void *); extern void InvokeHandlers(StoreEntry *); extern int storeEntryValidToSend(StoreEntry *); extern void storeTimestampsSet(StoreEntry *); @@ -966,11 +957,13 @@ extern int storeSwapOutAble(const StoreEntry * e); /* * store_client.c */ +#if STORE_CLIENT_LIST_DEBUG extern store_client *storeClientListSearch(const MemObject * mem, void *data); -extern void storeClientListAdd(StoreEntry * e, void *data); -extern void storeClientCopy(StoreEntry *, off_t, off_t, size_t, char *, STCB *, void *); -extern int storeClientCopyPending(StoreEntry * e, void *data); -extern int storeUnregister(StoreEntry * e, void *data); +#endif +extern store_client *storeClientListAdd(StoreEntry * e, void *data); +extern void storeClientCopy(store_client *, StoreEntry *, off_t, off_t, size_t, char *, STCB *, void *); +extern int storeClientCopyPending(store_client *, StoreEntry * e, void *data); +extern int storeUnregister(store_client *sc, StoreEntry * e, void *data); extern off_t storeLowestMemReaderOffset(const StoreEntry * entry); extern void InvokeHandlers(StoreEntry * e); extern int storePendingNClients(const StoreEntry * e); @@ -1158,7 +1151,7 @@ extern int delayBytesWanted(delay_id d, int min, int max); extern void delayBytesIn(delay_id, int qty); extern int delayMostBytesWanted(const MemObject * mem, int max); extern delay_id delayMostBytesAllowed(const MemObject * mem); -extern void delaySetStoreClient(StoreEntry * e, void *data, delay_id delay_id); +extern void delaySetStoreClient(store_client *sc, delay_id delay_id); extern void delayRegisterDelayIdPtr(delay_id * loc); extern void delayUnregisterDelayIdPtr(delay_id * loc); #endif diff --git a/src/stat.cc b/src/stat.cc index ce61d332e4..a98ad934af 100644 --- a/src/stat.cc +++ b/src/stat.cc @@ -1,6 +1,6 @@ /* - * $Id: stat.cc,v 1.325 2000/05/03 17:15:42 adrian Exp $ + * $Id: stat.cc,v 1.326 2000/05/07 16:18:19 adrian Exp $ * * DEBUG: section 18 Cache Manager Statistics * AUTHOR: Harvest Derived @@ -253,6 +253,7 @@ statStoreEntry(StoreEntry * s, StoreEntry * e) MemObject *mem = e->mem_obj; int i; struct _store_client *sc; + dlink_node *node; storeAppendPrintf(s, "KEY %s\n", storeKeyText(e->key)); if (mem) storeAppendPrintf(s, "\t%s %s\n", @@ -274,7 +275,8 @@ statStoreEntry(StoreEntry * s, StoreEntry * e) if (mem->swapout.sio) storeAppendPrintf(s, "\tswapout: %d bytes written\n", (int) storeOffset(mem->swapout.sio)); - for (i = 0, sc = &mem->clients[i]; sc != NULL; sc = sc->next, i++) { + for (i = 0, node = mem->clients.head; node; node = node->next, i++) { + sc = (store_client *)node->data; if (sc->callback_data == NULL) continue; storeAppendPrintf(s, "\tClient #%d, %p\n", i, sc->callback_data); diff --git a/src/store.cc b/src/store.cc index 1e8713a266..a41cfeb37f 100644 --- a/src/store.cc +++ b/src/store.cc @@ -1,6 +1,6 @@ /* - * $Id: store.cc,v 1.520 2000/05/03 17:15:42 adrian Exp $ + * $Id: store.cc,v 1.521 2000/05/07 16:18:20 adrian Exp $ * * DEBUG: section 20 Storage Manager * AUTHOR: Harvest Derived @@ -166,7 +166,7 @@ destroy_MemObject(StoreEntry * e) * There is no way to abort FD-less clients, so they might * still have mem->clients set if mem->fd == -1 */ - assert(mem->fd == -1 || mem->clients == NULL); + assert(mem->fd == -1 || mem->clients.head == NULL); httpReplyDestroy(mem->reply); requestUnlink(mem->request); mem->request = NULL; diff --git a/src/store_client.cc b/src/store_client.cc index 78a4598d5b..51066a8cef 100644 --- a/src/store_client.cc +++ b/src/store_client.cc @@ -1,6 +1,6 @@ /* - * $Id: store_client.cc,v 1.87 2000/05/03 17:15:43 adrian Exp $ + * $Id: store_client.cc,v 1.88 2000/05/07 16:18:20 adrian Exp $ * * DEBUG: section 20 Storage Manager Client-Side Interface * AUTHOR: Duane Wessels @@ -56,24 +56,30 @@ int storeClientWaiting(const StoreEntry * e) { MemObject *mem = e->mem_obj; + dlink_node *node; store_client *sc; - for (sc = mem->clients; sc; sc = sc->next) { + for (node = mem->clients.head; node; node = node->next) { + sc = (store_client *)node->data; if (sc->callback_data != NULL) return 1; } return 0; } +#if STORE_CLIENT_LIST_DEBUG store_client * storeClientListSearch(const MemObject * mem, void *data) { - store_client *sc; - for (sc = mem->clients; sc; sc = sc->next) { + dlink_node *node; + store_client *sc = NULL; + for (node = mem->clients.head; node; node = node->next) { + sc = (store_client *)node->data; if (sc->callback_data == data) - break; + return sc; } - return sc; + return NULL; } +#endif static store_client_t storeClientType(StoreEntry * e) @@ -115,15 +121,16 @@ storeClientType(StoreEntry * e) } /* add client with fd to client list */ -void +store_client * storeClientListAdd(StoreEntry * e, void *data) { MemObject *mem = e->mem_obj; - store_client **T; store_client *sc; assert(mem); +#if STORE_CLIENT_LIST_DEBUG if (storeClientListSearch(mem, data) != NULL) - return; + assert(1==0); /* XXX die! */ +#endif e->refcount++; mem->nclients++; sc = memAllocate(MEM_STORE_CLIENT); @@ -139,11 +146,11 @@ storeClientListAdd(StoreEntry * e, void *data) /* assert we'll be able to get the data we want */ /* maybe we should open swapin_fd here */ assert(e->swap_filen > -1 || storeSwapOutAble(e)); - for (T = &mem->clients; *T; T = &(*T)->next); - *T = sc; + dlinkAdd(sc, &sc->node, &mem->clients); #if DELAY_POOLS sc->delay_id = 0; #endif + return sc; } static void @@ -171,7 +178,8 @@ storeClientCopyEvent(void *data) /* copy bytes requested by the client */ void -storeClientCopy(StoreEntry * e, +storeClientCopy(store_client *sc, + StoreEntry * e, off_t seen_offset, off_t copy_offset, size_t size, @@ -179,7 +187,6 @@ storeClientCopy(StoreEntry * e, STCB * callback, void *data) { - store_client *sc; assert(!EBIT_TEST(e->flags, ENTRY_ABORTED)); debug(20, 3) ("storeClientCopy: %s, seen %d, want %d, size %d, cb %p, cbdata %p\n", storeKeyText(e->key), @@ -188,9 +195,12 @@ storeClientCopy(StoreEntry * e, (int) size, callback, data); - sc = storeClientListSearch(e->mem_obj, data); assert(sc != NULL); +#if STORE_CLIENT_LIST_DEBUG + assert(sc == storeClientListSearch(e->mem_obj, data)); +#endif assert(sc->callback == NULL); + assert(sc->entry == e); sc->copy_offset = copy_offset; sc->seen_offset = seen_offset; sc->callback = callback; @@ -457,10 +467,12 @@ storeClientReadHeader(void *data, const char *buf, ssize_t len) } int -storeClientCopyPending(StoreEntry * e, void *data) +storeClientCopyPending(store_client *sc, StoreEntry * e, void *data) { - /* return 1 if there is a callback registered for this client */ - store_client *sc = storeClientListSearch(e->mem_obj, data); +#if STORE_CLIENT_LIST_DEBUG + assert(sc == storeClientListSearch(e->mem_obj, data)); +#endif + assert(sc->entry == e); if (sc == NULL) return 0; if (sc->callback == NULL) @@ -468,52 +480,55 @@ storeClientCopyPending(StoreEntry * e, void *data) return 1; } +/* + * This routine hasn't been optimised to take advantage of the + * passed sc. Yet. + */ int -storeUnregister(StoreEntry * e, void *data) +storeUnregister(store_client *sc, StoreEntry * e, void *data) { MemObject *mem = e->mem_obj; - store_client *sc; - store_client **S; +#if STORE_CLIENT_LIST_DEBUG + assert(sc == storeClientListSearch(e->mem_obj, data)); +#endif if (mem == NULL) - return 0; + return 0; debug(20, 3) ("storeUnregister: called for '%s'\n", storeKeyText(e->key)); - for (S = &mem->clients; (sc = *S) != NULL; S = &(*S)->next) { - if (sc->callback_data == data) - break; - } if (sc == NULL) - return 0; - if (sc == mem->clients) { - /* - * If we are unregistering the _first_ client for this - * entry, then we have to reset the client FD to -1. - */ - mem->fd = -1; + return 0; + if (mem->clients.head == NULL) + return 0; + if (sc == (store_client *)mem->clients.head->data) { + /* + * If we are unregistering the _first_ client for this + * entry, then we have to reset the client FD to -1. + */ + mem->fd = -1; } - *S = sc->next; + dlinkDelete(&sc->node, &mem->clients); mem->nclients--; if (e->store_status == STORE_OK && e->swap_status != SWAPOUT_DONE) - storeSwapOut(e); + storeSwapOut(e); if (sc->swapin_sio) { - storeClose(sc->swapin_sio); - cbdataUnlock(sc->swapin_sio); - sc->swapin_sio = NULL; + storeClose(sc->swapin_sio); + cbdataUnlock(sc->swapin_sio); + sc->swapin_sio = NULL; } if (NULL != sc->callback) { - /* callback with ssize = -1 to indicate unexpected termination */ - debug(20, 3) ("storeUnregister: store_client for %s has a callback\n", - mem->url); - storeClientCallback(sc, -1); + /* callback with ssize = -1 to indicate unexpected termination */ + debug(20, 3) ("storeUnregister: store_client for %s has a callback\n", + mem->url); + storeClientCallback(sc, -1); } #if DELAY_POOLS delayUnregisterDelayIdPtr(&sc->delay_id); #endif - cbdataUnlock(sc->callback_data); /* we're done with it now */ + cbdataUnlock(sc->callback_data); /* we're done with it now */ /*assert(!sc->flags.disk_io_pending); */ cbdataFree(sc); assert(e->lock_count > 0); if (mem->nclients == 0) - CheckQuickAbort(e); + CheckQuickAbort(e); return 1; } @@ -523,9 +538,12 @@ storeLowestMemReaderOffset(const StoreEntry * entry) const MemObject *mem = entry->mem_obj; off_t lowest = mem->inmem_hi + 1; store_client *sc; - store_client *nx = NULL; - for (sc = mem->clients; sc; sc = nx) { - nx = sc->next; + dlink_node *nx = NULL; + dlink_node *node; + + for (node = mem->clients.head; node; node = nx) { + sc = (store_client *)node->data; + nx = node->next; if (sc->callback_data == NULL) /* open slot */ continue; if (sc->type != STORE_MEM_CLIENT) @@ -546,12 +564,14 @@ InvokeHandlers(StoreEntry * e) int i = 0; MemObject *mem = e->mem_obj; store_client *sc; - store_client *nx = NULL; - assert(mem->clients != NULL || mem->nclients == 0); + dlink_node *nx = NULL; + dlink_node *node; + debug(20, 3) ("InvokeHandlers: %s\n", storeKeyText(e->key)); /* walk the entire list looking for valid callbacks */ - for (sc = mem->clients; sc; sc = nx) { - nx = sc->next; + for (node = mem->clients.head; node; node = nx) { + sc = (store_client *)node->data; + nx = node->next; debug(20, 3) ("InvokeHandlers: checking client #%d\n", i++); if (sc->callback_data == NULL) continue; diff --git a/src/store_swapout.cc b/src/store_swapout.cc index c2de97109b..4c3c7a3c41 100644 --- a/src/store_swapout.cc +++ b/src/store_swapout.cc @@ -1,6 +1,6 @@ /* - * $Id: store_swapout.cc,v 1.65 2000/05/03 17:15:44 adrian Exp $ + * $Id: store_swapout.cc,v 1.66 2000/05/07 16:18:20 adrian Exp $ * * DEBUG: section 20 Storage Manager Swapout Functions * AUTHOR: Duane Wessels @@ -346,7 +346,7 @@ storeSwapOutObjectBytesOnDisk(const MemObject * mem) int storeSwapOutAble(const StoreEntry * e) { - store_client *sc; + dlink_node *node; if (e->mem_obj->swapout.sio != NULL) return 1; if (e->mem_obj->inmem_lo > 0) @@ -355,9 +355,10 @@ storeSwapOutAble(const StoreEntry * e) * If there are DISK clients, we must write to disk * even if its not cachable */ - for (sc = e->mem_obj->clients; sc; sc = sc->next) - if (sc->type == STORE_DISK_CLIENT) - return 1; + for (node = e->mem_obj->clients.head; node; node = node->next) { + if (((store_client *)node->data)->type == STORE_DISK_CLIENT) + return 1; + } if (store_dirs_rebuilding) if (!EBIT_TEST(e->flags, ENTRY_SPECIAL)) return 0; diff --git a/src/structs.h b/src/structs.h index 566b811e37..4d0e7fa812 100644 --- a/src/structs.h +++ b/src/structs.h @@ -1,6 +1,6 @@ /* - * $Id: structs.h,v 1.329 2000/05/03 17:15:44 adrian Exp $ + * $Id: structs.h,v 1.330 2000/05/07 16:18:20 adrian Exp $ * * * SQUID Internet Object Cache http://squid.nlanr.net/Squid/ @@ -850,6 +850,7 @@ struct _AccessLogEntry { struct _clientHttpRequest { ConnStateData *conn; request_t *request; /* Parsed URL ... */ + store_client *sc; /* The store_client we're using */ char *uri; char *log_uri; struct { @@ -989,6 +990,8 @@ struct _DigestFetchState { PeerDigest *pd; StoreEntry *entry; StoreEntry *old_entry; + store_client *sc; + store_client *old_sc; request_t *request; int offset; int mask_offset; @@ -1259,10 +1262,10 @@ struct _store_client { unsigned int store_copying:1; unsigned int copy_event_pending:1; } flags; - store_client *next; #if DELAY_POOLS delay_id delay_id; #endif + dlink_node node; }; @@ -1273,7 +1276,7 @@ struct _MemObject { mem_hdr data_hdr; off_t inmem_hi; off_t inmem_lo; - store_client *clients; + dlink_list clients; int nclients; struct { off_t queue_offset; /* relative to in-mem data */ diff --git a/src/urn.cc b/src/urn.cc index ebbd390579..278c50c6f8 100644 --- a/src/urn.cc +++ b/src/urn.cc @@ -1,7 +1,7 @@ /* * - * $Id: urn.cc,v 1.58 2000/03/06 16:23:36 wessels Exp $ + * $Id: urn.cc,v 1.59 2000/05/07 16:18:20 adrian Exp $ * * DEBUG: section 52 URN Parsing * AUTHOR: Kostas Anagnostakis @@ -38,6 +38,7 @@ typedef struct { StoreEntry *entry; + store_client *sc; StoreEntry *urlres_e; request_t *request; request_t *urlres_r; @@ -137,15 +138,15 @@ urnStart(request_t * r, StoreEntry * e) httpHeaderPutStr(&urlres_r->header, HDR_ACCEPT, "text/plain"); if ((urlres_e = storeGetPublic(urlres, METHOD_GET)) == NULL) { urlres_e = storeCreateEntry(urlres, urlres, null_request_flags, METHOD_GET); - storeClientListAdd(urlres_e, urnState); + urnState->sc = storeClientListAdd(urlres_e, urnState); fwdStart(-1, urlres_e, urlres_r); } else { storeLockObject(urlres_e); - storeClientListAdd(urlres_e, urnState); + urnState->sc = storeClientListAdd(urlres_e, urnState); } urnState->urlres_e = urlres_e; urnState->urlres_r = requestLink(urlres_r); - storeClientCopy(urlres_e, + storeClientCopy(urnState->sc, urlres_e, 0, 0, 4096, @@ -199,7 +200,7 @@ urnHandleReply(void *data, char *buf, ssize_t size) return; } if (urlres_e->store_status == STORE_PENDING && size < SM_PAGE_SIZE) { - storeClientCopy(urlres_e, + storeClientCopy(urnState->sc, urlres_e, size, 0, SM_PAGE_SIZE, @@ -289,7 +290,7 @@ urnHandleReply(void *data, char *buf, ssize_t size) } safe_free(urls); /* mb was absorbed in httpBodySet call, so we must not clean it */ - storeUnregister(urlres_e, urnState); + storeUnregister(urnState->sc, urlres_e, urnState); storeUnlockObject(urlres_e); storeUnlockObject(urnState->entry); requestUnlink(urnState->request);