]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Killing the abuse of storeClientListSearch() in the code. Now the
authoradrian <>
Sun, 7 May 2000 22:18:19 +0000 (22:18 +0000)
committeradrian <>
Sun, 7 May 2000 22:18:19 +0000 (22:18 +0000)
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.

12 files changed:
src/asn.cc
src/client_side.cc
src/delay_pools.cc
src/net_db.cc
src/peer_digest.cc
src/protos.h
src/stat.cc
src/store.cc
src/store_client.cc
src/store_swapout.cc
src/structs.h
src/urn.cc

index 6129b7dfdcef1732374b5886049b28d1b02cef55..2981caa276aab15e0e7f889c114006d91bba378e 100644 (file)
@@ -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);
index 8c7d97dd6a2c693eba705415860ec1a47eafab09..fda78752c968a581ae309942e6ec99e463791382 100644 (file)
@@ -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;
     }
index 38be59aa55f23fa57f03a0e86ae7fe5178dca249..484107f41206a601c06eeac125561744d36aee3e 100644 (file)
@@ -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 <luyer@ucs.uwa.edu.au>
@@ -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);
index c8006a98e9252b4b84d2f7f7cd978503b38d8cbe..aedb2e39928c691bc84106679fcad668f43a2b0c 100644 (file)
@@ -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)
index 17fbc8b1e615a538b7030dbcb3921289d666193d..ad0c422b9a5045c10043c5249e52c56084f2310a 100644 (file)
@@ -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;
index 9d06e61fd4085609e40fc20a585ee48bbcd7bd1e..44f55e76ef642f652cd01f5279cda482bcec6093 100644 (file)
@@ -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
index ce61d332e4b29bb0b7b6bd9396ae4c5cce813af0..a98ad934af2c5b1c8f07fd50c9009619f08b4577 100644 (file)
@@ -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);
index 1e8713a26681866d061a619d4fa02c5c51c9534b..a41cfeb37fdbd555611c4b7c04dfcb7b1951b226 100644 (file)
@@ -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;
index 78a4598d5bb3996569bb2876f535b2d1fbccb126..51066a8cefd0f79bae9b71d26be937cc29e9d770 100644 (file)
@@ -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;
index c2de97109b56e7f19bcfeb25534646aaf8b5e974..4c3c7a3c41472eb723fc5669a46a4182da664e93 100644 (file)
@@ -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;
index 566b811e371b119dda47645ffa626b6cd91511bb..4d0e7fa812a9e2e3d4f2e8698a54c3f7ef421cc5 100644 (file)
@@ -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 */
index ebbd390579d7d18f5953767edb020f4cfc7a25eb..278c50c6f8db1a6bd16546dc118b7c5412058406 100644 (file)
@@ -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);