123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863 |
- #include "page.h"
- #include "shm_helper.h"
- #include "size_map.h"
- #include "shm_config.h"
- namespace bg
- {
- namespace detail
- {
- PageHeap::PageHeap()
- {
- }
- void PageHeap::DeallocateSpan(bg::detail::Span* s)
- {
- size_t m_start_page; // r12
- size_t m_page_count; // r14
- bg::detail::RadixTree<10ul, 10ul, 15ul>::NodeV1* v6; // rax
- bg::detail::RadixTree<10ul, 10ul, 15ul>::NodeV2* v7; // rax
- void** v8; // rdx
- size_t v9; // rax
- size_t v10; // rcx
- uintptr_t* v11; // rdi
- void* v12; // r8
- unsigned __int64 v13; // r12
- bg::detail::RadixTree<10ul, 10ul, 15ul>::NodeV1* v14; // rcx
- bg::detail::RadixTree<10ul, 10ul, 15ul>::NodeV2* v15; // rdx
- void** v16; // rdx
- size_t v17; // rax
- uintptr_t* v18; // rcx
- void* v19; // rsi
- size_t v20; // rax
- bg::detail::Span* p_m_large_list; // rdx
- bg::detail::Span* m_next; // rax
- m_start_page = s->m_start_page;
- s->m_in_use = 0;
- m_page_count = s->m_page_count;
- if(!m_start_page)
- goto LABEL_9;
- if(m_start_page - 1 > 0x7FFFFFFFFLL)
- {
- goto LABEL_24;
- }
- v6 = this->m_span_map.lv0[(m_start_page - 1) >> 25];
- if(!v6 || (v7 = v6->lv1[((m_start_page - 1) >> 15) & 0x3FF]) == 0LL)
- {
- LABEL_9:
- v9 = s->m_page_count;
- goto LABEL_10;
- }
- v8 = (void**)v7->lv2[((int64_t)m_start_page - 1) & 0x7FFF];
- v9 = s->m_page_count;
- if(v8 && *(char*)v8 != 1)
- {
- v10 = m_start_page - (size_t)v8[3];
- v11 = (uintptr_t*)v8[4];
- v12 = v8[5];
- s->m_start_page = v10;
- v9 = (size_t)v8[3] + m_page_count;
- s->m_page_count = v9;
- v11[5] = (uintptr_t)v12;
- *((uintptr_t*)v8[5] + 4) = (uintptr_t)v11;
- v8[4] = 0LL;
- v8[5] = 0LL;
- *v8 = this->m_span_allocator.m_free_list;
- this->m_span_allocator.m_free_list = v8;
- if(v10 <= 0x7FFFFFFFFLL)
- {
- this->m_span_map.lv0[v10 >> 25]->lv1[(v10 >> 15) & 0x3FF]->lv2[v10 & 0x7FFF] = s;
- goto LABEL_10;
- }
- LABEL_24:
- v9 = s->m_page_count;
- }
- LABEL_10:
- v13 = m_page_count + m_start_page;
- if(v13 <= 0x7FFFFFFFFLL)
- {
- v14 = this->m_span_map.lv0[v13 >> 25];
- if(v14)
- {
- v15 = v14->lv1[(v13 >> 15) & 0x3FF];
- if(v15)
- {
- v16 = (void**)v15->lv2[v13 & 0x7FFF];
- if(v16)
- {
- if(*(char*)v16 != 1)
- {
- v17 = (size_t)v16[3] + v9;
- v18 = (uintptr_t*)v16[4];
- v19 = v16[5];
- s->m_page_count = v17;
- v18[5] = (uintptr_t)v19;
- *((uintptr_t*)v16[5] + 4) = (uintptr_t)v18;
- v16[4] = 0LL;
- v16[5] = 0LL;
- *v16 = this->m_span_allocator.m_free_list;
- this->m_span_allocator.m_free_list = v16;
- if(v17)
- {
- v20 = v17 + s->m_start_page - 1;
- }
- else
- {
- SHM_ASSERT(m_page_count > 0);
- v20 = s->m_start_page;
- }
- if(v20 > 0x7FFFFFFFFLL)
- {
- }
- else
- this->m_span_map.lv0[v20 >> 25]->lv1[(v20 >> 15) & 0x3FF]->lv2[v20 & 0x7FFF] = s;
- v9 = s->m_page_count;
- }
- }
- }
- }
- }
- p_m_large_list = &this->m_large_list;
- if(v9 <= 0x7F)
- p_m_large_list = &this->m_free_lists[v9];
- m_next = p_m_large_list->m_next;
- s->m_prev = p_m_large_list;
- s->m_next = m_next;
- p_m_large_list->m_next->m_prev = s;
- p_m_large_list->m_next = s;
- }
- void PageHeap::RegisterSpan(bg::detail::Span* s)
- {
- int64_t v2; // rbx
- size_t v3; // r13
- size_t v4; // rax
- v2 = 1LL;
- v3 = s->m_page_count - 1;
- if(v3 > 1)
- {
- do
- {
- while(1)
- {
- v4 = s->m_start_page + v2;
- if(v4 > 0x7FFFFFFFFLL)
- break;
- ++v2;
- this->m_span_map.lv0[v4 >> 25]->lv1[(v4 >> 15) & 0x3FF]->lv2[v4 & 0x7FFF] = s;
- if(v3 == v2)
- return;
- }
- ++v2;
- } while(v3 != v2);
- }
- }
- bool PageHeap::GrowHeap(size_t page_count)
- {
- __int64 result; // rax
- unsigned __int64 v3; // rdx
- const char* RawMemory; // r9
- size_t m_page_count; // rbx
- size_t v8; // r14
- unsigned __int64* v9; // r11
- unsigned __int64 v10; // r12
- __int16 v11; // r10
- unsigned __int64 v12; // rdx
- __int64 v13; // r10
- uintptr_t* v14; // rax
- void* v15; // rax
- bg::detail::Span* m_free_list; // r12
- unsigned __int64 v17; // rax
- size_t m_free_left; // rax
- bg::detail::Span* v19; // rax
- __int64 v20; // rcx
- __int64 v21; // [rsp-20h] [rbp-68h]
- __int64 v22; // [rsp-20h] [rbp-68h]
- unsigned __int64* v23; // [rsp-18h] [rbp-60h]
- unsigned __int64* v24; // [rsp-18h] [rbp-60h]
- const char* v25; // [rsp-10h] [rbp-58h]
- const char* v26; // [rsp-10h] [rbp-58h]
- const char* v27; // [rsp-8h] [rbp-50h]
- size_t real_bytes; // [rsp+0h] [rbp-48h] BYREF
- size_t v29; // [rsp+8h] [rbp-40h] BYREF
- size_t page{};
- result = 0LL;
- if(page_count > 0x800000000LL)
- return false;
- if(page_count > 0x7F)
- {
- real_bytes = PAGES_TO_BYTES(page_count);
- RawMemory = (const char*)bg::detail::ShmAllocateRawMemory(
- (size_t*)&real_bytes,
- 0x2000);
- if(!RawMemory)
- return false;
- }
- else
- {
- real_bytes = 0x100000LL;
- RawMemory = (const char*)bg::detail::ShmAllocateRawMemory(
- &real_bytes, 0x2000);
- if(!RawMemory)
- {
- real_bytes = PAGES_TO_BYTES(page_count);
- RawMemory = (const char*)bg::detail::ShmAllocateRawMemory(
- &real_bytes, 0x2000);
- if(!RawMemory)
- {
- return false;
- }
- }
- }
- page = (unsigned __int64)RawMemory >> 13;
- m_page_count = BYTES_TO_PAGES(real_bytes);
- v8 = ((unsigned __int64)RawMemory >> 13) + (real_bytes >> 13);
- if(page >= v8)
- {
- LABEL_23:
- m_free_list = (bg::detail::Span*)this->m_span_allocator.m_free_list;
- if(m_free_list)
- {
- LABEL_25:
- new (m_free_list) bg::detail::Span();
- m_free_list->m_page_count = m_page_count;
- m_free_list->m_start_page = page;
- if(page > ShmConfig::MAX_PAGE_COUNT)
- {
- SHM_ASSERT(page < ShmConfig::MAX_PAGE_COUNT);
- m_page_count = m_free_list->m_page_count;
- }
- else
- {
- this->m_span_map.lv0[PTR_TO_LV0(page)]->lv1[PTR_TO_LV1(page)]->lv2[PTR_TO_LV0(page)] = m_free_list;
- }
- if(m_page_count > 1)
- {
- page = m_page_count + m_free_list->m_start_page - 1;
- if(page > ShmConfig::MAX_PAGE_COUNT)
- {
- SHM_ASSERT(page < ShmConfig::MAX_PAGE_COUNT);
- }
- else
- {
- this->m_span_map.lv0[PTR_TO_LV0(page)]->lv1[PTR_TO_LV1(page)]->lv2[PTR_TO_LV0(page)] = m_free_list;
- }
- }
- m_free_list->m_in_use = 1;
- this->DeallocateSpan(m_free_list);
- return true;
- }
- m_free_left = this->m_span_allocator.m_free_left;
- if(m_free_left <= 0x37)
- {
- v27 = RawMemory;
- v29 = 0x20000LL;
- v19 = (bg::detail::Span*)bg::detail::ShmAllocateRawMemory(
- &v29,
- 0x20000LL);
- if(v19)
- {
- v20 = v29;
- m_free_list = v19;
- this->m_span_allocator.m_free_area = (char*)&v19[1];
- this->m_span_allocator.m_free_left = v20 - 56;
- goto LABEL_25;
- }
- }
- else
- {
- m_free_list = (bg::detail::Span*)this->m_span_allocator.m_free_area;
- this->m_span_allocator.m_free_left = m_free_left - 56;
- this->m_span_allocator.m_free_area = (char*)&m_free_list[1];
- if(m_free_list)
- goto LABEL_25;
- }
- return false;
- }
- if((unsigned __int64)RawMemory >> 48)
- {
- goto FAIL;
- }
- v3 = (unsigned __int64)RawMemory >> 13;
- do
- {
- v9 = (unsigned __int64*)&this->m_span_map.lv0[v3 >> 25];
- v10 = v3 >> 15;
- v11 = v3 >> 15;
- v12 = *v9;
- v13 = v11 & 0x3FF;
- if(m_span_map.lv0[v3 >> 25])
- {
- if(m_span_map.lv0[v3 >> 25]->lv1[v13])
- {
- goto LABEL_9;
- }
- }
- else
- {
- v21 = v13;
- v23 = v9;
- v25 = RawMemory;
- v29 = sizeof(RadixTree::NodeV1);
- v14 = (uintptr_t*)bg::detail::ShmAllocateRawMemory(
- &v29, sizeof(RadixTree::NodeV1));
- RawMemory = v25;
- v9 = v23;
- v13 = v21;
- if(!v14)
- break;
- m_span_map.lv0[v3 >> 25] = (RadixTree::NodeV1*)v14;
- new (v14) RadixTree();
- v12 = *v23;
- if(m_span_map.lv0[v3 >> 25]->lv1[v21])
- goto LABEL_9;
- }
- v22 = v13;
- v24 = v9;
- v26 = RawMemory;
- v29 = sizeof(RadixTree::NodeV2);
- v15 = (void*)bg::detail::ShmAllocateRawMemory(&v29, sizeof(RadixTree::NodeV2));
- if(!v15)
- break;
- m_span_map.lv0[v3 >> 25]->lv1[v22] = (RadixTree::NodeV2*)v15;
- new (v15) RadixTree::NodeV2();
- LABEL_9:
- v3 = (v10 + 1) << 15;
- if(v3 >= v8)
- goto LABEL_23;
- } while(!(v3 >> 35));
- FAIL:
- SHM_ERROR("annot allocate enough space in span map, memory(%p, %#lx) leaked.", RawMemory, real_bytes);
- return false;
- }
- bg::detail::Span* PageHeap::AllocateSpan(size_t page_count)
- {
- bg::detail::Span* p_m_large_list; // r12
- bg::detail::Span* v4; // rdx
- bg::detail::Span* v5; // rax
- bg::detail::Span* v6; // rax
- bg::detail::Span* v7; // r15
- bg::detail::Span* v8; // rbx
- size_t v9; // rdx
- bg::detail::Span* v10; // rax
- size_t v11; // rcx
- unsigned __int64 v12; // rcx
- bg::detail::Span* m_next; // rbx
- bg::detail::Span* m_prev; // rax
- size_t m_page_count; // r12
- unsigned __int64 v17; // r12
- bg::detail::Span* v18; // rdx
- bg::detail::Span* v19; // rax
- bg::detail::Span* v20; // rax
- bg::detail::Span* v21; // rax
- size_t v22; // r12
- unsigned __int64 v23; // r12
- bg::detail::Span* m_free_area; // r10
- unsigned __int64 v25; // rdx
- unsigned __int64 v26; // rax
- bg::detail::Span* v27; // rax
- size_t v28; // rax
- bg::detail::Span* v29; // rax
- size_t v30; // r12
- unsigned __int64 v31; // r12
- bg::detail::Span* m_free_list; // r15
- unsigned __int64 m_start_page; // rdx
- unsigned __int64 v34; // rax
- bg::detail::Span* v35; // rax
- bg::detail::Span* v36; // rdx
- size_t v37; // rax
- bg::detail::Span* v38; // r12
- unsigned __int64 v39; // rdx
- unsigned __int64 v40; // rax
- bg::detail::Span* v41; // rax
- size_t v42; // rax
- unsigned __int64 v43; // rdx
- unsigned __int64 v44; // rax
- size_t v45; // rax
- size_t m_free_left; // rax
- size_t v47; // rax
- size_t v48; // rax
- bg::detail::Span* RawMemory; // rax
- __int64 v50; // rsi
- bg::detail::Span* v51; // rax
- bg::detail::Span* v52; // rax
- __int64 v53; // rsi
- bg::detail::Span* v54; // rax
- __int64 v55; // rsi
- unsigned __int64 v56; // [rsp+0h] [rbp-50h]
- bg::detail::Span* v57; // [rsp+8h] [rbp-48h]
- unsigned __int64 v58; // [rsp+8h] [rbp-48h]
- unsigned __int64 v59; // [rsp+8h] [rbp-48h]
- unsigned __int64 v60; // [rsp+8h] [rbp-48h]
- bg::detail::Span* v61; // [rsp+8h] [rbp-48h]
- bg::detail::Span* v62; // [rsp+8h] [rbp-48h]
- unsigned __int64 v63; // [rsp+8h] [rbp-48h]
- bg::detail::Span* v64; // [rsp+8h] [rbp-48h]
- __int64 v65[7]; // [rsp+18h] [rbp-38h] BYREF
- p_m_large_list = &this->m_large_list;
- if(page_count <= 0x7F)
- {
- v4 = &this->m_free_lists[page_count];
- if(v4 == this->m_free_lists[page_count].m_next)
- {
- p_m_large_list = &this->m_large_list;
- v5 = &this->m_free_lists[page_count + 1];
- while(v5 != p_m_large_list)
- {
- v4 = v5++;
- if(v4 != v5[-1].m_next)
- goto LABEL_19;
- }
- goto LABEL_6;
- }
- LABEL_19:
- m_next = v4->m_next;
- m_prev = m_next->m_prev;
- m_page_count = m_next->m_page_count;
- m_prev->m_next = m_next->m_next;
- v17 = m_page_count - page_count;
- m_next->m_next->m_prev = m_prev;
- m_next->m_prev = 0LL;
- m_next->m_next = 0LL;
- if(!v17)
- {
- LABEL_20:
- m_next->m_in_use = 1;
- return m_next;
- }
- m_free_list = (bg::detail::Span*)this->m_span_allocator.m_free_list;
- m_start_page = m_next->m_start_page;
- if(m_free_list)
- {
- this->m_span_allocator.m_free_list = *(void**)&m_free_list->m_in_use;
- }
- else
- {
- m_free_left = this->m_span_allocator.m_free_left;
- if(m_free_left <= 0x37)
- {
- v58 = m_next->m_start_page;
- v65[0] = 0x20000LL;
- RawMemory = (bg::detail::Span*)bg::detail::ShmAllocateRawMemory((size_t*)v65,
- 0x20000LL);
- if(!RawMemory)
- goto LABEL_20;
- v50 = v65[0];
- m_free_list = RawMemory;
- m_start_page = v58;
- this->m_span_allocator.m_free_area = (char*)&RawMemory[1];
- this->m_span_allocator.m_free_left = v50 - 56;
- }
- else
- {
- m_free_list = (bg::detail::Span*)this->m_span_allocator.m_free_area;
- this->m_span_allocator.m_free_left = m_free_left - 56;
- this->m_span_allocator.m_free_area = (char*)&m_free_list[1];
- if(!m_free_list)
- goto LABEL_20;
- }
- }
- m_free_list->m_in_use = 0;
- m_free_list->m_size_class = -1;
- m_free_list->m_used_count = 0LL;
- m_free_list->m_start_page = m_start_page + page_count;
- m_free_list->m_page_count = v17;
- m_free_list->m_prev = 0LL;
- m_free_list->m_next = 0LL;
- m_free_list->m_chunk_list = 0LL;
- if(m_start_page + page_count > 0x7FFFFFFFFLL)
- {
- v17 = m_free_list->m_page_count;
- }
- else
- {
- this->m_span_map.lv0[(m_start_page + page_count) >> 25]->lv1[((m_start_page + page_count) >> 15) & 0x3FF]->lv2[(m_start_page + page_count) & 0x7FFF] = m_free_list;
- }
- if(v17 <= 1
- || ((v34 = v17 + m_free_list->m_start_page - 1, v34 > 0x7FFFFFFFFLL)
- ? (bg::detail::Span*)(
- v17 = m_free_list->m_page_count)
- : (this->m_span_map.lv0[v34 >> 25]->lv1[((v17 + m_free_list->m_start_page - 1) >> 15) & 0x3FF]->lv2[v34 & 0x7FFF] = m_free_list),
- v35 = &this->m_large_list,
- v17 <= 0x7F))
- {
- v35 = &this->m_free_lists[v17];
- }
- v36 = v35->m_next;
- m_free_list->m_prev = v35;
- m_free_list->m_next = v36;
- v35->m_next->m_prev = m_free_list;
- v35->m_next = m_free_list;
- m_next->m_page_count = page_count;
- if(page_count)
- {
- v37 = page_count + m_next->m_start_page - 1;
- }
- else
- {
- v37 = m_next->m_start_page;
- }
- if(v37 > 0x7FFFFFFFFLL)
- {
- }
- else
- this->m_span_map.lv0[v37 >> 25]->lv1[(v37 >> 15) & 0x3FF]->lv2[v37 & 0x7FFF] = m_next;
- goto LABEL_20;
- }
- LABEL_6:
- v6 = this->m_large_list.m_next;
- v7 = p_m_large_list;
- if(v6 == p_m_large_list)
- goto LABEL_23;
- v8 = 0LL;
- do
- {
- while(1)
- {
- v9 = v6->m_page_count;
- if(page_count <= v9)
- {
- if(!v8 || v9 < v8->m_page_count)
- {
- v8 = v6;
- goto LABEL_14;
- }
- if(v9 == v8->m_page_count && v6->m_start_page < v8->m_start_page)
- break;
- }
- v6 = v6->m_next;
- if(p_m_large_list == v6)
- goto LABEL_15;
- }
- v8 = v6;
- LABEL_14:
- v6 = v6->m_next;
- } while(p_m_large_list != v6);
- LABEL_15:
- if(!v8)
- {
- LABEL_23:
- if(!bg::detail::PageHeap::GrowHeap(page_count))
- {
- LABEL_24:
- return 0LL;
- }
- if(page_count <= 0x7F)
- {
- v18 = &this->m_free_lists[page_count];
- if(v18 != this->m_free_lists[page_count].m_next)
- {
- LABEL_51:
- v8 = v18->m_next;
- v29 = v8->m_prev;
- v30 = v8->m_page_count;
- v29->m_next = v8->m_next;
- v31 = v30 - page_count;
- v8->m_next->m_prev = v29;
- v8->m_prev = 0LL;
- v8->m_next = 0LL;
- if(v31)
- {
- m_free_area = (bg::detail::Span*)this->m_span_allocator.m_free_list;
- v43 = v8->m_start_page;
- if(m_free_area)
- {
- this->m_span_allocator.m_free_list = *(void**)&m_free_area->m_in_use;
- }
- else
- {
- v48 = this->m_span_allocator.m_free_left;
- if(v48 <= 0x37)
- {
- v60 = v8->m_start_page;
- v65[0] = 0x20000LL;
- v52 = (bg::detail::Span*)bg::detail::ShmAllocateRawMemory(
- (size_t*)v65,
- v43);
- if(!v52)
- goto LABEL_52;
- v53 = v65[0];
- m_free_area = v52;
- v43 = v60;
- this->m_span_allocator.m_free_area = (char*)&v52[1];
- this->m_span_allocator.m_free_left = v53 - 56;
- }
- else
- {
- m_free_area = (bg::detail::Span*)this->m_span_allocator.m_free_area;
- this->m_span_allocator.m_free_left = v48 - 56;
- this->m_span_allocator.m_free_area = (char*)&m_free_area[1];
- if(!m_free_area)
- goto LABEL_52;
- }
- }
- m_free_area->m_in_use = 0;
- m_free_area->m_size_class = -1;
- m_free_area->m_used_count = 0LL;
- m_free_area->m_start_page = v43 + page_count;
- m_free_area->m_page_count = v31;
- m_free_area->m_prev = 0LL;
- m_free_area->m_next = 0LL;
- m_free_area->m_chunk_list = 0LL;
- if(v43 + page_count > 0x7FFFFFFFFLL)
- {
- v57 = m_free_area;
- m_free_area = v57;
- v31 = v57->m_page_count;
- }
- else
- {
- this->m_span_map.lv0[(v43 + page_count) >> 25]->lv1[((v43 + page_count) >> 15) & 0x3FF]->lv2[(v43 + page_count) & 0x7FFF] = m_free_area;
- }
- if(v31 <= 1
- || ((v44 = v31 + m_free_area->m_start_page - 1, v44 > 0x7FFFFFFFFLL)
- ? (bg::detail::Span*)(v62 = m_free_area,
- m_free_area = v62,
- v31 = v62->m_page_count)
- : (this->m_span_map.lv0[v44 >> 25]->lv1[((v31 + m_free_area->m_start_page - 1) >> 15) & 0x3FF]->lv2[v44 & 0x7FFF] = m_free_area),
- v31 <= 0x7F))
- {
- v7 = &this->m_free_lists[v31];
- }
- goto LABEL_47;
- }
- LABEL_52:
- v8->m_in_use = 1;
- return v8;
- }
- v19 = &this->m_free_lists[page_count + 1];
- while(v19 != p_m_large_list)
- {
- v18 = v19++;
- if(v18 != v19[-1].m_next)
- goto LABEL_51;
- }
- }
- v20 = this->m_large_list.m_next;
- if(p_m_large_list == v20)
- goto LABEL_24;
- v8 = 0LL;
- do
- {
- while(page_count > v20->m_page_count || v8 && v20->m_start_page >= v8->m_start_page)
- {
- v20 = v20->m_next;
- if(p_m_large_list == v20)
- goto LABEL_37;
- }
- v8 = v20;
- v20 = v20->m_next;
- } while(p_m_large_list != v20);
- LABEL_37:
- if(!v8)
- goto LABEL_24;
- v21 = v8->m_prev;
- v22 = v8->m_page_count;
- v21->m_next = v8->m_next;
- v23 = v22 - page_count;
- v8->m_next->m_prev = v21;
- v8->m_prev = 0LL;
- v8->m_next = 0LL;
- if(v23)
- {
- m_free_area = (bg::detail::Span*)this->m_span_allocator.m_free_list;
- v25 = v8->m_start_page;
- if(m_free_area)
- {
- this->m_span_allocator.m_free_list = *(void**)&m_free_area->m_in_use;
- goto LABEL_41;
- }
- v45 = this->m_span_allocator.m_free_left;
- if(v45 <= 0x37)
- {
- v63 = v8->m_start_page;
- v65[0] = 0x20000LL;
- v54 = (bg::detail::Span*)bg::detail::ShmAllocateRawMemory(
- (size_t*)v65,
- v25);
- if(v54)
- {
- v55 = v65[0];
- m_free_area = v54;
- v25 = v63;
- this->m_span_allocator.m_free_area = (char*)&v54[1];
- this->m_span_allocator.m_free_left = v55 - 56;
- goto LABEL_41;
- }
- }
- else
- {
- m_free_area = (bg::detail::Span*)this->m_span_allocator.m_free_area;
- this->m_span_allocator.m_free_left = v45 - 56;
- this->m_span_allocator.m_free_area = (char*)&m_free_area[1];
- if(m_free_area)
- {
- LABEL_41:
- m_free_area->m_in_use = 0;
- m_free_area->m_size_class = -1;
- m_free_area->m_used_count = 0LL;
- m_free_area->m_start_page = v25 + page_count;
- m_free_area->m_page_count = v23;
- m_free_area->m_prev = 0LL;
- m_free_area->m_next = 0LL;
- m_free_area->m_chunk_list = 0LL;
- if(v25 + page_count > 0x7FFFFFFFFLL)
- {
- v61 = m_free_area;
- m_free_area = v61;
- v23 = v61->m_page_count;
- }
- else
- {
- this->m_span_map.lv0[(v25 + page_count) >> 25]->lv1[((v25 + page_count) >> 15) & 0x3FF]->lv2[(v25 + page_count) & 0x7FFF] = m_free_area;
- }
- if(v23 <= 1
- || ((v26 = v23 + m_free_area->m_start_page - 1, v26 > 0x7FFFFFFFFLL)
- ? (bg::detail::Span*)(v64 = m_free_area,
- m_free_area = v64,
- v23 = v64->m_page_count)
- : (this->m_span_map.lv0[v26 >> 25]->lv1[((v23 + m_free_area->m_start_page - 1) >> 15) & 0x3FF]->lv2[v26 & 0x7FFF] = m_free_area),
- v23 <= 0x7F))
- {
- v7 = &this->m_free_lists[v23];
- }
- LABEL_47:
- v27 = v7->m_next;
- m_free_area->m_prev = v7;
- m_free_area->m_next = v27;
- v7->m_next->m_prev = m_free_area;
- v7->m_next = m_free_area;
- v8->m_page_count = page_count;
- if(page_count)
- {
- v28 = page_count + v8->m_start_page - 1;
- }
- else
- {
- v28 = v8->m_start_page;
- }
- if(v28 > 0x7FFFFFFFFLL)
- {
- }
- else
- this->m_span_map.lv0[v28 >> 25]->lv1[(v28 >> 15) & 0x3FF]->lv2[v28 & 0x7FFF] = v8;
- goto LABEL_52;
- }
- }
- }
- goto LABEL_52;
- }
- v10 = v8->m_prev;
- v11 = v8->m_page_count;
- v10->m_next = v8->m_next;
- v12 = v11 - page_count;
- v8->m_next->m_prev = v10;
- v8->m_prev = 0LL;
- v8->m_next = 0LL;
- if(!v12)
- goto LABEL_17;
- v38 = (bg::detail::Span*)this->m_span_allocator.m_free_list;
- v39 = v8->m_start_page;
- if(v38)
- {
- this->m_span_allocator.m_free_list = *(void**)&v38->m_in_use;
- goto LABEL_69;
- }
- v47 = this->m_span_allocator.m_free_left;
- if(v47 <= 0x37)
- {
- v56 = v8->m_start_page;
- v59 = v12;
- v65[0] = 0x20000LL;
- v51 = (bg::detail::Span*)bg::detail::ShmAllocateRawMemory(
- (size_t*)v65,
- v39);
- if(v51)
- {
- v38 = v51;
- v12 = v59;
- v39 = v56;
- this->m_span_allocator.m_free_area = (char*)&v51[1];
- this->m_span_allocator.m_free_left = v65[0] - 56;
- goto LABEL_69;
- }
- }
- else
- {
- v38 = (bg::detail::Span*)this->m_span_allocator.m_free_area;
- this->m_span_allocator.m_free_left = v47 - 56;
- this->m_span_allocator.m_free_area = (char*)&v38[1];
- if(v38)
- {
- LABEL_69:
- v38->m_in_use = 0;
- v38->m_size_class = -1;
- v38->m_used_count = 0LL;
- v38->m_start_page = v39 + page_count;
- v38->m_page_count = v12;
- v38->m_prev = 0LL;
- v38->m_next = 0LL;
- v38->m_chunk_list = 0LL;
- if(v39 + page_count > 0x7FFFFFFFFLL)
- {
- v12 = v38->m_page_count;
- }
- else
- {
- this->m_span_map.lv0[(v39 + page_count) >> 25]->lv1[((v39 + page_count) >> 15) & 0x3FF]->lv2[(v39 + page_count) & 0x7FFF] = v38;
- }
- if(v12 <= 1
- || ((v40 = v12 + v38->m_start_page - 1, v40 > 0x7FFFFFFFFLL)
- ? (bg::detail::Span*)(
- v12 = v38->m_page_count)
- : (this->m_span_map.lv0[v40 >> 25]->lv1[((v12 + v38->m_start_page - 1) >> 15) & 0x3FF]->lv2[v40 & 0x7FFF] = v38),
- v12 <= 0x7F))
- {
- v7 = &this->m_free_lists[v12];
- }
- v41 = v7->m_next;
- v38->m_prev = v7;
- v38->m_next = v41;
- v7->m_next->m_prev = v38;
- v7->m_next = v38;
- v8->m_page_count = page_count;
- if(page_count)
- {
- v42 = page_count + v8->m_start_page - 1;
- }
- else
- {
- v42 = v8->m_start_page;
- }
- if(v42 > 0x7FFFFFFFFLL)
- {
- }
- else
- this->m_span_map.lv0[v42 >> 25]->lv1[(v42 >> 15) & 0x3FF]->lv2[v42 & 0x7FFF] = v8;
- }
- }
- LABEL_17:
- v8->m_in_use = 1;
- return v8;
- }
- }
- }
|