Changes
[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 #ifdef MULTICORE_GC
8 void * mycalloc_share(struct garbagelist * stackptr, 
9                               int m, 
10                                           int size) {
11         void * p = NULL;
12   //int isize = 2*BAMBOO_CACHE_LINE_SIZE-4+(size-1)&(~BAMBOO_CACHE_LINE_MASK);
13   int isize = (size & (~(BAMBOO_CACHE_LINE_MASK))) + (BAMBOO_CACHE_LINE_SIZE);
14         int hasgc = 0;
15 memalloc:
16   BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
17   p = BAMBOO_SHARE_MEM_CALLOC_I(m, isize); // calloc(m, isize);
18   if(p == NULL) {
19                 // no more global shared memory
20                 BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
21                 if(hasgc < 5) {
22                     // start gc
23                         if(gc(stackptr)) {
24                           hasgc++;
25                         }
26                 } else {
27                         // no more global shared memory
28                         BAMBOO_EXIT(0xc001);
29                 }
30
31                 // try to malloc again
32                 goto memalloc;
33   }
34   BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
35         void * alignedp = 
36                 (void *)(BAMBOO_CACHE_LINE_SIZE+((int)p-1)&(~BAMBOO_CACHE_LINE_MASK));
37         BAMBOO_MEMSET_WH(p, -2, (alignedp - p));
38   BAMBOO_MEMSET_WH(alignedp + size, -2, p + isize - alignedp - size);
39         return alignedp;
40 }
41 #else
42 void * mycalloc_share(int m, 
43                                   int size) {
44   void * p = NULL;
45   //int isize = 2*BAMBOO_CACHE_LINE_SIZE-4+(size-1)&(~BAMBOO_CACHE_LINE_MASK);
46   int isize = (size & (~(BAMBOO_CACHE_LINE_MASK))) + (BAMBOO_CACHE_LINE_SIZE);
47   BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
48   p = BAMBOO_SHARE_MEM_CALLOC_I(m, isize); // calloc(m, isize);
49   if(p == NULL) {
50                 // no more global shared memory
51                 BAMBOO_EXIT(0xc002);
52   }
53   BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
54   return 
55                 (void *)(BAMBOO_CACHE_LINE_SIZE+((int)p-1)&(~BAMBOO_CACHE_LINE_MASK));
56 }
57 #endif
58
59 void * mycalloc(int m, 
60                         int size) {
61   void * p = NULL;
62   int isize = size; 
63   BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
64   p = BAMBOO_LOCAL_MEM_CALLOC(m, isize); // calloc(m, isize);
65   if(p == NULL) {
66           BAMBOO_EXIT(0xc003);
67   }
68   BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
69   return p;
70 }
71
72
73 void * mycalloc_i(int m, 
74                           int size) {
75   void * p = NULL;
76   int isize = size; 
77   p = BAMBOO_LOCAL_MEM_CALLOC(m, isize); // calloc(m, isize);
78   if(p == NULL) {
79         BAMBOO_EXIT(0xc004);
80   }
81   return p;
82 }
83
84 void myfree(void * ptr) {
85   BAMBOO_LOCAL_MEM_FREE(ptr);
86   return;
87 }
88
89 #endif