bug fix
[IRC.git] / Robust / src / Runtime / mem.c
1 #include "mem.h"
2
3 #ifdef MULTICORE
4 #include "runtime.h"
5 #include <stdio.h>
6
7 #if defined(MULTICORE_GC)||defined(PMC_GC)
8 #include "multicoreruntime.h"
9 #include "bambooalign.h"
10 #include "runtime_arch.h"
11 #include "methodheaders.h"
12 #endif
13
14 #ifdef MULTICORE_GC
15 #include "multicoremem.h"
16 #include "multicoregarbage.h"
17 #endif
18 #ifdef PMC_GC
19 #include "multicoregc.h"
20 #include "pmc_garbage.h"
21 #endif
22
23 #if defined(MULTICORE_GC)||defined(PMC_GC)
24 extern volatile bool gcflag;
25 void * mycalloc_share(struct garbagelist * stackptr, int size) {
26   void * p = NULL;
27   int isize = ((size-1)&(~(ALIGNMENTSIZE-1)))+ALIGNMENTSIZE;
28   int hasgc = 0;
29   int loopcount = 0;
30
31   while(true) {
32     p = BAMBOO_SHARE_MEM_CALLOC(isize); // calloc(m, isize);
33
34     if(p != NULL) 
35       return p;
36     
37     // no more global shared memory
38     if(hasgc < 30) {
39       // start gc
40       if(gcflag) {
41         gc(stackptr);
42         hasgc++;
43       }
44     } else {
45       // no more global shared memory
46       printf("Did %u collections without getting memory\n", hasgc);
47       BAMBOO_EXIT();
48     }
49     loopcount++;
50     if (loopcount>10000000)
51       tprintf("Loopcount in mycalloc_share hit %u\n",loopcount);
52   }
53
54   BAMBOO_EXIT();
55   return NULL;
56 }
57
58 #else
59 void * mycalloc_share(int size) {
60   int isize = ((size-1)&(~(BAMBOO_CACHE_LINE_MASK)))+(BAMBOO_CACHE_LINE_SIZE);
61   void * p = BAMBOO_SHARE_MEM_CALLOC(isize); // calloc(m, isize);
62   if(p == NULL) {
63     // no more global shared memory
64     BAMBOO_EXIT();
65   }
66   return (void *)(BAMBOO_CACHE_LINE_SIZE+((int)p-1)&(~BAMBOO_CACHE_LINE_MASK));
67 }
68 #endif
69
70 void * mycalloc(int size, char * file, int line) {
71   BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
72   void * p = mycalloc_i(size, file, line);
73   BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
74   return p;
75 }
76
77
78 void * mycalloc_i(int size, char * file, int line) {
79   void * p = BAMBOO_LOCAL_MEM_CALLOC(size);
80   if(p == NULL) {
81     tprintf("mycalloc_i %s %d \n", file, line);
82     BAMBOO_EXIT();
83   }
84   return p;
85 }
86
87 void myfree(void * ptr) {
88   BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
89   BAMBOO_LOCAL_MEM_FREE(ptr);
90   BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
91   return;
92 }
93
94 void myfree_i(void * ptr) {
95   BAMBOO_LOCAL_MEM_FREE(ptr);
96   return;
97 }
98
99 #endif