SpiecsEngine
 
Loading...
Searching...
No Matches

◆ InternalNewSpan()

scl::span * Spices::PageCache::InternalNewSpan ( size_t k)
private

Fetch pages span(internal call).

Parameters
[in]kpages count. @reurn Returns a new span.

Allocate from system.

Has empty pages in pc.

Pop a span.

Iter begger span, try find spare pages in pc.

Pop a span.

New a span to split bigger span.

Push splited span to list.

Allocate memory from system if no spare pages in pc.

New a span to mamage this memory.

Push span to list.

Allocate from system.

Has empty pages in pc.

Pop a span.

Iter begger span, try find spare pages in pc.

Pop a span.

New a span to split bigger span.

Push splited span to list.

Allocate memory from system if no spare pages in pc.

New a span to mamage this memory.

Push span to list.

Definition at line 132 of file PageCache.cpp.

133 {
134 assert(k > 0);
135
139 if (k > MemoryPool::PAGE_NUM - 1)
140 {
141 void* ptr = SystemAlloc(k);
142 scl::span* s = m_SpanPool.New();
143 s->m_PageId = reinterpret_cast<size_t>(ptr) >> MemoryPool::PAGE_SHIFT;
144 s->m_NPages = k;
145 s->m_BlockSize = k * (1 << MemoryPool::PAGE_SHIFT);
146
147 m_IdSpanMap.set(s->m_PageId, s);
148
149 return s;
150 }
151
155 if (!m_SpanLists[k].Empty())
156 {
160 scl::span* s = m_SpanLists[k].PopFront();
161 s->m_BlockSize = k * (1 << MemoryPool::PAGE_SHIFT);
162
163 for (size_t i = 0; i < s->m_NPages; ++i)
164 {
165 m_IdSpanMap.set(s->m_PageId + i, s);
166 }
167
168 return s;
169 }
170
174 for (size_t i = k + 1; i < MemoryPool::PAGE_NUM; ++i)
175 {
176 if (!m_SpanLists[i].Empty())
177 {
181 scl::span* nSpan = m_SpanLists[i].PopFront();
182
186 scl::span* kSpan = m_SpanPool.New();
187 kSpan->m_PageId = nSpan->m_PageId;
188 kSpan->m_NPages = k;
189 kSpan->m_BlockSize = (1 << MemoryPool::PAGE_SHIFT) * k;
190
191 nSpan->m_PageId += k;
192 nSpan->m_NPages -= k;
193 nSpan->m_BlockSize = (1 << MemoryPool::PAGE_SHIFT) * nSpan->m_NPages;
194
198 m_SpanLists[nSpan->m_NPages].PushFront(nSpan);
199
200 m_IdSpanMap.set(nSpan->m_PageId, nSpan);
201 m_IdSpanMap.set(nSpan->m_PageId + nSpan->m_NPages - 1, nSpan);
202
203 for (size_t j = 0; j < kSpan->m_NPages; ++j)
204 {
205 m_IdSpanMap.set(kSpan->m_PageId + j, kSpan);
206 }
207
208 return kSpan;
209 }
210 }
211
215 void* ptr = SystemAlloc(MemoryPool::PAGE_NUM - 1);
216
220 scl::span* bigSpan = m_SpanPool.New();
221 bigSpan->m_PageId = reinterpret_cast<size_t>(ptr) >> MemoryPool::PAGE_SHIFT;
222 bigSpan->m_NPages = MemoryPool::PAGE_NUM - 1;
223 bigSpan->m_BlockSize = (1 << MemoryPool::PAGE_SHIFT) * bigSpan->m_NPages;
224
228 m_SpanLists[MemoryPool::PAGE_NUM - 1].PushFront(bigSpan);
229
230 return InternalNewSpan(k);
231 }
static constexpr size_t PAGE_NUM
number of pages in pc (1M).
Definition MemoryPool.h:39
static constexpr size_t PAGE_SHIFT
8KB in a page.
Definition MemoryPool.h:44
T * New()
Alloc a memory block to store T.
Definition ObjectPool.h:177
scl::radix_trie< 64 - MemoryPool::PAGE_SHIFT, 3 > m_IdSpanMap
radix trie for [pageId - span]
Definition PageCache.h:106
scl::span * InternalNewSpan(size_t k)
Fetch pages span(internal call).
ObjectPool< scl::span > m_SpanPool
ObjectPool for span.
Definition PageCache.h:96
std::array< scl::span_list, MemoryPool::PAGE_NUM > m_SpanLists
FreeList Array.
Definition PageCache.h:91
size_t m_BlockSize
page block size.
Definition SpanList.h:66
size_t m_PageId
Start page id.
Definition SpanList.h:31
size_t m_NPages
How much page it managed.
Definition SpanList.h:36
Used for manage multiple page memory.
Definition SpanList.h:15
static void * SystemAlloc(size_t kpage)
Alloc memory from system.
Definition MemoryPool.h:107