]> git.ipfire.org Git - thirdparty/squid.git/blame - src/store/LocalSearch.cc
Source Format Enforcement (#532)
[thirdparty/squid.git] / src / store / LocalSearch.cc
CommitLineData
2745fea5 1/*
77b1029d 2 * Copyright (C) 1996-2020 The Squid Software Foundation and contributors
2745fea5
AR
3 *
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
7 */
8
9/* DEBUG: section 47 Store Search */
10
11#include "squid.h"
12#include "Debug.h"
13#include "globals.h"
14#include "store/LocalSearch.h"
15#include "StoreSearch.h"
16
17namespace Store {
18
19/// iterates local store_table
20class LocalSearch : public StoreSearch
21{
22 CBDATA_CLASS(LocalSearch);
23
24public:
2745fea5
AR
25 /* StoreSearch API */
26 virtual void next(void (callback)(void *cbdata), void *cbdata) override;
27 virtual bool next() override;
28 virtual bool error() const override;
29 virtual bool isDone() const override;
30 virtual StoreEntry *currentItem() override;
31
32private:
33 void copyBucket();
43b6575c
AJ
34 bool _done = false;
35 int bucket = 0;
2745fea5
AR
36 std::vector<StoreEntry *> entries;
37};
38
39} // namespace Store
40
41CBDATA_NAMESPACED_CLASS_INIT(Store, LocalSearch);
42
43StoreSearch *
44Store::NewLocalSearch()
45{
46 return new LocalSearch;
47}
48
2745fea5
AR
49void
50Store::LocalSearch::next(void (aCallback)(void *), void *aCallbackData)
51{
52 next();
53 aCallback (aCallbackData);
54}
55
56bool
57Store::LocalSearch::next()
58{
59 if (!entries.empty())
60 entries.pop_back();
61
62 while (!isDone() && !entries.size())
63 copyBucket();
64
65 return currentItem() != NULL;
66}
67
68bool
69Store::LocalSearch::error() const
70{
71 return false;
72}
73
74bool
75Store::LocalSearch::isDone() const
76{
77 return bucket >= store_hash_buckets || _done;
78}
79
80StoreEntry *
81Store::LocalSearch::currentItem()
82{
83 if (!entries.size())
84 return NULL;
85
86 return entries.back();
87}
88
89void
90Store::LocalSearch::copyBucket()
91{
92 /* probably need to lock the store entries...
93 * we copy them all to prevent races on the links. */
94 debugs(47, 3, "Store::LocalSearch::copyBucket #" << bucket);
95 assert (!entries.size());
96 hash_link *link_ptr = NULL;
97 hash_link *link_next = NULL;
98 link_next = hash_get_bucket(store_table, bucket);
99
100 while (NULL != (link_ptr = link_next)) {
101 link_next = link_ptr->next;
102 StoreEntry *e = (StoreEntry *) link_ptr;
103
104 entries.push_back(e);
105 }
106
107 ++bucket;
108 debugs(47,3, "got entries: " << entries.size());
109}
7d84d4ca 110