1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
/* vim:set ts=4 sw=2 sts=2 et cin: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef HostRecordQueue_h__
#define HostRecordQueue_h__
#include <functional>
#include "mozilla/Mutex.h"
#include "nsHostRecord.h"
#include "nsRefPtrHashtable.h"
namespace mozilla {
namespace net {
class HostRecordQueue final {
public:
HostRecordQueue() = default;
~HostRecordQueue() = default;
HostRecordQueue(const HostRecordQueue& aCopy) = delete;
HostRecordQueue& operator=(const HostRecordQueue& aCopy) = delete;
uint32_t PendingCount() const { return mPendingCount; }
uint32_t EvictionQSize() const { return mEvictionQSize; }
// Insert the record to mHighQ or mMediumQ or mLowQ based on the record's
// priority.
void InsertRecord(nsHostRecord* aRec, nsIDNSService::DNSFlags aFlags,
const MutexAutoLock& aProofOfLock);
// Insert the record to mEvictionQ. In theory, this function should be called
// when the record is not in any queue.
void AddToEvictionQ(
nsHostRecord* aRec, uint32_t aMaxCacheEntries,
nsRefPtrHashtable<nsGenericHashKey<nsHostKey>, nsHostRecord>& aDB,
const MutexAutoLock& aProofOfLock);
// Called for removing the record from mEvictionQ. When this function is
// called, the record should be either in mEvictionQ or not in any queue.
void MaybeRenewHostRecord(nsHostRecord* aRec,
const MutexAutoLock& aProofOfLock);
// Called for clearing mEvictionQ.
void FlushEvictionQ(
nsRefPtrHashtable<nsGenericHashKey<nsHostKey>, nsHostRecord>& aDB,
const MutexAutoLock& aProofOfLock);
// Remove the record from the queue that contains it.
void MaybeRemoveFromQ(nsHostRecord* aRec, const MutexAutoLock& aProofOfLock);
// When the record's priority changes, move the record between pending queues.
void MoveToAnotherPendingQ(nsHostRecord* aRec, nsIDNSService::DNSFlags aFlags,
const MutexAutoLock& aProofOfLock);
// Returning the first record from one of the pending queue. When |aHighQOnly|
// is true, returning the record from mHighQ only. When false, return the
// record from mMediumQ or mLowQ.
already_AddRefed<nsHostRecord> Dequeue(bool aHighQOnly,
const MutexAutoLock& aProofOfLock);
// Clear all queues and is called only during shutdown. |aCallback| is invoked
// when a record is removed from a queue.
void ClearAll(const std::function<void(nsHostRecord*)>& aCallback,
const MutexAutoLock& aProofOfLock);
private:
Atomic<uint32_t> mPendingCount{0};
Atomic<uint32_t> mEvictionQSize{0};
LinkedList<RefPtr<nsHostRecord>> mHighQ;
LinkedList<RefPtr<nsHostRecord>> mMediumQ;
LinkedList<RefPtr<nsHostRecord>> mLowQ;
LinkedList<RefPtr<nsHostRecord>> mEvictionQ;
};
} // namespace net
} // namespace mozilla
#endif // HostRecordQueue_h__
|