mem_win32.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:17k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************
  2.  *
  3.  * This program is free software ; you can redistribute it and/or modify
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  8.  * This program is distributed in the hope that it will be useful,
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11.  * GNU General Public License for more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16.  *
  17.  * $Id: mem_win32.c 430 2005-12-28 14:50:08Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #include "../common.h"
  24. #if defined(TARGET_WIN32) || defined(TARGET_WINCE)
  25. //#define FIND 0xCF9390
  26. //#define SAFEGUARD 32
  27. #define BLOCKGROUP 8
  28. #ifndef STRICT
  29. #define STRICT
  30. #endif
  31. #include <windows.h>
  32. #if defined(_MSC_VER) && !defined(TARGET_WINCE)
  33. #include <crtdbg.h>
  34. #endif
  35. #if defined(TARGET_WINCE)
  36. #define MAXPHY 16
  37. #define CACHE_SYNC_INSTRUCTIONS 2
  38. #define LOCKFLAG_WRITE 1
  39. #define TBL_CACHE 0x08
  40. #define TBL_BUFFER 0x04
  41. typedef struct phymem
  42. {
  43. char* Virt;
  44. uint32_t Phy; 
  45. uint32_t Length;
  46. uint32_t RefCount;
  47. phymemblock* Blocks;
  48. int BlockCount;
  49. } phymem;
  50. static phymem PhyMem[MAXPHY] = { 0 };
  51. static BOOL (WINAPI* FuncVirtualSetAttributes)(LPVOID lpvAddress, DWORD cbSize, DWORD dwNewFlags, DWORD dwMask, LPDWORD lpdwOldFlags) = NULL;
  52. static BOOL (WINAPI* FuncFreePhysMem)(LPVOID) = NULL;
  53. static BOOL (WINAPI* FuncLockPages)(LPVOID lpvAddress,DWORD cbSize,PDWORD pPFNs,int fOptions) = NULL;
  54. static BOOL (WINAPI* FuncUnlockPages)(LPVOID lpvAddress,DWORD cbSize) = NULL;
  55. static LPVOID (WINAPI* FuncAllocPhysMem)(DWORD cbSize, DWORD fdwProtect, DWORD dwAlignmentMask, DWORD dwFlags, PULONG pPhysicalAddress) = NULL;
  56. static void (WINAPI* FuncCacheSync)(DWORD) = NULL;
  57. static BOOL (WINAPI* FuncVirtualCopy)(LPVOID, LPVOID, DWORD, DWORD) = NULL;
  58. static HMODULE CoreDLL = NULL;
  59. #endif
  60. typedef struct blockgroup
  61. {
  62. block Block;
  63. int Mask;
  64. int Unused; //align to 16bytes
  65. } blockgroup;
  66. static int PageSize = 4096;
  67. static array BlockGroup = { NULL };
  68. #ifndef NDEBUG
  69. static int BlockAllocated = 0;
  70. #endif
  71. void* PhyMemAlloc(int Length,phymemblock* Blocks,int* BlockCount)
  72. {
  73. void* p = NULL;
  74. #if defined(TARGET_WINCE)
  75. if (*BlockCount>=1)
  76. {
  77. int n,Pos;
  78. int Count = 0;
  79. Length = (Length + PageSize-1) & ~(PageSize-1);
  80. if (FuncAllocPhysMem && FuncFreePhysMem && FuncVirtualCopy)
  81. {
  82. // try allocate in one continous block
  83. Blocks[0].Private = FuncAllocPhysMem(Length,PAGE_READWRITE,PageSize-1,0,&Blocks[0].Addr);
  84. if (Blocks[0].Private)
  85. {
  86. Blocks[0].Length = Length;
  87. Count = 1;
  88. }
  89. /* not worth it. allocphysmem is buggy anyway. won't be able to allocate per one pagesize
  90. if (!Count && *BlockCount>1)
  91. {
  92. int Left = Length;
  93. int BlockMax;
  94. int BlockSize = (Left+PageSize-1) & ~(PageSize-1);
  95. // allocate in separate blocks
  96. while (Count < *BlockCount && BlockSize > 0)
  97. {
  98. Blocks[Count].Private = FuncAllocPhysMem(BlockSize,PAGE_READWRITE,PageSize-1,0,&Blocks[Count].Addr);
  99. if (Blocks[Count].Private)
  100. {
  101. Blocks[Count].Length = BlockSize;
  102. ++Count;
  103. Left -= BlockSize;
  104. BlockMax = (Left+PageSize-1) & ~(PageSize-1);
  105. if (BlockSize > BlockMax)
  106. BlockSize = BlockMax;
  107. }
  108. else
  109. if (BlockSize > PageSize*8)
  110. BlockSize = (BlockSize/2+PageSize-1) & ~(PageSize-1);
  111. else
  112. BlockSize -= PageSize;
  113. }
  114. if (Left>0)
  115. {
  116. for (n=0;n<Count;++n)
  117. FuncFreePhysMem(Blocks[n].Private);
  118. Count = 0;
  119. }
  120. }
  121. */
  122. if (Count)
  123. {
  124. p = VirtualAlloc(NULL,Length,MEM_RESERVE,PAGE_READWRITE);
  125. if (p)
  126. {
  127. Pos = 0;
  128. for (n=0;n<Count;++n)
  129. {
  130. if (!FuncVirtualCopy((char*)p+Pos,(LPVOID)(Blocks[n].Addr >> 8),Blocks[n].Length, PAGE_READWRITE | PAGE_PHYSICAL))
  131. break;
  132. Pos += Blocks[n].Length;
  133. }
  134. if (n!=Count)
  135. {
  136. VirtualFree(p,0,MEM_RELEASE);
  137. p = NULL;
  138. }
  139. }
  140. if (!p)
  141. {
  142. for (n=0;n<Count;++n)
  143. FuncFreePhysMem(Blocks[n].Private);
  144. Count = 0;
  145. }
  146. }
  147. }
  148. if (!p && FuncLockPages && FuncUnlockPages)
  149. {
  150. do
  151. {
  152. p = VirtualAlloc(NULL,Length,MEM_COMMIT,PAGE_READWRITE);
  153. }
  154. while (!p && Length && NodeHibernate());
  155. if (p)
  156. {
  157. int Pages = Length / PageSize;
  158. DWORD* PFN = (DWORD*) alloca(sizeof(DWORD)*Pages);
  159. if (FuncLockPages(p,Length,PFN,LOCKFLAG_WRITE))
  160. {
  161. DWORD Last = (DWORD)-1;
  162. for (n=0;n<Pages;++n)
  163. {
  164. if (PFN[n] != Last)
  165. {
  166. if (Count >= *BlockCount)
  167. {
  168. Count = 0;
  169. break;
  170. }
  171. Blocks[Count].Addr = PFN[n];
  172. Blocks[Count].Length = PageSize;
  173. Blocks[Count].Private = NULL;
  174. ++Count;
  175. }
  176. else
  177. Blocks[Count-1].Length += PageSize;
  178. Last = PFN[n] + PageSize;
  179. }
  180. if (!Count)
  181. FuncUnlockPages(p,Length);
  182. }
  183. if (!Count)
  184. {
  185. VirtualFree(p,0,MEM_RELEASE);
  186. p = NULL;
  187. }
  188. }
  189. }
  190. #ifdef ARM
  191. if (p && FuncVirtualSetAttributes && (QueryPlatform(PLATFORM_CAPS) & CAPS_ARM_XSCALE))
  192. FuncVirtualSetAttributes(p,Length,TBL_CACHE|TBL_BUFFER,TBL_CACHE|TBL_BUFFER,NULL);
  193. #endif
  194. *BlockCount = Count;
  195. }
  196. #endif
  197. return p;
  198. }
  199. void PhyMemFree(void* p,phymemblock* Blocks,int BlockCount)
  200. {
  201. #if defined(TARGET_WINCE)
  202. if (p)
  203. {
  204. int n;
  205. if (FuncLockPages && FuncUnlockPages)
  206. {
  207. int Size = 0;
  208. for (n=0;n<BlockCount;++n)
  209. {
  210. if (Blocks[n].Private)
  211. break;
  212. Size += Blocks[n].Length;
  213. }
  214. if (Size)
  215. FuncUnlockPages(p,Size);
  216. }
  217. VirtualFree(p,0,MEM_RELEASE);
  218. if (FuncAllocPhysMem && FuncFreePhysMem && FuncVirtualCopy)
  219. for (n=0;n<BlockCount;++n)
  220. if (Blocks[n].Private)
  221. FuncFreePhysMem(Blocks[n].Private);
  222. }
  223. #endif
  224. }
  225. #if defined(TARGET_WINCE)
  226. static void SafeVirtualFree(PVOID p,DWORD Size)
  227. {
  228. #ifdef ARM
  229. // O2 Atom destroys video memory and LCD descriptors unless this code... (WM5)
  230. if (FuncVirtualSetAttributes)
  231. FuncVirtualSetAttributes(p,Size,0,0xFFFFF000,NULL);
  232. #endif
  233. VirtualFree(p,0,MEM_RELEASE);
  234. }
  235. #endif
  236. void* PhyMemBeginEx(phymemblock* Blocks,int BlockCount,bool_t Cached)
  237. {
  238. #if defined(TARGET_WINCE)
  239. if (FuncVirtualCopy && Blocks && BlockCount)
  240. {
  241. int n;
  242. int Mode;
  243. phymem* p;
  244. for (p=PhyMem;p!=PhyMem+MAXPHY;++p)
  245. if (p->BlockCount == BlockCount && p->Length == Blocks[0].Length && p->Phy == Blocks[0].Addr)
  246. {
  247. for (n=1;n<BlockCount;++n)
  248. if (p->Blocks[n].Addr != Blocks[n].Addr || p->Blocks[n].Length != Blocks[n].Length)
  249. break;
  250. if (n==BlockCount)
  251. {
  252. ++p->RefCount;
  253. return p->Virt;
  254. }
  255. }
  256. if (BlockCount==1)
  257. return PhyMemBegin(Blocks[0].Addr,Blocks[0].Length,Cached);
  258. for (Mode=0;Mode<2;++Mode)
  259. for (p=PhyMem;p!=PhyMem+MAXPHY;++p)
  260. {
  261. if (Mode && !p->RefCount && p->Length)
  262. {
  263. free(p->Blocks);
  264. SafeVirtualFree(p->Virt,p->Length);
  265. memset(p,0,sizeof(phymem));
  266. }
  267. if (!p->Length)
  268. {
  269. p->Blocks = (phymemblock*) malloc(sizeof(phymemblock)*BlockCount);
  270. if (p->Blocks)
  271. {
  272. int Size = 0;
  273. for (n=0;n<BlockCount;++n)
  274. Size += Blocks[n].Length;
  275. p->BlockCount = BlockCount;
  276. p->Virt = (char*) VirtualAlloc(0, Size, MEM_RESERVE, PAGE_NOACCESS);
  277. if (p->Virt)
  278. {
  279. int Mode = PAGE_READWRITE | PAGE_PHYSICAL;
  280. char* Virt = p->Virt;
  281. if (!Cached)
  282. Mode |= PAGE_NOCACHE;
  283. for (n=0;n<BlockCount;++n)
  284. {
  285. if (!FuncVirtualCopy(Virt,(LPVOID)(Blocks[n].Addr >> 8), Blocks[n].Length,Mode))
  286. break;
  287. p->Blocks[n].Addr = Blocks[n].Addr;
  288. p->Blocks[n].Length = Blocks[n].Length;
  289. Virt += Blocks[n].Length;
  290. }
  291. if (n==BlockCount)
  292. {
  293. p->RefCount = 1;
  294. p->Phy = Blocks[0].Addr;
  295. p->Length = Blocks[0].Length;
  296. p->BlockCount = BlockCount;
  297. #ifdef ARM
  298. if (Cached && FuncVirtualSetAttributes && (QueryPlatform(PLATFORM_CAPS) & CAPS_ARM_XSCALE))
  299. FuncVirtualSetAttributes(p->Virt,Size,TBL_CACHE|TBL_BUFFER,TBL_CACHE|TBL_BUFFER,NULL);
  300. #endif
  301. return p->Virt;
  302. }
  303. VirtualFree(p->Virt,0,MEM_RELEASE);
  304. }
  305. free(p->Blocks);
  306. }
  307. memset(p,0,sizeof(phymem));
  308. return NULL;
  309. }
  310. }
  311. }
  312. #endif
  313. return NULL;
  314. }
  315. void* PhyMemBegin(uint32_t Phy,uint32_t Length,bool_t Cached)
  316. {
  317. #if defined(TARGET_WINCE)
  318. if (FuncVirtualCopy && Phy && Length)
  319. {
  320. int Mode;
  321. phymem* p;
  322. for (p=PhyMem;p!=PhyMem+MAXPHY;++p)
  323. if (p->Phy <= Phy && p->Phy+p->Length >= Phy+Length)
  324. {
  325. ++p->RefCount;
  326. return p->Virt + (Phy - p->Phy);
  327. }
  328. for (Mode=0;Mode<2;++Mode)
  329. for (p=PhyMem;p!=PhyMem+MAXPHY;++p)
  330. {
  331. if (Mode && !p->RefCount && p->Length)
  332. {
  333. free(p->Blocks);
  334. SafeVirtualFree(p->Virt,p->Length);
  335. memset(p,0,sizeof(phymem));
  336. }
  337. if (!p->Length)
  338. {
  339. int Align = Phy & 4095;
  340. Phy -= Align;
  341. Length = (Length + Align + 4095) & ~4095;
  342. p->Virt = (char*) VirtualAlloc(0, Length, MEM_RESERVE, PAGE_NOACCESS);
  343. if (p->Virt)
  344. {
  345. int Mode = PAGE_READWRITE | PAGE_PHYSICAL;
  346. if (!Cached)
  347. Mode |= PAGE_NOCACHE;
  348. if (FuncVirtualCopy(p->Virt,(LPVOID)(Phy >> 8), Length, Mode))
  349. {
  350. p->RefCount = 1;
  351. p->Phy = Phy;
  352. p->Length = Length;
  353. p->BlockCount = 1;
  354. #ifdef ARM
  355. if (Cached && FuncVirtualSetAttributes && (QueryPlatform(PLATFORM_CAPS) & CAPS_ARM_XSCALE))
  356. FuncVirtualSetAttributes(p->Virt,Length,TBL_CACHE|TBL_BUFFER,TBL_CACHE|TBL_BUFFER,NULL);
  357. #endif
  358. return p->Virt + Align;
  359. }
  360. VirtualFree(p->Virt,0,MEM_RELEASE);
  361. }
  362. return NULL;
  363. }
  364. }
  365. }
  366. #endif
  367. return NULL;
  368. }
  369. void PhyMemEnd(void* Virt)
  370. {
  371. #if defined(TARGET_WINCE)
  372. if (Virt)
  373. {
  374. phymem* p;
  375. for (p=PhyMem;p!=PhyMem+MAXPHY;++p)
  376. if (p->RefCount && p->Virt <= (char*)Virt && p->Virt+p->Length > (char*)Virt)
  377. {
  378. --p->RefCount;
  379. break;
  380. }
  381. }
  382. #endif
  383. }
  384. bool_t MemGetInfo(memoryinfo* p)
  385. {
  386. return 0;
  387. }
  388. void* CodeAlloc(int Size)
  389. {
  390. void* p;
  391. do 
  392. {
  393. p = VirtualAlloc(NULL,Size,MEM_COMMIT,PAGE_EXECUTE_READ);
  394. }
  395. while (!p && Size && NodeHibernate());
  396. return p;
  397. }
  398. void CodeFree(void* Code,int Size)
  399. {
  400. VirtualFree(Code,Size,MEM_DECOMMIT);
  401. VirtualFree(Code,0,MEM_RELEASE);
  402. }
  403. void CodeLock(void* Code,int Size)
  404. {
  405. DWORD Protect;
  406. VirtualProtect(Code,Size,PAGE_READWRITE|PAGE_NOCACHE,&Protect);
  407. }
  408. void CodeUnlock(void* Code,int Size)
  409. {
  410. DWORD Protect;
  411. VirtualProtect(Code,Size,PAGE_EXECUTE_READ,&Protect);
  412. #if defined(TARGET_WINCE)
  413. if (FuncCacheSync)
  414. FuncCacheSync(CACHE_SYNC_INSTRUCTIONS);
  415. #endif
  416. }
  417. void CodeFindPages(void* Ptr,uint8_t** PMin,uint8_t** PMax,uintptr_t* PPageSize)
  418. {
  419. uint8_t* Min;
  420. uint8_t* Max;
  421. uintptr_t PageSize = 
  422. #if defined(MIPS)
  423. 1024;
  424. #else
  425. 4096;
  426. #endif
  427. if (PPageSize)
  428. *PPageSize = PageSize;
  429. Min = Max = (uint8_t*)((uintptr_t)Ptr & ~(PageSize-1));
  430. while (!IsBadCodePtr((FARPROC)(Min-PageSize)))
  431. Min -= PageSize;
  432. while (!IsBadCodePtr((FARPROC)Max))
  433. Max += PageSize;
  434. *PMin = Min;
  435. *PMax = Max;
  436. }
  437. void CheckHeap()
  438. {
  439. #if defined(_DEBUG) && defined(_MSC_VER) && (_MSC_VER < 1400)
  440. assert(_CrtCheckMemory());
  441. #endif
  442. }
  443. //#define FIND 0xAD1A30
  444. size_t AvailMemory()
  445. {
  446. MEMORYSTATUS Status;
  447. Status.dwLength = sizeof(Status);
  448. GlobalMemoryStatus(&Status); 
  449. return Status.dwAvailPhys;
  450. }
  451. void WriteBlock(block* Block,int Ofs,const void* Src,int Length)
  452. {
  453. memcpy((uint8_t*)Block->Ptr+Ofs,Src,Length);
  454. }
  455. void FreeBlock(block* p)
  456. {
  457. if (p)
  458. {
  459. #ifdef BLOCKGROUP
  460. if (p->Id) //group
  461. {
  462. blockgroup* g = ARRAYBEGIN(BlockGroup,blockgroup)+(p->Id>>8);
  463. int Bit = 1 << ((p->Id & 255)-1);
  464. if (g<ARRAYEND(BlockGroup,blockgroup) && g->Mask & Bit)
  465. {
  466. g->Mask &= ~Bit;
  467. if (!g->Mask)
  468. FreeBlock(&g->Block);
  469. }
  470. p->Ptr = NULL;
  471. p->Id = 0;
  472. return;
  473. }
  474. #endif
  475. #ifndef NDEBUG
  476. if (VirtualFree((void*)p->Ptr,0,MEM_RELEASE))
  477. --BlockAllocated;
  478. #else
  479. VirtualFree((void*)p->Ptr,0,MEM_RELEASE);
  480. #endif
  481. p->Ptr = NULL;
  482. p->Id = 0;
  483. }
  484. }
  485. bool_t SetHeapBlock(int n,block* Block,int Heap)
  486. {
  487. return 0;
  488. }
  489. #ifdef BLOCKGROUP
  490. static bool_t AllocBlockGroup(block* Block, bool_t Optional)
  491. {
  492. int n;
  493. blockgroup* g;
  494. for (g=ARRAYBEGIN(BlockGroup,blockgroup);g!=ARRAYEND(BlockGroup,blockgroup);++g)
  495. if (g->Mask && g->Mask != (1<<BLOCKGROUP)-1)
  496. break;
  497. if (g==ARRAYEND(BlockGroup,blockgroup))
  498. {
  499. if (!Optional)
  500. return 0;
  501. for (g=ARRAYBEGIN(BlockGroup,blockgroup);g!=ARRAYEND(BlockGroup,blockgroup);++g)
  502. if (!g->Mask)
  503. break;
  504. if (g==ARRAYEND(BlockGroup,blockgroup))
  505. {
  506. if (!ArrayAppend(&BlockGroup,NULL,sizeof(blockgroup),64))
  507. return 0;
  508. g=ARRAYEND(BlockGroup,blockgroup)-1;
  509. g->Mask = 0;
  510. }
  511. if (!AllocBlock(BLOCKSIZE*BLOCKGROUP,&g->Block,1,HEAP_ANY))
  512. return 0;
  513. }
  514. for (n=0;n<BLOCKGROUP;++n)
  515. if (!(g->Mask & (1<<n)))
  516. {
  517. g->Mask |= (1<<n);
  518. Block->Id = ((g-ARRAYBEGIN(BlockGroup,blockgroup))<<8)+(n+1);
  519. Block->Ptr = g->Block.Ptr + n*BLOCKSIZE;
  520. return 1;
  521. }
  522. return 0;
  523. }
  524. #endif
  525. bool_t AllocBlock(size_t n,block* Block,bool_t Optional,int Heap)
  526. {
  527. void* p;
  528. if (Optional && AvailMemory() < (256+64)*1024+n) // we want to avoid OS low memory warning
  529. return 0;
  530. #ifdef BLOCKGROUP
  531. if (n == BLOCKSIZE && AllocBlockGroup(Block,Optional))
  532. return 1;
  533. #endif
  534. do
  535. {
  536. p = VirtualAlloc(NULL,n,MEM_COMMIT,PAGE_READWRITE);
  537. }
  538. while (!p && !Optional && n && NodeHibernate());
  539. Block->Ptr = p;
  540. Block->Id = 0;
  541. #ifndef NDEBUG
  542. if (p) ++BlockAllocated;
  543. #endif
  544. return p!=NULL;
  545. }
  546. #undef malloc
  547. #undef realloc
  548. #undef free
  549. #ifdef SAFEGUARD
  550. void* safeset(uint8_t* p,int n,bool_t clear)
  551. {
  552. if (p)
  553. {
  554. *(int*)p = n;
  555. p += sizeof(int);
  556. memset(p,0xDA,SAFEGUARD);
  557. p += SAFEGUARD;
  558. if (clear)
  559. memset(p,0xCC,n);
  560. p += n;
  561. memset(p,0xDE,SAFEGUARD);
  562. p -= n;
  563. }
  564. return p;
  565. }
  566. void* safeget(uint8_t* p,bool_t clear)
  567. {
  568. if (p)
  569. {
  570. int n = *(int*)(p-SAFEGUARD-sizeof(int));
  571. int i;
  572. for (i=0;i<SAFEGUARD;++i)
  573. assert(p[-i-1] == 0xDA);
  574. for (i=0;i<SAFEGUARD;++i)
  575. assert(p[n+i] == 0xDE);
  576. p -= SAFEGUARD+sizeof(int);
  577. if (clear)
  578. memset(p,0xEE,n+SAFEGUARD*2+sizeof(int));
  579. }
  580. return p;
  581. }
  582. #endif
  583. void* malloc_win32(size_t n)
  584. {
  585. void* p = NULL;
  586. if (n)
  587. {
  588. do
  589. {
  590. #ifdef SAFEGUARD
  591. p = safeset(malloc(n+SAFEGUARD*2+sizeof(int)),n,1);
  592. #else
  593. p = malloc(n);
  594. #endif
  595. #ifdef FIND
  596. if ((int)p == FIND)
  597. DebugBreak();
  598. #endif
  599. } while (!p && NodeHibernate());
  600. }
  601. return p;
  602. }
  603. void* realloc_win32(void* p,size_t n)
  604. {
  605. do
  606. {
  607. #ifdef SAFEGUARD
  608. p = safeset(realloc(safeget(p,0),n+SAFEGUARD*2+sizeof(int)),n,p==NULL);
  609. #else
  610. p = realloc(p,n);
  611. #endif
  612. #ifdef FIND
  613. if ((int)p == FIND)
  614. DebugBreak();
  615. #endif
  616. } while (!p && n && NodeHibernate());
  617. return p;
  618. }
  619. void free_win32(void* p)
  620. {
  621. #ifdef SAFEGUARD
  622. free(safeget(p,1));
  623. #else
  624. free(p);
  625. #endif
  626. }
  627. void ShowOutOfMemory()
  628. {
  629. }
  630. void EnableOutOfMemory()
  631. {
  632. }
  633. void DisableOutOfMemory()
  634. {
  635. }
  636. void Mem_Init()
  637. {
  638. SYSTEM_INFO SysInfo;
  639. #if defined(_DEBUG) && defined(_MSC_VER) && !defined(TARGET_WINCE)
  640. int Flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
  641. Flag |= _CRTDBG_LEAK_CHECK_DF;
  642. Flag |= _CRTDBG_CHECK_ALWAYS_DF;
  643. _CrtSetDbgFlag(Flag);
  644. #endif
  645. #if defined(TARGET_WINCE)
  646. CoreDLL = LoadLibrary(T("coredll.dll"));
  647. if (CoreDLL)
  648. {
  649. *(FARPROC*)&FuncCacheSync = GetProcAddress(CoreDLL,T("CacheSync"));
  650. *(FARPROC*)&FuncVirtualCopy = GetProcAddress(CoreDLL,T("VirtualCopy"));
  651. *(FARPROC*)&FuncVirtualSetAttributes = GetProcAddress(CoreDLL,T("VirtualSetAttributes"));
  652. *(FARPROC*)&FuncFreePhysMem = GetProcAddress(CoreDLL,T("FreePhysMem"));
  653. *(FARPROC*)&FuncAllocPhysMem = GetProcAddress(CoreDLL,T("AllocPhysMem"));
  654. *(FARPROC*)&FuncLockPages = GetProcAddress(CoreDLL,T("LockPages"));
  655. *(FARPROC*)&FuncUnlockPages = GetProcAddress(CoreDLL,T("UnlockPages"));
  656. }
  657. #endif
  658. GetSystemInfo(&SysInfo);
  659. PageSize = SysInfo.dwPageSize;
  660. }
  661. void Mem_Done()
  662. {
  663. #if defined(TARGET_WINCE)
  664. phymem* p;
  665. for (p=PhyMem;p!=PhyMem+MAXPHY;++p)
  666. if (p->Length)
  667. {
  668. free(p->Blocks);
  669. SafeVirtualFree(p->Virt,p->Length);
  670. memset(p,0,sizeof(phymem));
  671. }
  672. if (CoreDLL) FreeLibrary(CoreDLL);
  673. #endif
  674. #ifndef NDEBUG
  675. assert(BlockAllocated==0);
  676. #endif
  677. ArrayClear(&BlockGroup);
  678. }
  679. #endif