make it compile
[IRC.git] / Robust / src / Runtime / mem.c
index 5ef956b0a232edba30a2ea2dc397a0c32e06db5f..ef3a0a6c9ccbd40dd085de3f9e3562c9ac44509b 100644 (file)
@@ -2,34 +2,85 @@
 
 #ifdef MULTICORE
 #include "runtime.h"
-#include "runtime_arch.h"
+#include <stdio.h>
 
-/*void * m_calloc(int m, int size) {
-        void * p = malloc(m*size);
-        int i = 0;
-        for(i = 0; i < size; ++i) {
- *(char *)(p+i) = 0;
-        }
-        return p;
-   }*/
+#ifdef MULTICORE_GC
+#include "multicoreruntime.h"
+#include "bambooalign.h"
+#include "multicoremem.h"
+#include "multicoregarbage.h"
+#include "runtime_arch.h"
+#include "methodheaders.h"
 
-void * mycalloc(int m, int size) {
+extern volatile bool gcflag;
+void * mycalloc_share(struct garbagelist * stackptr, int size) {
   void * p = NULL;
-  int isize = 2*BAMBOO_CACHE_LINE_SIZE-4+(size-1)&(~BAMBOO_CACHE_LINE_MASK);
-  BAMBOO_START_CRITICAL_SECTION_MEM();
-  p = BAMBOO_SHARE_MEM_CALLOC(m, isize); // calloc(m, isize);
-  BAMBOO_CLOSE_CRITICAL_SECTION_MEM();
-  return (void *)(BAMBOO_CACHE_LINE_SIZE+((int)p-1)&(~BAMBOO_CACHE_LINE_MASK));
+  int isize = ((size-1)&(~(ALIGNMENTSIZE-1)))+ALIGNMENTSIZE;
+  int hasgc = 0;
+  int loopcount = 0;
+
+  while(loopcount<10000) {
+    p = BAMBOO_SHARE_MEM_CALLOC(isize); // calloc(m, isize);
+
+    if(p != NULL) 
+      return p;
+    
+    // no more global shared memory
+    if(hasgc < 5) {
+      // start gc
+      if(gcflag) {
+       gc(stackptr);
+       hasgc++;
+      }
+    } else {
+      // no more global shared memory
+      printf("Did %u collections without getting memory\n", hasgc);
+      BAMBOO_EXIT();
+    }
+  }
+  tprintf("Loopcount hit 10000\n");
+  BAMBOO_EXIT();
+  return NULL;
 }
 
-void * mycalloc_i(int m, int size) {
-  void * p = NULL;
-  int isize = 2*BAMBOO_CACHE_LINE_SIZE-4+(size-1)&(~BAMBOO_CACHE_LINE_MASK);
-  p = BAMBOO_SHARE_MEM_CALLOC(m, isize); // calloc(m, isize);
+#else
+void * mycalloc_share(int size) {
+  int isize = ((size-1)&(~(BAMBOO_CACHE_LINE_MASK)))+(BAMBOO_CACHE_LINE_SIZE);
+  void * p = BAMBOO_SHARE_MEM_CALLOC(isize); // calloc(m, isize);
+  if(p == NULL) {
+    // no more global shared memory
+    BAMBOO_EXIT();
+  }
   return (void *)(BAMBOO_CACHE_LINE_SIZE+((int)p-1)&(~BAMBOO_CACHE_LINE_MASK));
 }
+#endif
+
+void * mycalloc(int size, char * file, int line) {
+  BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
+  void * p = mycalloc_i(size, file, line);
+  BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
+  return p;
+}
+
+
+void * mycalloc_i(int size, char * file, int line) {
+  void * p = BAMBOO_LOCAL_MEM_CALLOC(size);
+  if(p == NULL) {
+    tprintf("mycalloc_i %s %d \n", file, line);
+    BAMBOO_EXIT();
+  }
+  return p;
+}
 
 void myfree(void * ptr) {
+  BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
+  BAMBOO_LOCAL_MEM_FREE(ptr);
+  BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
+  return;
+}
+
+void myfree_i(void * ptr) {
+  BAMBOO_LOCAL_MEM_FREE(ptr);
   return;
 }