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

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 "NdbMem.h"
  14. #if defined NDB_OSE
  15. #include <ose.h>
  16. #include <mms.sig>
  17. #include <mms_err.h>
  18. #include <string.h>
  19. #include <stdio.h>
  20. #include <NdbOut.hpp>
  21. //  Page size for mp750 is 4096 bytes.
  22. #define PAGE_SIZE 4096
  23. /**
  24.  * NOTE: To use NdbMem from a OSE system ose_mms has to be defined 
  25.  * as a "Required External Process"(see OSE Kernel User's Guide/R1.1(p. 148)),
  26.  * like this in osemain.con:
  27.  * EXT_PROC(ose_mms, ose_mms, 50000)
  28.  * This will create a global variable ose_mms_ that is used from here.
  29.  */
  30. union SIGNAL
  31. {
  32.   SIGSELECT                       sigNo;
  33.   struct MmsAllocateRegionRequest mmsAllocateRegionRequest;
  34.   struct MmsAllocateRegionReply   mmsAllocateRegionReply;
  35.   struct MmsFreeRegionRequest     mmsFreeRegionRequest;
  36.   struct MmsFreeRegionReply       mmsFreeRegionReply;
  37. }; /* union SIGNAL */
  38. extern PROCESS ose_mms_;
  39. void NdbMem_Create(void)
  40. {
  41.   /* Do nothing */
  42.   return;
  43. }
  44. void NdbMem_Destroy(void)
  45. {
  46.   /* Do nothing */
  47.   return;
  48. }
  49. void* NdbMem_Allocate(size_t size)
  50. {
  51.   static SIGSELECT   allocate_sig[]  = {1,MMS_ALLOCATE_REGION_REPLY};
  52.   union SIGNAL           *sig;
  53.   U32 allocatedAdress;
  54.   assert(size > 0);
  55.   // Only allowed to allocate multiples of the page size.
  56.   if(size % PAGE_SIZE != 0) {
  57.     size += PAGE_SIZE - size%PAGE_SIZE;
  58.   }
  59.   /* Allocate a new region in the callers memory segment. */
  60.   sig = alloc(sizeof(struct MmsAllocateRegionRequest),
  61.               MMS_ALLOCATE_REGION_REQUEST);
  62.   /* -1: The callers domain is used */ 
  63.   sig->mmsAllocateRegionRequest.domain = (MemoryDomain)-1;
  64.   sig->mmsAllocateRegionRequest.useAddr = False;
  65.   sig->mmsAllocateRegionRequest.size = size;
  66.   sig->mmsAllocateRegionRequest.access = SuperRW_UserRW;
  67.   sig->mmsAllocateRegionRequest.resident = False;
  68.   sig->mmsAllocateRegionRequest.memory = CodeData;
  69.   sig->mmsAllocateRegionRequest.cache = CopyBack;
  70.   strcpy(sig->mmsAllocateRegionRequest.name, "NDB_DATA");
  71.   send(&sig, ose_mms_);
  72.   sig = receive(allocate_sig);
  73.     
  74.   if (sig->mmsAllocateRegionReply.status != MMS_SUCCESS){
  75.     /* Memory allocation failed, make sure this function returns NULL */
  76.     allocatedAdress = NULL;
  77.   }
  78.   else{
  79.     allocatedAdress = sig->mmsAllocateRegionReply.address;
  80.   }
  81.   free_buf(&sig);
  82.   return (void*)allocatedAdress;
  83. }
  84. void* NdbMem_AllocateAlign(size_t size, size_t alignment)
  85. {
  86.   return NdbMem_Allocate(size);
  87. }
  88. void NdbMem_Free(void* ptr)
  89. {
  90.   static SIGSELECT   free_sig[]  = {1,MMS_FREE_REGION_REPLY};
  91.   union SIGNAL           *sig;
  92.   /* Free a region in the callers domain. */
  93.   sig = alloc(sizeof(struct MmsFreeRegionRequest),
  94.               MMS_FREE_REGION_REQUEST);
  95.   sig->mmsFreeRegionRequest.address = (U32)ptr;
  96.   send(&sig, ose_mms_);
  97.   sig = receive(free_sig);
  98.     
  99.   if (sig->mmsFreeRegionReply.status != MMS_SUCCESS){
  100.     ndbout_c("The MMS Region could not be deallocated.rn");
  101.     error(sig->mmsFreeRegionReply.status);
  102.   };
  103.   free_buf(&sig);
  104. }
  105. int NdbMem_MemLockAll(){
  106.   return -1;
  107. }
  108. int NdbMem_MemUnlockAll(){
  109.   return -1;
  110. }
  111. #else
  112. #include <stdlib.h>
  113. void NdbMem_Create()
  114. {
  115.   /* Do nothing */
  116.   return;
  117. }
  118. void NdbMem_Destroy()
  119. {
  120.   /* Do nothing */
  121.   return;
  122. }
  123. void* NdbMem_Allocate(size_t size)
  124. {
  125.   assert(size > 0);
  126.   return (void*)malloc(size);
  127. }
  128. void* NdbMem_AllocateAlign(size_t size, size_t alignment)
  129. {
  130.   /*
  131.     return (void*)memalign(alignment, size);
  132.     TEMP fix
  133.   */
  134.   return (void*)malloc(size);
  135. }
  136. void NdbMem_Free(void* ptr)
  137. {
  138.   free(ptr);
  139. }
  140. int NdbMem_MemLockAll(){
  141.   return -1;
  142. }
  143. int NdbMem_MemUnlockAll(){
  144.   return -1;
  145. }
  146. #endif