summaryrefslogtreecommitdiff
path: root/storage/ndb/src/common/portlib/old_dirs/ose/NdbMem.c
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/src/common/portlib/old_dirs/ose/NdbMem.c')
-rw-r--r--storage/ndb/src/common/portlib/old_dirs/ose/NdbMem.c181
1 files changed, 181 insertions, 0 deletions
diff --git a/storage/ndb/src/common/portlib/old_dirs/ose/NdbMem.c b/storage/ndb/src/common/portlib/old_dirs/ose/NdbMem.c
new file mode 100644
index 00000000000..0e38024bbb4
--- /dev/null
+++ b/storage/ndb/src/common/portlib/old_dirs/ose/NdbMem.c
@@ -0,0 +1,181 @@
+/* Copyright (C) 2003 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+
+#include "NdbMem.h"
+
+
+#if defined NDB_OSE
+#include <ose.h>
+#include <mms.sig>
+#include <mms_err.h>
+#include <string.h>
+#include <stdio.h>
+#include <NdbOut.hpp>
+
+// Page size for mp750 is 4096 bytes.
+#define PAGE_SIZE 4096
+
+/**
+ * NOTE: To use NdbMem from a OSE system ose_mms has to be defined
+ * as a "Required External Process"(see OSE Kernel User's Guide/R1.1(p. 148)),
+ * like this in osemain.con:
+ * EXT_PROC(ose_mms, ose_mms, 50000)
+ * This will create a global variable ose_mms_ that is used from here.
+ */
+
+union SIGNAL
+{
+ SIGSELECT sigNo;
+ struct MmsAllocateRegionRequest mmsAllocateRegionRequest;
+ struct MmsAllocateRegionReply mmsAllocateRegionReply;
+ struct MmsFreeRegionRequest mmsFreeRegionRequest;
+ struct MmsFreeRegionReply mmsFreeRegionReply;
+}; /* union SIGNAL */
+
+extern PROCESS ose_mms_;
+
+void NdbMem_Create(void)
+{
+ /* Do nothing */
+ return;
+}
+
+void NdbMem_Destroy(void)
+{
+ /* Do nothing */
+ return;
+}
+
+void* NdbMem_Allocate(size_t size)
+{
+ static SIGSELECT allocate_sig[] = {1,MMS_ALLOCATE_REGION_REPLY};
+ union SIGNAL *sig;
+ U32 allocatedAdress;
+
+ assert(size > 0);
+
+ // Only allowed to allocate multiples of the page size.
+ if(size % PAGE_SIZE != 0) {
+ size += PAGE_SIZE - size%PAGE_SIZE;
+ }
+
+ /* Allocate a new region in the callers memory segment. */
+ sig = alloc(sizeof(struct MmsAllocateRegionRequest),
+ MMS_ALLOCATE_REGION_REQUEST);
+ /* -1: The callers domain is used */
+ sig->mmsAllocateRegionRequest.domain = (MemoryDomain)-1;
+ sig->mmsAllocateRegionRequest.useAddr = False;
+ sig->mmsAllocateRegionRequest.size = size;
+ sig->mmsAllocateRegionRequest.access = SuperRW_UserRW;
+ sig->mmsAllocateRegionRequest.resident = False;
+ sig->mmsAllocateRegionRequest.memory = CodeData;
+ sig->mmsAllocateRegionRequest.cache = CopyBack;
+ strcpy(sig->mmsAllocateRegionRequest.name, "NDB_DATA");
+ send(&sig, ose_mms_);
+ sig = receive(allocate_sig);
+
+ if (sig->mmsAllocateRegionReply.status != MMS_SUCCESS){
+ /* Memory allocation failed, make sure this function returns NULL */
+ allocatedAdress = NULL;
+ }
+ else{
+ allocatedAdress = sig->mmsAllocateRegionReply.address;
+ }
+ free_buf(&sig);
+ return (void*)allocatedAdress;
+}
+
+void* NdbMem_AllocateAlign(size_t size, size_t alignment)
+{
+ return NdbMem_Allocate(size);
+}
+
+
+void NdbMem_Free(void* ptr)
+{
+ static SIGSELECT free_sig[] = {1,MMS_FREE_REGION_REPLY};
+ union SIGNAL *sig;
+
+ /* Free a region in the callers domain. */
+ sig = alloc(sizeof(struct MmsFreeRegionRequest),
+ MMS_FREE_REGION_REQUEST);
+ sig->mmsFreeRegionRequest.address = (U32)ptr;
+ send(&sig, ose_mms_);
+ sig = receive(free_sig);
+
+ if (sig->mmsFreeRegionReply.status != MMS_SUCCESS){
+ ndbout_c("The MMS Region could not be deallocated.\r\n");
+ error(sig->mmsFreeRegionReply.status);
+ };
+ free_buf(&sig);
+}
+
+int NdbMem_MemLockAll(){
+ return -1;
+}
+
+int NdbMem_MemUnlockAll(){
+ return -1;
+}
+
+#else
+#include <stdlib.h>
+
+
+void NdbMem_Create()
+{
+ /* Do nothing */
+ return;
+}
+
+void NdbMem_Destroy()
+{
+ /* Do nothing */
+ return;
+}
+
+void* NdbMem_Allocate(size_t size)
+{
+ assert(size > 0);
+ return (void*)malloc(size);
+}
+
+void* NdbMem_AllocateAlign(size_t size, size_t alignment)
+{
+ /*
+ return (void*)memalign(alignment, size);
+ TEMP fix
+ */
+ return (void*)malloc(size);
+}
+
+
+void NdbMem_Free(void* ptr)
+{
+ free(ptr);
+}
+
+
+int NdbMem_MemLockAll(){
+ return -1;
+}
+
+int NdbMem_MemUnlockAll(){
+ return -1;
+}
+
+#endif