SpiecsEngine
 
Loading...
Searching...
No Matches

◆ ReleaseSpanToPageCache()

void Spices::PageCache::ReleaseSpanToPageCache ( scl::span * s)

Release span from cc to pc,.

Parameters
[in]sspan.

Release to system.

Merge to left.

Merge to right.

Push span to list.

Release to system.

Merge to left.

Merge to right.

Push span to list.

Definition at line 43 of file PageCache.cpp.

44 {
45 std::unique_lock<std::mutex> lock(m_Mutex);
46
50 if (s->m_NPages > MemoryPool::PAGE_NUM - 1)
51 {
52 void* ptr = reinterpret_cast<void*>(s->m_PageId << MemoryPool::PAGE_SHIFT);
53 SystemFree(ptr);
54
55 m_IdSpanMap.set(s->m_PageId, nullptr);
57
58 return;
59 }
60
64 for(;;)
65 {
66 const size_t leftId = s->m_PageId - 1;
67
68 scl::span* leftSpan = static_cast<scl::span*>(m_IdSpanMap.get(leftId));
69
70 if (!leftSpan)
71 {
72 break;
73 }
74
75 if (leftSpan->m_IsUse)
76 {
77 break;
78 }
79
80 if (leftSpan->m_NPages + s->m_NPages > MemoryPool::PAGE_NUM - 1)
81 {
82 break;
83 }
84
85 s->m_PageId = leftSpan->m_PageId;
86 s->m_NPages += leftSpan->m_NPages;
87
88 m_SpanLists[leftSpan->m_NPages].Erase(leftSpan);
89 m_SpanPool.Delete(leftSpan);
90 }
91
95 for (;;)
96 {
97 const size_t rightId = s->m_PageId + s->m_NPages;
98
99 scl::span* rightSpan = static_cast<scl::span*>(m_IdSpanMap.get(rightId));
100
101 if (!rightSpan)
102 {
103 break;
104 }
105
106 if (rightSpan->m_IsUse)
107 {
108 break;
109 }
110
111 if (rightSpan->m_NPages + s->m_NPages > MemoryPool::PAGE_NUM - 1)
112 {
113 break;
114 }
115
116 s->m_NPages += rightSpan->m_NPages;
117
118 m_SpanLists[rightSpan->m_NPages].Erase(rightSpan);
119 m_SpanPool.Delete(rightSpan);
120 }
121
125 m_SpanLists[s->m_NPages].PushFront(s);
126 s->m_IsUse = false;
127
128 m_IdSpanMap.set(s->m_PageId, s);
129 m_IdSpanMap.set(s->m_PageId + s->m_NPages - 1, s);
130 }
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
void Delete(T *obj)
Free a obj of T.
Definition ObjectPool.h:233
scl::radix_trie< 64 - MemoryPool::PAGE_SHIFT, 3 > m_IdSpanMap
radix trie for [pageId - span]
Definition PageCache.h:106
std::mutex m_Mutex
mutex for pc.
Definition PageCache.h:101
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_PageId
Start page id.
Definition SpanList.h:31
size_t m_NPages
How much page it managed.
Definition SpanList.h:36
bool m_IsUse
True if in use.
Definition SpanList.h:61
Used for manage multiple page memory.
Definition SpanList.h:15
static void SystemFree(void *ptr)
Free memory to system.
Definition MemoryPool.h:133

References scl::span::m_IsUse, and Spices::SystemFree().

Referenced by Spices::MemoryPool::Free(), and Spices::CentralCache::ReleaseListToSpans().