page.cc 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863
  1. #include "page.h"
  2. #include "shm_helper.h"
  3. #include "size_map.h"
  4. #include "shm_config.h"
  5. namespace bg
  6. {
  7. namespace detail
  8. {
  9. PageHeap::PageHeap()
  10. {
  11. }
  12. void PageHeap::DeallocateSpan(bg::detail::Span* s)
  13. {
  14. size_t m_start_page; // r12
  15. size_t m_page_count; // r14
  16. bg::detail::RadixTree<10ul, 10ul, 15ul>::NodeV1* v6; // rax
  17. bg::detail::RadixTree<10ul, 10ul, 15ul>::NodeV2* v7; // rax
  18. void** v8; // rdx
  19. size_t v9; // rax
  20. size_t v10; // rcx
  21. uintptr_t* v11; // rdi
  22. void* v12; // r8
  23. unsigned __int64 v13; // r12
  24. bg::detail::RadixTree<10ul, 10ul, 15ul>::NodeV1* v14; // rcx
  25. bg::detail::RadixTree<10ul, 10ul, 15ul>::NodeV2* v15; // rdx
  26. void** v16; // rdx
  27. size_t v17; // rax
  28. uintptr_t* v18; // rcx
  29. void* v19; // rsi
  30. size_t v20; // rax
  31. bg::detail::Span* p_m_large_list; // rdx
  32. bg::detail::Span* m_next; // rax
  33. m_start_page = s->m_start_page;
  34. s->m_in_use = 0;
  35. m_page_count = s->m_page_count;
  36. if(!m_start_page)
  37. goto LABEL_9;
  38. if(m_start_page - 1 > 0x7FFFFFFFFLL)
  39. {
  40. goto LABEL_24;
  41. }
  42. v6 = this->m_span_map.lv0[(m_start_page - 1) >> 25];
  43. if(!v6 || (v7 = v6->lv1[((m_start_page - 1) >> 15) & 0x3FF]) == 0LL)
  44. {
  45. LABEL_9:
  46. v9 = s->m_page_count;
  47. goto LABEL_10;
  48. }
  49. v8 = (void**)v7->lv2[((int64_t)m_start_page - 1) & 0x7FFF];
  50. v9 = s->m_page_count;
  51. if(v8 && *(char*)v8 != 1)
  52. {
  53. v10 = m_start_page - (size_t)v8[3];
  54. v11 = (uintptr_t*)v8[4];
  55. v12 = v8[5];
  56. s->m_start_page = v10;
  57. v9 = (size_t)v8[3] + m_page_count;
  58. s->m_page_count = v9;
  59. v11[5] = (uintptr_t)v12;
  60. *((uintptr_t*)v8[5] + 4) = (uintptr_t)v11;
  61. v8[4] = 0LL;
  62. v8[5] = 0LL;
  63. *v8 = this->m_span_allocator.m_free_list;
  64. this->m_span_allocator.m_free_list = v8;
  65. if(v10 <= 0x7FFFFFFFFLL)
  66. {
  67. this->m_span_map.lv0[v10 >> 25]->lv1[(v10 >> 15) & 0x3FF]->lv2[v10 & 0x7FFF] = s;
  68. goto LABEL_10;
  69. }
  70. LABEL_24:
  71. v9 = s->m_page_count;
  72. }
  73. LABEL_10:
  74. v13 = m_page_count + m_start_page;
  75. if(v13 <= 0x7FFFFFFFFLL)
  76. {
  77. v14 = this->m_span_map.lv0[v13 >> 25];
  78. if(v14)
  79. {
  80. v15 = v14->lv1[(v13 >> 15) & 0x3FF];
  81. if(v15)
  82. {
  83. v16 = (void**)v15->lv2[v13 & 0x7FFF];
  84. if(v16)
  85. {
  86. if(*(char*)v16 != 1)
  87. {
  88. v17 = (size_t)v16[3] + v9;
  89. v18 = (uintptr_t*)v16[4];
  90. v19 = v16[5];
  91. s->m_page_count = v17;
  92. v18[5] = (uintptr_t)v19;
  93. *((uintptr_t*)v16[5] + 4) = (uintptr_t)v18;
  94. v16[4] = 0LL;
  95. v16[5] = 0LL;
  96. *v16 = this->m_span_allocator.m_free_list;
  97. this->m_span_allocator.m_free_list = v16;
  98. if(v17)
  99. {
  100. v20 = v17 + s->m_start_page - 1;
  101. }
  102. else
  103. {
  104. SHM_ASSERT(m_page_count > 0);
  105. v20 = s->m_start_page;
  106. }
  107. if(v20 > 0x7FFFFFFFFLL)
  108. {
  109. }
  110. else
  111. this->m_span_map.lv0[v20 >> 25]->lv1[(v20 >> 15) & 0x3FF]->lv2[v20 & 0x7FFF] = s;
  112. v9 = s->m_page_count;
  113. }
  114. }
  115. }
  116. }
  117. }
  118. p_m_large_list = &this->m_large_list;
  119. if(v9 <= 0x7F)
  120. p_m_large_list = &this->m_free_lists[v9];
  121. m_next = p_m_large_list->m_next;
  122. s->m_prev = p_m_large_list;
  123. s->m_next = m_next;
  124. p_m_large_list->m_next->m_prev = s;
  125. p_m_large_list->m_next = s;
  126. }
  127. void PageHeap::RegisterSpan(bg::detail::Span* s)
  128. {
  129. int64_t v2; // rbx
  130. size_t v3; // r13
  131. size_t v4; // rax
  132. v2 = 1LL;
  133. v3 = s->m_page_count - 1;
  134. if(v3 > 1)
  135. {
  136. do
  137. {
  138. while(1)
  139. {
  140. v4 = s->m_start_page + v2;
  141. if(v4 > 0x7FFFFFFFFLL)
  142. break;
  143. ++v2;
  144. this->m_span_map.lv0[v4 >> 25]->lv1[(v4 >> 15) & 0x3FF]->lv2[v4 & 0x7FFF] = s;
  145. if(v3 == v2)
  146. return;
  147. }
  148. ++v2;
  149. } while(v3 != v2);
  150. }
  151. }
  152. bool PageHeap::GrowHeap(size_t page_count)
  153. {
  154. __int64 result; // rax
  155. unsigned __int64 v3; // rdx
  156. const char* RawMemory; // r9
  157. size_t m_page_count; // rbx
  158. size_t v8; // r14
  159. unsigned __int64* v9; // r11
  160. unsigned __int64 v10; // r12
  161. __int16 v11; // r10
  162. unsigned __int64 v12; // rdx
  163. __int64 v13; // r10
  164. uintptr_t* v14; // rax
  165. void* v15; // rax
  166. bg::detail::Span* m_free_list; // r12
  167. unsigned __int64 v17; // rax
  168. size_t m_free_left; // rax
  169. bg::detail::Span* v19; // rax
  170. __int64 v20; // rcx
  171. __int64 v21; // [rsp-20h] [rbp-68h]
  172. __int64 v22; // [rsp-20h] [rbp-68h]
  173. unsigned __int64* v23; // [rsp-18h] [rbp-60h]
  174. unsigned __int64* v24; // [rsp-18h] [rbp-60h]
  175. const char* v25; // [rsp-10h] [rbp-58h]
  176. const char* v26; // [rsp-10h] [rbp-58h]
  177. const char* v27; // [rsp-8h] [rbp-50h]
  178. size_t real_bytes; // [rsp+0h] [rbp-48h] BYREF
  179. size_t v29; // [rsp+8h] [rbp-40h] BYREF
  180. size_t page{};
  181. result = 0LL;
  182. if(page_count > 0x800000000LL)
  183. return false;
  184. if(page_count > 0x7F)
  185. {
  186. real_bytes = PAGES_TO_BYTES(page_count);
  187. RawMemory = (const char*)bg::detail::ShmAllocateRawMemory(
  188. (size_t*)&real_bytes,
  189. 0x2000);
  190. if(!RawMemory)
  191. return false;
  192. }
  193. else
  194. {
  195. real_bytes = 0x100000LL;
  196. RawMemory = (const char*)bg::detail::ShmAllocateRawMemory(
  197. &real_bytes, 0x2000);
  198. if(!RawMemory)
  199. {
  200. real_bytes = PAGES_TO_BYTES(page_count);
  201. RawMemory = (const char*)bg::detail::ShmAllocateRawMemory(
  202. &real_bytes, 0x2000);
  203. if(!RawMemory)
  204. {
  205. return false;
  206. }
  207. }
  208. }
  209. page = (unsigned __int64)RawMemory >> 13;
  210. m_page_count = BYTES_TO_PAGES(real_bytes);
  211. v8 = ((unsigned __int64)RawMemory >> 13) + (real_bytes >> 13);
  212. if(page >= v8)
  213. {
  214. LABEL_23:
  215. m_free_list = (bg::detail::Span*)this->m_span_allocator.m_free_list;
  216. if(m_free_list)
  217. {
  218. LABEL_25:
  219. new (m_free_list) bg::detail::Span();
  220. m_free_list->m_page_count = m_page_count;
  221. m_free_list->m_start_page = page;
  222. if(page > ShmConfig::MAX_PAGE_COUNT)
  223. {
  224. SHM_ASSERT(page < ShmConfig::MAX_PAGE_COUNT);
  225. m_page_count = m_free_list->m_page_count;
  226. }
  227. else
  228. {
  229. this->m_span_map.lv0[PTR_TO_LV0(page)]->lv1[PTR_TO_LV1(page)]->lv2[PTR_TO_LV0(page)] = m_free_list;
  230. }
  231. if(m_page_count > 1)
  232. {
  233. page = m_page_count + m_free_list->m_start_page - 1;
  234. if(page > ShmConfig::MAX_PAGE_COUNT)
  235. {
  236. SHM_ASSERT(page < ShmConfig::MAX_PAGE_COUNT);
  237. }
  238. else
  239. {
  240. this->m_span_map.lv0[PTR_TO_LV0(page)]->lv1[PTR_TO_LV1(page)]->lv2[PTR_TO_LV0(page)] = m_free_list;
  241. }
  242. }
  243. m_free_list->m_in_use = 1;
  244. this->DeallocateSpan(m_free_list);
  245. return true;
  246. }
  247. m_free_left = this->m_span_allocator.m_free_left;
  248. if(m_free_left <= 0x37)
  249. {
  250. v27 = RawMemory;
  251. v29 = 0x20000LL;
  252. v19 = (bg::detail::Span*)bg::detail::ShmAllocateRawMemory(
  253. &v29,
  254. 0x20000LL);
  255. if(v19)
  256. {
  257. v20 = v29;
  258. m_free_list = v19;
  259. this->m_span_allocator.m_free_area = (char*)&v19[1];
  260. this->m_span_allocator.m_free_left = v20 - 56;
  261. goto LABEL_25;
  262. }
  263. }
  264. else
  265. {
  266. m_free_list = (bg::detail::Span*)this->m_span_allocator.m_free_area;
  267. this->m_span_allocator.m_free_left = m_free_left - 56;
  268. this->m_span_allocator.m_free_area = (char*)&m_free_list[1];
  269. if(m_free_list)
  270. goto LABEL_25;
  271. }
  272. return false;
  273. }
  274. if((unsigned __int64)RawMemory >> 48)
  275. {
  276. goto FAIL;
  277. }
  278. v3 = (unsigned __int64)RawMemory >> 13;
  279. do
  280. {
  281. v9 = (unsigned __int64*)&this->m_span_map.lv0[v3 >> 25];
  282. v10 = v3 >> 15;
  283. v11 = v3 >> 15;
  284. v12 = *v9;
  285. v13 = v11 & 0x3FF;
  286. if(m_span_map.lv0[v3 >> 25])
  287. {
  288. if(m_span_map.lv0[v3 >> 25]->lv1[v13])
  289. {
  290. goto LABEL_9;
  291. }
  292. }
  293. else
  294. {
  295. v21 = v13;
  296. v23 = v9;
  297. v25 = RawMemory;
  298. v29 = sizeof(RadixTree::NodeV1);
  299. v14 = (uintptr_t*)bg::detail::ShmAllocateRawMemory(
  300. &v29, sizeof(RadixTree::NodeV1));
  301. RawMemory = v25;
  302. v9 = v23;
  303. v13 = v21;
  304. if(!v14)
  305. break;
  306. m_span_map.lv0[v3 >> 25] = (RadixTree::NodeV1*)v14;
  307. new (v14) RadixTree();
  308. v12 = *v23;
  309. if(m_span_map.lv0[v3 >> 25]->lv1[v21])
  310. goto LABEL_9;
  311. }
  312. v22 = v13;
  313. v24 = v9;
  314. v26 = RawMemory;
  315. v29 = sizeof(RadixTree::NodeV2);
  316. v15 = (void*)bg::detail::ShmAllocateRawMemory(&v29, sizeof(RadixTree::NodeV2));
  317. if(!v15)
  318. break;
  319. m_span_map.lv0[v3 >> 25]->lv1[v22] = (RadixTree::NodeV2*)v15;
  320. new (v15) RadixTree::NodeV2();
  321. LABEL_9:
  322. v3 = (v10 + 1) << 15;
  323. if(v3 >= v8)
  324. goto LABEL_23;
  325. } while(!(v3 >> 35));
  326. FAIL:
  327. SHM_ERROR("annot allocate enough space in span map, memory(%p, %#lx) leaked.", RawMemory, real_bytes);
  328. return false;
  329. }
  330. bg::detail::Span* PageHeap::AllocateSpan(size_t page_count)
  331. {
  332. bg::detail::Span* p_m_large_list; // r12
  333. bg::detail::Span* v4; // rdx
  334. bg::detail::Span* v5; // rax
  335. bg::detail::Span* v6; // rax
  336. bg::detail::Span* v7; // r15
  337. bg::detail::Span* v8; // rbx
  338. size_t v9; // rdx
  339. bg::detail::Span* v10; // rax
  340. size_t v11; // rcx
  341. unsigned __int64 v12; // rcx
  342. bg::detail::Span* m_next; // rbx
  343. bg::detail::Span* m_prev; // rax
  344. size_t m_page_count; // r12
  345. unsigned __int64 v17; // r12
  346. bg::detail::Span* v18; // rdx
  347. bg::detail::Span* v19; // rax
  348. bg::detail::Span* v20; // rax
  349. bg::detail::Span* v21; // rax
  350. size_t v22; // r12
  351. unsigned __int64 v23; // r12
  352. bg::detail::Span* m_free_area; // r10
  353. unsigned __int64 v25; // rdx
  354. unsigned __int64 v26; // rax
  355. bg::detail::Span* v27; // rax
  356. size_t v28; // rax
  357. bg::detail::Span* v29; // rax
  358. size_t v30; // r12
  359. unsigned __int64 v31; // r12
  360. bg::detail::Span* m_free_list; // r15
  361. unsigned __int64 m_start_page; // rdx
  362. unsigned __int64 v34; // rax
  363. bg::detail::Span* v35; // rax
  364. bg::detail::Span* v36; // rdx
  365. size_t v37; // rax
  366. bg::detail::Span* v38; // r12
  367. unsigned __int64 v39; // rdx
  368. unsigned __int64 v40; // rax
  369. bg::detail::Span* v41; // rax
  370. size_t v42; // rax
  371. unsigned __int64 v43; // rdx
  372. unsigned __int64 v44; // rax
  373. size_t v45; // rax
  374. size_t m_free_left; // rax
  375. size_t v47; // rax
  376. size_t v48; // rax
  377. bg::detail::Span* RawMemory; // rax
  378. __int64 v50; // rsi
  379. bg::detail::Span* v51; // rax
  380. bg::detail::Span* v52; // rax
  381. __int64 v53; // rsi
  382. bg::detail::Span* v54; // rax
  383. __int64 v55; // rsi
  384. unsigned __int64 v56; // [rsp+0h] [rbp-50h]
  385. bg::detail::Span* v57; // [rsp+8h] [rbp-48h]
  386. unsigned __int64 v58; // [rsp+8h] [rbp-48h]
  387. unsigned __int64 v59; // [rsp+8h] [rbp-48h]
  388. unsigned __int64 v60; // [rsp+8h] [rbp-48h]
  389. bg::detail::Span* v61; // [rsp+8h] [rbp-48h]
  390. bg::detail::Span* v62; // [rsp+8h] [rbp-48h]
  391. unsigned __int64 v63; // [rsp+8h] [rbp-48h]
  392. bg::detail::Span* v64; // [rsp+8h] [rbp-48h]
  393. __int64 v65[7]; // [rsp+18h] [rbp-38h] BYREF
  394. p_m_large_list = &this->m_large_list;
  395. if(page_count <= 0x7F)
  396. {
  397. v4 = &this->m_free_lists[page_count];
  398. if(v4 == this->m_free_lists[page_count].m_next)
  399. {
  400. p_m_large_list = &this->m_large_list;
  401. v5 = &this->m_free_lists[page_count + 1];
  402. while(v5 != p_m_large_list)
  403. {
  404. v4 = v5++;
  405. if(v4 != v5[-1].m_next)
  406. goto LABEL_19;
  407. }
  408. goto LABEL_6;
  409. }
  410. LABEL_19:
  411. m_next = v4->m_next;
  412. m_prev = m_next->m_prev;
  413. m_page_count = m_next->m_page_count;
  414. m_prev->m_next = m_next->m_next;
  415. v17 = m_page_count - page_count;
  416. m_next->m_next->m_prev = m_prev;
  417. m_next->m_prev = 0LL;
  418. m_next->m_next = 0LL;
  419. if(!v17)
  420. {
  421. LABEL_20:
  422. m_next->m_in_use = 1;
  423. return m_next;
  424. }
  425. m_free_list = (bg::detail::Span*)this->m_span_allocator.m_free_list;
  426. m_start_page = m_next->m_start_page;
  427. if(m_free_list)
  428. {
  429. this->m_span_allocator.m_free_list = *(void**)&m_free_list->m_in_use;
  430. }
  431. else
  432. {
  433. m_free_left = this->m_span_allocator.m_free_left;
  434. if(m_free_left <= 0x37)
  435. {
  436. v58 = m_next->m_start_page;
  437. v65[0] = 0x20000LL;
  438. RawMemory = (bg::detail::Span*)bg::detail::ShmAllocateRawMemory((size_t*)v65,
  439. 0x20000LL);
  440. if(!RawMemory)
  441. goto LABEL_20;
  442. v50 = v65[0];
  443. m_free_list = RawMemory;
  444. m_start_page = v58;
  445. this->m_span_allocator.m_free_area = (char*)&RawMemory[1];
  446. this->m_span_allocator.m_free_left = v50 - 56;
  447. }
  448. else
  449. {
  450. m_free_list = (bg::detail::Span*)this->m_span_allocator.m_free_area;
  451. this->m_span_allocator.m_free_left = m_free_left - 56;
  452. this->m_span_allocator.m_free_area = (char*)&m_free_list[1];
  453. if(!m_free_list)
  454. goto LABEL_20;
  455. }
  456. }
  457. m_free_list->m_in_use = 0;
  458. m_free_list->m_size_class = -1;
  459. m_free_list->m_used_count = 0LL;
  460. m_free_list->m_start_page = m_start_page + page_count;
  461. m_free_list->m_page_count = v17;
  462. m_free_list->m_prev = 0LL;
  463. m_free_list->m_next = 0LL;
  464. m_free_list->m_chunk_list = 0LL;
  465. if(m_start_page + page_count > 0x7FFFFFFFFLL)
  466. {
  467. v17 = m_free_list->m_page_count;
  468. }
  469. else
  470. {
  471. 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;
  472. }
  473. if(v17 <= 1
  474. || ((v34 = v17 + m_free_list->m_start_page - 1, v34 > 0x7FFFFFFFFLL)
  475. ? (bg::detail::Span*)(
  476. v17 = m_free_list->m_page_count)
  477. : (this->m_span_map.lv0[v34 >> 25]->lv1[((v17 + m_free_list->m_start_page - 1) >> 15) & 0x3FF]->lv2[v34 & 0x7FFF] = m_free_list),
  478. v35 = &this->m_large_list,
  479. v17 <= 0x7F))
  480. {
  481. v35 = &this->m_free_lists[v17];
  482. }
  483. v36 = v35->m_next;
  484. m_free_list->m_prev = v35;
  485. m_free_list->m_next = v36;
  486. v35->m_next->m_prev = m_free_list;
  487. v35->m_next = m_free_list;
  488. m_next->m_page_count = page_count;
  489. if(page_count)
  490. {
  491. v37 = page_count + m_next->m_start_page - 1;
  492. }
  493. else
  494. {
  495. v37 = m_next->m_start_page;
  496. }
  497. if(v37 > 0x7FFFFFFFFLL)
  498. {
  499. }
  500. else
  501. this->m_span_map.lv0[v37 >> 25]->lv1[(v37 >> 15) & 0x3FF]->lv2[v37 & 0x7FFF] = m_next;
  502. goto LABEL_20;
  503. }
  504. LABEL_6:
  505. v6 = this->m_large_list.m_next;
  506. v7 = p_m_large_list;
  507. if(v6 == p_m_large_list)
  508. goto LABEL_23;
  509. v8 = 0LL;
  510. do
  511. {
  512. while(1)
  513. {
  514. v9 = v6->m_page_count;
  515. if(page_count <= v9)
  516. {
  517. if(!v8 || v9 < v8->m_page_count)
  518. {
  519. v8 = v6;
  520. goto LABEL_14;
  521. }
  522. if(v9 == v8->m_page_count && v6->m_start_page < v8->m_start_page)
  523. break;
  524. }
  525. v6 = v6->m_next;
  526. if(p_m_large_list == v6)
  527. goto LABEL_15;
  528. }
  529. v8 = v6;
  530. LABEL_14:
  531. v6 = v6->m_next;
  532. } while(p_m_large_list != v6);
  533. LABEL_15:
  534. if(!v8)
  535. {
  536. LABEL_23:
  537. if(!bg::detail::PageHeap::GrowHeap(page_count))
  538. {
  539. LABEL_24:
  540. return 0LL;
  541. }
  542. if(page_count <= 0x7F)
  543. {
  544. v18 = &this->m_free_lists[page_count];
  545. if(v18 != this->m_free_lists[page_count].m_next)
  546. {
  547. LABEL_51:
  548. v8 = v18->m_next;
  549. v29 = v8->m_prev;
  550. v30 = v8->m_page_count;
  551. v29->m_next = v8->m_next;
  552. v31 = v30 - page_count;
  553. v8->m_next->m_prev = v29;
  554. v8->m_prev = 0LL;
  555. v8->m_next = 0LL;
  556. if(v31)
  557. {
  558. m_free_area = (bg::detail::Span*)this->m_span_allocator.m_free_list;
  559. v43 = v8->m_start_page;
  560. if(m_free_area)
  561. {
  562. this->m_span_allocator.m_free_list = *(void**)&m_free_area->m_in_use;
  563. }
  564. else
  565. {
  566. v48 = this->m_span_allocator.m_free_left;
  567. if(v48 <= 0x37)
  568. {
  569. v60 = v8->m_start_page;
  570. v65[0] = 0x20000LL;
  571. v52 = (bg::detail::Span*)bg::detail::ShmAllocateRawMemory(
  572. (size_t*)v65,
  573. v43);
  574. if(!v52)
  575. goto LABEL_52;
  576. v53 = v65[0];
  577. m_free_area = v52;
  578. v43 = v60;
  579. this->m_span_allocator.m_free_area = (char*)&v52[1];
  580. this->m_span_allocator.m_free_left = v53 - 56;
  581. }
  582. else
  583. {
  584. m_free_area = (bg::detail::Span*)this->m_span_allocator.m_free_area;
  585. this->m_span_allocator.m_free_left = v48 - 56;
  586. this->m_span_allocator.m_free_area = (char*)&m_free_area[1];
  587. if(!m_free_area)
  588. goto LABEL_52;
  589. }
  590. }
  591. m_free_area->m_in_use = 0;
  592. m_free_area->m_size_class = -1;
  593. m_free_area->m_used_count = 0LL;
  594. m_free_area->m_start_page = v43 + page_count;
  595. m_free_area->m_page_count = v31;
  596. m_free_area->m_prev = 0LL;
  597. m_free_area->m_next = 0LL;
  598. m_free_area->m_chunk_list = 0LL;
  599. if(v43 + page_count > 0x7FFFFFFFFLL)
  600. {
  601. v57 = m_free_area;
  602. m_free_area = v57;
  603. v31 = v57->m_page_count;
  604. }
  605. else
  606. {
  607. this->m_span_map.lv0[(v43 + page_count) >> 25]->lv1[((v43 + page_count) >> 15) & 0x3FF]->lv2[(v43 + page_count) & 0x7FFF] = m_free_area;
  608. }
  609. if(v31 <= 1
  610. || ((v44 = v31 + m_free_area->m_start_page - 1, v44 > 0x7FFFFFFFFLL)
  611. ? (bg::detail::Span*)(v62 = m_free_area,
  612. m_free_area = v62,
  613. v31 = v62->m_page_count)
  614. : (this->m_span_map.lv0[v44 >> 25]->lv1[((v31 + m_free_area->m_start_page - 1) >> 15) & 0x3FF]->lv2[v44 & 0x7FFF] = m_free_area),
  615. v31 <= 0x7F))
  616. {
  617. v7 = &this->m_free_lists[v31];
  618. }
  619. goto LABEL_47;
  620. }
  621. LABEL_52:
  622. v8->m_in_use = 1;
  623. return v8;
  624. }
  625. v19 = &this->m_free_lists[page_count + 1];
  626. while(v19 != p_m_large_list)
  627. {
  628. v18 = v19++;
  629. if(v18 != v19[-1].m_next)
  630. goto LABEL_51;
  631. }
  632. }
  633. v20 = this->m_large_list.m_next;
  634. if(p_m_large_list == v20)
  635. goto LABEL_24;
  636. v8 = 0LL;
  637. do
  638. {
  639. while(page_count > v20->m_page_count || v8 && v20->m_start_page >= v8->m_start_page)
  640. {
  641. v20 = v20->m_next;
  642. if(p_m_large_list == v20)
  643. goto LABEL_37;
  644. }
  645. v8 = v20;
  646. v20 = v20->m_next;
  647. } while(p_m_large_list != v20);
  648. LABEL_37:
  649. if(!v8)
  650. goto LABEL_24;
  651. v21 = v8->m_prev;
  652. v22 = v8->m_page_count;
  653. v21->m_next = v8->m_next;
  654. v23 = v22 - page_count;
  655. v8->m_next->m_prev = v21;
  656. v8->m_prev = 0LL;
  657. v8->m_next = 0LL;
  658. if(v23)
  659. {
  660. m_free_area = (bg::detail::Span*)this->m_span_allocator.m_free_list;
  661. v25 = v8->m_start_page;
  662. if(m_free_area)
  663. {
  664. this->m_span_allocator.m_free_list = *(void**)&m_free_area->m_in_use;
  665. goto LABEL_41;
  666. }
  667. v45 = this->m_span_allocator.m_free_left;
  668. if(v45 <= 0x37)
  669. {
  670. v63 = v8->m_start_page;
  671. v65[0] = 0x20000LL;
  672. v54 = (bg::detail::Span*)bg::detail::ShmAllocateRawMemory(
  673. (size_t*)v65,
  674. v25);
  675. if(v54)
  676. {
  677. v55 = v65[0];
  678. m_free_area = v54;
  679. v25 = v63;
  680. this->m_span_allocator.m_free_area = (char*)&v54[1];
  681. this->m_span_allocator.m_free_left = v55 - 56;
  682. goto LABEL_41;
  683. }
  684. }
  685. else
  686. {
  687. m_free_area = (bg::detail::Span*)this->m_span_allocator.m_free_area;
  688. this->m_span_allocator.m_free_left = v45 - 56;
  689. this->m_span_allocator.m_free_area = (char*)&m_free_area[1];
  690. if(m_free_area)
  691. {
  692. LABEL_41:
  693. m_free_area->m_in_use = 0;
  694. m_free_area->m_size_class = -1;
  695. m_free_area->m_used_count = 0LL;
  696. m_free_area->m_start_page = v25 + page_count;
  697. m_free_area->m_page_count = v23;
  698. m_free_area->m_prev = 0LL;
  699. m_free_area->m_next = 0LL;
  700. m_free_area->m_chunk_list = 0LL;
  701. if(v25 + page_count > 0x7FFFFFFFFLL)
  702. {
  703. v61 = m_free_area;
  704. m_free_area = v61;
  705. v23 = v61->m_page_count;
  706. }
  707. else
  708. {
  709. this->m_span_map.lv0[(v25 + page_count) >> 25]->lv1[((v25 + page_count) >> 15) & 0x3FF]->lv2[(v25 + page_count) & 0x7FFF] = m_free_area;
  710. }
  711. if(v23 <= 1
  712. || ((v26 = v23 + m_free_area->m_start_page - 1, v26 > 0x7FFFFFFFFLL)
  713. ? (bg::detail::Span*)(v64 = m_free_area,
  714. m_free_area = v64,
  715. v23 = v64->m_page_count)
  716. : (this->m_span_map.lv0[v26 >> 25]->lv1[((v23 + m_free_area->m_start_page - 1) >> 15) & 0x3FF]->lv2[v26 & 0x7FFF] = m_free_area),
  717. v23 <= 0x7F))
  718. {
  719. v7 = &this->m_free_lists[v23];
  720. }
  721. LABEL_47:
  722. v27 = v7->m_next;
  723. m_free_area->m_prev = v7;
  724. m_free_area->m_next = v27;
  725. v7->m_next->m_prev = m_free_area;
  726. v7->m_next = m_free_area;
  727. v8->m_page_count = page_count;
  728. if(page_count)
  729. {
  730. v28 = page_count + v8->m_start_page - 1;
  731. }
  732. else
  733. {
  734. v28 = v8->m_start_page;
  735. }
  736. if(v28 > 0x7FFFFFFFFLL)
  737. {
  738. }
  739. else
  740. this->m_span_map.lv0[v28 >> 25]->lv1[(v28 >> 15) & 0x3FF]->lv2[v28 & 0x7FFF] = v8;
  741. goto LABEL_52;
  742. }
  743. }
  744. }
  745. goto LABEL_52;
  746. }
  747. v10 = v8->m_prev;
  748. v11 = v8->m_page_count;
  749. v10->m_next = v8->m_next;
  750. v12 = v11 - page_count;
  751. v8->m_next->m_prev = v10;
  752. v8->m_prev = 0LL;
  753. v8->m_next = 0LL;
  754. if(!v12)
  755. goto LABEL_17;
  756. v38 = (bg::detail::Span*)this->m_span_allocator.m_free_list;
  757. v39 = v8->m_start_page;
  758. if(v38)
  759. {
  760. this->m_span_allocator.m_free_list = *(void**)&v38->m_in_use;
  761. goto LABEL_69;
  762. }
  763. v47 = this->m_span_allocator.m_free_left;
  764. if(v47 <= 0x37)
  765. {
  766. v56 = v8->m_start_page;
  767. v59 = v12;
  768. v65[0] = 0x20000LL;
  769. v51 = (bg::detail::Span*)bg::detail::ShmAllocateRawMemory(
  770. (size_t*)v65,
  771. v39);
  772. if(v51)
  773. {
  774. v38 = v51;
  775. v12 = v59;
  776. v39 = v56;
  777. this->m_span_allocator.m_free_area = (char*)&v51[1];
  778. this->m_span_allocator.m_free_left = v65[0] - 56;
  779. goto LABEL_69;
  780. }
  781. }
  782. else
  783. {
  784. v38 = (bg::detail::Span*)this->m_span_allocator.m_free_area;
  785. this->m_span_allocator.m_free_left = v47 - 56;
  786. this->m_span_allocator.m_free_area = (char*)&v38[1];
  787. if(v38)
  788. {
  789. LABEL_69:
  790. v38->m_in_use = 0;
  791. v38->m_size_class = -1;
  792. v38->m_used_count = 0LL;
  793. v38->m_start_page = v39 + page_count;
  794. v38->m_page_count = v12;
  795. v38->m_prev = 0LL;
  796. v38->m_next = 0LL;
  797. v38->m_chunk_list = 0LL;
  798. if(v39 + page_count > 0x7FFFFFFFFLL)
  799. {
  800. v12 = v38->m_page_count;
  801. }
  802. else
  803. {
  804. this->m_span_map.lv0[(v39 + page_count) >> 25]->lv1[((v39 + page_count) >> 15) & 0x3FF]->lv2[(v39 + page_count) & 0x7FFF] = v38;
  805. }
  806. if(v12 <= 1
  807. || ((v40 = v12 + v38->m_start_page - 1, v40 > 0x7FFFFFFFFLL)
  808. ? (bg::detail::Span*)(
  809. v12 = v38->m_page_count)
  810. : (this->m_span_map.lv0[v40 >> 25]->lv1[((v12 + v38->m_start_page - 1) >> 15) & 0x3FF]->lv2[v40 & 0x7FFF] = v38),
  811. v12 <= 0x7F))
  812. {
  813. v7 = &this->m_free_lists[v12];
  814. }
  815. v41 = v7->m_next;
  816. v38->m_prev = v7;
  817. v38->m_next = v41;
  818. v7->m_next->m_prev = v38;
  819. v7->m_next = v38;
  820. v8->m_page_count = page_count;
  821. if(page_count)
  822. {
  823. v42 = page_count + v8->m_start_page - 1;
  824. }
  825. else
  826. {
  827. v42 = v8->m_start_page;
  828. }
  829. if(v42 > 0x7FFFFFFFFLL)
  830. {
  831. }
  832. else
  833. this->m_span_map.lv0[v42 >> 25]->lv1[(v42 >> 15) & 0x3FF]->lv2[v42 & 0x7FFF] = v8;
  834. }
  835. }
  836. LABEL_17:
  837. v8->m_in_use = 1;
  838. return v8;
  839. }
  840. }
  841. }