Change the local hashtable for recording the pointer mapping info used in the gc...
[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, 
8                         int size) {
9   void * p = NULL;
10   int isize = size; 
11   BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
12   p = BAMBOO_LOCAL_MEM_CALLOC(m, isize); // calloc(m, isize);
13   if(p == NULL) {
14           BAMBOO_EXIT(0xc001);
15   }
16   BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
17   return p;
18 }
19
20 #ifdef MULTICORE_GC
21 void * mycalloc_share(struct garbagelist * stackptr, 
22                               int m, 
23                                           int size) {
24         void * p = NULL;
25   int isize = 2*BAMBOO_CACHE_LINE_SIZE-4+(size-1)&(~BAMBOO_CACHE_LINE_MASK);
26         bool hasgc = false;
27 memalloc:
28   BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
29 #ifdef DEBUG
30         tprintf("ask for shared mem: %x \n", isize);
31 #endif
32   p = BAMBOO_SHARE_MEM_CALLOC_I(m, isize); // calloc(m, isize);
33 #ifdef DEBUG
34         tprintf("new obj in shared mem: %x, %x \n", p, isize);
35 #endif
36   if(p == NULL) {
37                 // no more global shared memory
38                 BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
39                 if(!hasgc) {
40                         // start gc
41                         gc(stackptr);
42                         hasgc = true;
43                 } else {
44                         // no more global shared memory
45                         BAMBOO_EXIT(0xc002);
46                 }
47
48                 // try to malloc again
49                 goto memalloc;
50   }
51   BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
52         void * alignedp = 
53                 (void *)(BAMBOO_CACHE_LINE_SIZE+((int)p-1)&(~BAMBOO_CACHE_LINE_MASK));
54         BAMBOO_MEMSET_WH(p, -2, (alignedp - p));
55   BAMBOO_MEMSET_WH(alignedp + size, -2, p + isize - alignedp - size);
56         return alignedp;
57 }
58
59 void * mycalloc_share_ngc(int m, 
60                                               int size) {
61   void * p = NULL;
62   BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
63 #ifdef DEBUG
64         tprintf("ask for shared mem: %x \n", size);
65 #endif
66   p = BAMBOO_SHARED_MEM_CALLOC_NGC_I(m, size); // calloc(m, isize);
67 #ifdef DEBUG
68   printf("new obj in shared mem: %x, %x \n", p, size);
69 #endif
70   BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
71   return p;
72 }
73
74 void * mycalloc_share_ngc_I(int m, 
75                                                 int size) {
76   void * p = NULL;
77 #ifdef DEBUG
78         tprintf("ask for shared mem: %x \n", size);
79 #endif
80   p = BAMBOO_SHARED_MEM_CALLOC_NGC_I(m, size); // calloc(m, isize);
81 #ifdef DEBUG
82   printf("new obj in shared mem: %x, %x \n", p, size);
83 #endif
84   return p;
85 }
86
87 void mycalloc_free_ngc(void * ptr) {
88   BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
89   BAMBOO_SHARED_MEM_FREE_NGC_I(ptr);
90   BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
91 }
92
93 void mycalloc_free_ngc_I(void * ptr) {
94   BAMBOO_SHARED_MEM_FREE_NGC_I(ptr);
95 }
96 #else
97 void * mycalloc_share(int m, 
98                                   int size) {
99   void * p = NULL;
100   int isize = 2*BAMBOO_CACHE_LINE_SIZE-4+(size-1)&(~BAMBOO_CACHE_LINE_MASK);
101   BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
102   p = BAMBOO_SHARE_MEM_CALLOC_I(m, isize); // calloc(m, isize);
103   if(p == NULL) {
104                 // no more global shared memory
105                 BAMBOO_EXIT(0xc003);
106   }
107   BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
108   return 
109                 (void *)(BAMBOO_CACHE_LINE_SIZE+((int)p-1)&(~BAMBOO_CACHE_LINE_MASK));
110 }
111 #endif
112
113 void * mycalloc_i(int m, 
114                           int size) {
115   void * p = NULL;
116   int isize = size; 
117 #ifdef DEBUG
118   tprintf("ask for local mem: %x \n", isize);
119 #endif
120   p = BAMBOO_LOCAL_MEM_CALLOC(m, isize); // calloc(m, isize);
121 #ifdef DEBUG
122   tprintf("new obj in local mem: %x, %x \n", p, isize);
123 #endif
124   if(p == NULL) {
125         BAMBOO_EXIT(0xc004);
126   }
127   return p;
128 }
129
130 void myfree(void * ptr) {
131   BAMBOO_LOCAL_MEM_FREE(ptr);
132   return;
133 }
134
135 #endif