NdbMem.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:7k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <ndb_global.h>
  14. #include "NdbMem.h"
  15. #if 0
  16. struct AWEINFO
  17. {
  18.     SIZE_T dwSizeInBytesRequested;
  19.     ULONG_PTR nNumberOfPagesRequested;
  20.     ULONG_PTR nNumberOfPagesActual;
  21.     ULONG_PTR nNumberOfPagesFreed;
  22.     ULONG_PTR* pnPhysicalMemoryPageArray;
  23.     void* pRegionReserved;
  24. };
  25. const size_t cNdbMem_nMaxAWEinfo = 256;
  26. size_t gNdbMem_nAWEinfo = 0;
  27. struct AWEINFO* gNdbMem_pAWEinfo = 0;
  28. void ShowLastError(const char* szContext, const char* szFunction)
  29. {
  30.     DWORD dwError = GetLastError();
  31.     LPVOID lpMsgBuf;
  32.     FormatMessage( 
  33.         FORMAT_MESSAGE_ALLOCATE_BUFFER | 
  34.         FORMAT_MESSAGE_FROM_SYSTEM | 
  35.         FORMAT_MESSAGE_IGNORE_INSERTS,
  36.         NULL,
  37.         dwError,
  38.         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  39.         (LPTSTR)&lpMsgBuf,
  40.         0,
  41.         NULL 
  42.         );
  43.     printf("%s : %s failed : %lu : %sn", szContext, szFunction, dwError, (char*)lpMsgBuf);
  44.     LocalFree(lpMsgBuf);
  45. }
  46. void NdbMem_Create()
  47. {
  48.     // Address Windowing Extensions
  49.     struct PRIVINFO
  50.     {
  51.         DWORD Count;
  52.         LUID_AND_ATTRIBUTES Privilege[1];
  53.     } Info;
  54.     HANDLE hProcess = GetCurrentProcess();
  55.     HANDLE hToken;
  56.     if(!OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken))
  57.     {
  58.         ShowLastError("NdbMem_Create", "OpenProcessToken");
  59.     }
  60.     
  61.     Info.Count = 1;
  62.     Info.Privilege[0].Attributes = SE_PRIVILEGE_ENABLED;
  63.     if(!LookupPrivilegeValue(0, SE_LOCK_MEMORY_NAME, &(Info.Privilege[0].Luid)))
  64.     {
  65.         ShowLastError("NdbMem_Create", "LookupPrivilegeValue");
  66.     }
  67.     
  68.     if(!AdjustTokenPrivileges(hToken, FALSE, (PTOKEN_PRIVILEGES)&Info, 0, 0, 0))
  69.     {
  70.         ShowLastError("NdbMem_Create", "AdjustTokenPrivileges");
  71.     }
  72.     
  73.     if(!CloseHandle(hToken))
  74.     {
  75.         ShowLastError("NdbMem_Create", "CloseHandle");
  76.     }
  77.     
  78.     return;
  79. }
  80. void NdbMem_Destroy()
  81. {
  82.     /* Do nothing */
  83.     return;
  84. }
  85. void* NdbMem_Allocate(size_t size)
  86. {
  87.     // Address Windowing Extensions
  88.     struct AWEINFO* pAWEinfo;
  89.     HANDLE hProcess;
  90.     SYSTEM_INFO sysinfo;
  91.     if(!gNdbMem_pAWEinfo)
  92.     {
  93.         gNdbMem_pAWEinfo = VirtualAlloc(0, 
  94.             sizeof(struct AWEINFO)*cNdbMem_nMaxAWEinfo, 
  95.             MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE);
  96.     }
  97.     assert(gNdbMem_nAWEinfo < cNdbMem_nMaxAWEinfo);
  98.     pAWEinfo = gNdbMem_pAWEinfo+gNdbMem_nAWEinfo++;
  99.     hProcess = GetCurrentProcess();
  100.     GetSystemInfo(&sysinfo);
  101.     pAWEinfo->nNumberOfPagesRequested = (size+sysinfo.dwPageSize-1)/sysinfo.dwPageSize;
  102.     pAWEinfo->pnPhysicalMemoryPageArray = VirtualAlloc(0, 
  103.         sizeof(ULONG_PTR)*pAWEinfo->nNumberOfPagesRequested, 
  104.         MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE);
  105.     pAWEinfo->nNumberOfPagesActual = pAWEinfo->nNumberOfPagesRequested;
  106.     if(!AllocateUserPhysicalPages(hProcess, &(pAWEinfo->nNumberOfPagesActual), pAWEinfo->pnPhysicalMemoryPageArray))
  107.     {
  108.         ShowLastError("NdbMem_Allocate", "AllocateUserPhysicalPages");
  109.         return 0;
  110.     }
  111.     if(pAWEinfo->nNumberOfPagesRequested != pAWEinfo->nNumberOfPagesActual)
  112.     {
  113.         ShowLastError("NdbMem_Allocate", "nNumberOfPagesRequested != nNumberOfPagesActual");
  114.         return 0;
  115.     }
  116.     
  117.     pAWEinfo->dwSizeInBytesRequested = size;
  118.     pAWEinfo->pRegionReserved = VirtualAlloc(0, pAWEinfo->dwSizeInBytesRequested, MEM_RESERVE | MEM_PHYSICAL, PAGE_READWRITE);
  119.     if(!pAWEinfo->pRegionReserved)
  120.     {
  121.         ShowLastError("NdbMem_Allocate", "VirtualAlloc");
  122.         return 0;
  123.     }
  124.     
  125.     if(!MapUserPhysicalPages(pAWEinfo->pRegionReserved, pAWEinfo->nNumberOfPagesActual, pAWEinfo->pnPhysicalMemoryPageArray))
  126.     {
  127.         ShowLastError("NdbMem_Allocate", "MapUserPhysicalPages");
  128.         return 0;
  129.     }
  130.     /*
  131.     printf("allocate AWE memory: %lu bytes, %lu pages, address %lxn", 
  132.         pAWEinfo->dwSizeInBytesRequested, 
  133.         pAWEinfo->nNumberOfPagesActual,
  134.         pAWEinfo->pRegionReserved);
  135.     */
  136.     return pAWEinfo->pRegionReserved;
  137. }
  138. void* NdbMem_AllocateAlign(size_t size, size_t alignment)
  139. {
  140.     /*
  141.     return (void*)memalign(alignment, size);
  142.     TEMP fix
  143.     */
  144.     return NdbMem_Allocate(size);
  145. }
  146. void NdbMem_Free(void* ptr)
  147. {
  148.     // VirtualFree(ptr, 0, MEM_DECOMMIT|MEM_RELEASE);
  149.     
  150.     // Address Windowing Extensions
  151.     struct AWEINFO* pAWEinfo = 0;
  152.     size_t i;
  153.     HANDLE hProcess;
  154.     for(i=0; i<gNdbMem_nAWEinfo; ++i)
  155.     {
  156.         if(ptr==gNdbMem_pAWEinfo[i].pRegionReserved)
  157.         {
  158.             pAWEinfo = gNdbMem_pAWEinfo+i;
  159.         }
  160.     }
  161.     if(!pAWEinfo)
  162.     {
  163.         ShowLastError("NdbMem_Free", "ptr is not AWE memory");
  164.     }
  165.     hProcess = GetCurrentProcess();
  166.     if(!MapUserPhysicalPages(ptr, pAWEinfo->nNumberOfPagesActual, 0))
  167.     {
  168.         ShowLastError("NdbMem_Free", "MapUserPhysicalPages");
  169.     }
  170.     
  171.     if(!VirtualFree(ptr, 0, MEM_RELEASE))
  172.     {
  173.         ShowLastError("NdbMem_Free", "VirtualFree");
  174.     }
  175.     
  176.     pAWEinfo->nNumberOfPagesFreed = pAWEinfo->nNumberOfPagesActual;
  177.     if(!FreeUserPhysicalPages(hProcess, &(pAWEinfo->nNumberOfPagesFreed), pAWEinfo->pnPhysicalMemoryPageArray))
  178.     {
  179.         ShowLastError("NdbMem_Free", "FreeUserPhysicalPages");
  180.     }
  181.     
  182.     VirtualFree(pAWEinfo->pnPhysicalMemoryPageArray, 0, MEM_DECOMMIT|MEM_RELEASE);
  183. }
  184. int NdbMem_MemLockAll()
  185. {
  186.     /*
  187.     HANDLE hProcess = GetCurrentProcess();
  188.     SIZE_T nMinimumWorkingSetSize;
  189.     SIZE_T nMaximumWorkingSetSize;
  190.     GetProcessWorkingSetSize(hProcess, &nMinimumWorkingSetSize, &nMaximumWorkingSetSize);
  191.     ndbout << "nMinimumWorkingSetSize=" << nMinimumWorkingSetSize << ", nMaximumWorkingSetSize=" << nMaximumWorkingSetSize << endl;
  192.     SetProcessWorkingSetSize(hProcess, 50000000, 100000000);
  193.   
  194.     GetProcessWorkingSetSize(hProcess, &nMinimumWorkingSetSize, &nMaximumWorkingSetSize);
  195.     ndbout << "nMinimumWorkingSetSize=" << nMinimumWorkingSetSize << ", nMaximumWorkingSetSize=" << nMaximumWorkingSetSize << endl;
  196.     */
  197.     return -1;
  198. }
  199. int NdbMem_MemUnlockAll()
  200. {
  201.     //VirtualUnlock();
  202.     return -1;
  203. }
  204. #endif
  205. void NdbMem_Create()
  206. {
  207.   /* Do nothing */
  208.   return;
  209. }
  210. void NdbMem_Destroy()
  211. {
  212.   /* Do nothing */
  213.   return;
  214. }
  215. void* NdbMem_Allocate(size_t size)
  216. {
  217.   void* mem_allocated;
  218.   assert(size > 0);
  219.   mem_allocated= (void*)malloc(size);
  220.   return mem_allocated;
  221. }
  222. void* NdbMem_AllocateAlign(size_t size, size_t alignment)
  223. {
  224.   (void)alignment; /* remove warning for unused parameter */
  225.   /*
  226.     return (void*)memalign(alignment, size);
  227.     TEMP fix
  228.   */
  229.   return (void*)malloc(size);
  230. }
  231. void NdbMem_Free(void* ptr)
  232. {
  233.   free(ptr);
  234. }
  235.  
  236. int NdbMem_MemLockAll()
  237. {
  238.   return 0;
  239. }
  240. int NdbMem_MemUnlockAll()
  241. {
  242.   return 0;
  243. }