Sat, 03 Jan 2015 20:18:00 +0100
Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.
1 /*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
8 #ifndef GrMemoryPool_DEFINED
9 #define GrMemoryPool_DEFINED
11 #include "GrTypes.h"
13 /**
14 * Allocates memory in blocks and parcels out space in the blocks for allocation
15 * requests. It is optimized for allocate / release speed over memory
16 * effeciency. The interface is designed to be used to implement operator new
17 * and delete overrides. All allocations are expected to be released before the
18 * pool's destructor is called. Allocations will be 8-byte aligned.
19 */
20 class GrMemoryPool {
21 public:
22 /**
23 * Prealloc size is the amount of space to make available at pool creation
24 * time and keep around until pool destruction. The min alloc size is the
25 * smallest allowed size of additional allocations.
26 */
27 GrMemoryPool(size_t preallocSize, size_t minAllocSize);
29 ~GrMemoryPool();
31 /**
32 * Allocates memory. The memory must be freed with release().
33 */
34 void* allocate(size_t size);
36 /**
37 * p must have been returned by allocate()
38 */
39 void release(void* p);
41 /**
42 * Returns true if there are no unreleased allocations.
43 */
44 bool isEmpty() const { return fTail == fHead && !fHead->fLiveCount; }
46 private:
47 struct BlockHeader;
49 static BlockHeader* CreateBlock(size_t size);
51 static void DeleteBlock(BlockHeader* block);
53 void validate();
55 struct BlockHeader {
56 BlockHeader* fNext; ///< doubly-linked list of blocks.
57 BlockHeader* fPrev;
58 int fLiveCount; ///< number of outstanding allocations in the
59 ///< block.
60 intptr_t fCurrPtr; ///< ptr to the start of blocks free space.
61 intptr_t fPrevPtr; ///< ptr to the last allocation made
62 size_t fFreeSize; ///< amount of free space left in the block.
63 };
65 enum {
66 // We assume this alignment is good enough for everybody.
67 kAlignment = 8,
68 kHeaderSize = GR_CT_ALIGN_UP(sizeof(BlockHeader), kAlignment),
69 kPerAllocPad = GR_CT_ALIGN_UP(sizeof(BlockHeader*), kAlignment),
70 };
71 size_t fPreallocSize;
72 size_t fMinAllocSize;
73 BlockHeader* fHead;
74 BlockHeader* fTail;
75 #ifdef SK_DEBUG
76 int fAllocationCnt;
77 #endif
78 };
80 #endif