add compact phase code for multicore gc, not finished yet
[IRC.git] / Robust / src / Runtime / mem.c
1 #include "mem.h"
2
3 #ifdef MULTICORE
4 #include "runtime.h"
5 #include "runtime_arch.h"
6
7 void * mycalloc(int m, int size) {
8   void * p = NULL;
9   int isize = size; 
10   BAMBOO_START_CRITICAL_SECTION_MEM();
11   p = BAMBOO_LOCAL_MEM_CALLOC(m, isize); // calloc(m, isize);
12   if(p == NULL) {
13           BAMBOO_EXIT(0xa024);
14   }
15   BAMBOO_CLOSE_CRITICAL_SECTION_MEM();
16   return p;
17 }
18
19 #ifdef MULTICORE_GC
20 void * mycalloc_share(struct garbagelist * stackptr, int m, int size) {
21         void * p = NULL;
22   int isize = 2*BAMBOO_CACHE_LINE_SIZE-4+(size-1)&(~BAMBOO_CACHE_LINE_MASK);
23 memalloc:
24   BAMBOO_START_CRITICAL_SECTION_MEM();
25   p = BAMBOO_SHARE_MEM_CALLOC_I(m, isize); // calloc(m, isize);
26   if(p == NULL) {
27                 // no more global shared memory
28                 BAMBOO_CLOSE_CRITICAL_SECTION_MEM();
29                 // start gc
30                 gc(stackptr);
31
32                 // try to malloc again
33                 goto memalloc;
34   }
35   BAMBOO_CLOSE_CRITICAL_SECTION_MEM();
36         void * alignedp = (void *)(BAMBOO_CACHE_LINE_SIZE+((int)p-1)&(~BAMBOO_CACHE_LINE_MASK));
37         memset(p, -2, (alignedp - p));
38   memset(alignedp + size, -2, p + isize - alignedp - size);
39         return alignedp;
40 }
41 #else
42 void * mycalloc_share(int m, int size) {
43   void * p = NULL;
44   int isize = 2*BAMBOO_CACHE_LINE_SIZE-4+(size-1)&(~BAMBOO_CACHE_LINE_MASK);
45   BAMBOO_START_CRITICAL_SECTION_MEM();
46   p = BAMBOO_SHARE_MEM_CALLOC_I(m, isize); // calloc(m, isize);
47   if(p == NULL) {
48                 // no more global shared memory
49                 BAMBOO_EXIT(0xa025);
50   }
51   BAMBOO_CLOSE_CRITICAL_SECTION_MEM();
52   return (void *)(BAMBOO_CACHE_LINE_SIZE+((int)p-1)&(~BAMBOO_CACHE_LINE_MASK));
53 }
54 #endif
55
56 void * mycalloc_i(int m, int size) {
57   void * p = NULL;
58   int isize = size; 
59   p = BAMBOO_LOCAL_MEM_CALLOC(m, isize); // calloc(m, isize);
60   if(p == NULL) {
61           BAMBOO_EXIT(0xa026);
62   }
63   return p;
64 }
65
66 void myfree(void * ptr) {
67   BAMBOO_LOCAL_MEM_FREE(ptr);
68   return;
69 }
70
71 #endif