Some code clean and make the cache adapt version compile
[IRC.git] / Robust / src / Runtime / bamboo / multicoretask.c
index 647394bb0dda0618fadcfb42151a4e42c351e3b0..2a3c7b2796270005195c2331cc5b0725d200eadb 100644 (file)
@@ -1,12 +1,9 @@
 #ifdef TASK
 #include "runtime.h"
 #include "multicoreruntime.h"
-#include "runtime_arch.h"
-#include "GenericHashtable.h"
-
-#ifndef INLINE
-#define INLINE    inline __attribute__((always_inline))
-#endif // #ifndef INLINE
+#include "multicoretaskprofile.h"
+#include "multicoretask.h"
+#include "multicore.h"
 
 //  data structures for task invocation
 struct genhashtable * activetasks;
@@ -24,364 +21,9 @@ int enqueuetasks_I(struct parameterwrapper *parameter,
                    int * enterflags,
                    int numenterflags);
 
+INLINE void initlocktable() {
 #ifdef MULTICORE_GC
-#ifdef SMEMF
-#define NUM_CORES2TEST 5
-#ifdef GC_1
-int core2test[1][NUM_CORES2TEST] = {
-  {0, -1, -1, -1, -1}
-};
-#elif defined GC_56
-int core2test[56][NUM_CORES2TEST] = {
-  { 0, -1,  7, -1,  1}, { 1, -1,  8,  0,  2}, { 2, -1,  9,  1,  3},
-  { 3, -1, 10,  2,  4}, { 4, -1, 11,  3,  5}, { 5, -1, 12,  4,  6},
-  { 6, -1, 13,  5, -1}, { 7,  0, 14, -1,  8}, { 8,  1, 15,  7,  9},
-  { 9,  2, 16,  8, 10}, {10,  3, 17,  9, 11}, {11,  4, 18, 10, 12},
-  {12,  5, 19, 11, 13}, {13,  6, 20, 12, -1}, {14,  7, 21, -1, 15},
-  {15,  8, 22, 14, 16}, {16,  9, 23, 15, 17}, {17, 10, 24, 16, 18},
-  {18, 11, 25, 17, 19}, {19, 12, 26, 18, 20}, {20, 13, 27, 19, -1},
-  {21, 14, 28, -1, 22}, {22, 15, 29, 21, 23}, {23, 16, 30, 22, 24},
-  {24, 17, 31, 23, 25}, {25, 18, 32, 24, 26}, {26, 19, 33, 25, 27},
-  {27, 20, 34, 26, -1}, {28, 21, 35, -1, 29}, {29, 22, 36, 28, 30},
-  {30, 23, 37, 29, 31}, {31, 24, 38, 30, 32}, {32, 25, 39, 31, 33},
-  {33, 26, 40, 32, 34}, {34, 27, 41, 33, -1}, {35, 28, 42, -1, 36},
-  {36, 29, 43, 35, 37}, {37, 30, 44, 36, 38}, {38, 31, 45, 37, 39},
-  {39, 32, 46, 38, 40}, {40, 33, 47, 39, 41}, {41, 34, 48, 40, -1},
-  {42, 35, 49, -1, 43}, {43, 36, 50, 42, 44}, {44, 37, 51, 43, 45},
-  {45, 38, 52, 44, 46}, {46, 39, 53, 45, 47}, {47, 40, 54, 46, 48},
-  {48, 41, 55, 47, -1}, {49, 42, -1, -1, 50}, {50, 43, -1, 49, 51},
-  {51, 44, -1, 50, 52}, {52, 45, -1, 51, 53}, {53, 46, -1, 52, 54},
-  {54, 47, -1, 53, 55}, {55, 48, -1, 54, -1}
-};
-#elif defined GC_62
-int core2test[62][NUM_CORES2TEST] = {
-  { 0, -1,  6, -1,  1}, { 1, -1,  7,  0,  2}, { 2, -1,  8,  1,  3},
-  { 3, -1,  9,  2,  4}, { 4, -1, 10,  3,  5}, { 5, -1, 11,  4, -1},
-  { 6,  0, 14, -1,  7}, { 7,  1, 15,  6,  8}, { 8,  2, 16,  7,  9},
-  { 9,  3, 17,  8, 10}, {10,  4, 18,  9, 11}, {11,  5, 19, 10, 12},
-  {12, -1, 20, 11, 13}, {13, -1, 21, 12, -1}, {14,  6, 22, -1, 15},
-  {15,  7, 23, 14, 16}, {16,  8, 24, 15, 17}, {17,  9, 25, 16, 18},
-  {18, 10, 26, 17, 19}, {19, 11, 27, 18, 20}, {20, 12, 28, 19, 21},
-  {21, 13, 29, 28, -1}, {22, 14, 30, -1, 23}, {23, 15, 31, 22, 24},
-  {24, 16, 32, 23, 25}, {25, 17, 33, 24, 26}, {26, 18, 34, 25, 27},
-  {27, 19, 35, 26, 28}, {28, 20, 36, 27, 29}, {29, 21, 37, 28, -1},
-  {30, 22, 38, -1, 31}, {31, 23, 39, 30, 32}, {32, 24, 40, 31, 33},
-  {33, 25, 41, 32, 34}, {34, 26, 42, 33, 35}, {35, 27, 43, 34, 36},
-  {36, 28, 44, 35, 37}, {37, 29, 45, 36, -1}, {38, 30, 46, -1, 39},
-  {39, 31, 47, 38, 40}, {40, 32, 48, 39, 41}, {41, 33, 49, 40, 42},
-  {42, 34, 50, 41, 43}, {43, 35, 51, 42, 44}, {44, 36, 52, 43, 45},
-  {45, 37, 53, 44, -1}, {46, 38, 54, -1, 47}, {47, 39, 55, 46, 48},
-  {48, 40, 56, 47, 49}, {49, 41, 57, 48, 50}, {50, 42, 58, 49, 51},
-  {51, 43, 59, 50, 52}, {52, 44, 60, 51, 53}, {53, 45, 61, 52, -1},
-  {54, 46, -1, -1, 55}, {55, 47, -1, 54, 56}, {56, 48, -1, 55, 57},
-  {57, 49, -1, 56, 59}, {58, 50, -1, 57, 59}, {59, 51, -1, 58, 60},
-  {60, 52, -1, 59, 61}, {61, 53, -1, 60, -1}
-};
-#endif // GC_1
-#elif defined SMEMM
-unsigned int gcmem_mixed_threshold = 0;
-unsigned int gcmem_mixed_usedmem = 0;
-#define NUM_CORES2TEST 9
-#ifdef GC_1
-int core2test[1][NUM_CORES2TEST] = {
-  {0, -1, -1, -1, -1, -1, -1, -1, -1}
-};
-#elif defined GC_56
-int core2test[56][NUM_CORES2TEST] = {
-  { 0, -1,  7, -1,  1, -1, 14, -1,  2}, 
-  { 1, -1,  8,  0,  2, -1, 15, -1,  3}, 
-  { 2, -1,  9,  1,  3, -1, 16,  0,  4}, 
-  { 3, -1, 10,  2,  4, -1, 17,  1,  5}, 
-  { 4, -1, 11,  3,  5, -1, 18,  2,  6}, 
-  { 5, -1, 12,  4,  6, -1, 19,  3, -1},
-  { 6, -1, 13,  5, -1, -1, 20,  4, -1}, 
-  { 7,  0, 14, -1,  8, -1, 21, -1,  9}, 
-  { 8,  1, 15,  7,  9, -1, 22, -1, 10}, 
-  { 9,  2, 16,  8, 10, -1, 23,  7, 11}, 
-  {10,  3, 17,  9, 11, -1, 24,  8, 12}, 
-  {11,  4, 18, 10, 12, -1, 25,  9, 13},
-  {12,  5, 19, 11, 13, -1, 26, 10, -1}, 
-  {13,  6, 20, 12, -1, -1, 27, 11, -1}, 
-  {14,  7, 21, -1, 15,  0, 28, -1, 16}, 
-  {15,  8, 22, 14, 16,  1, 29, -1, 17}, 
-  {16,  9, 23, 15, 17,  2, 30, 14, 18}, 
-  {17, 10, 24, 16, 18,  3, 31, 15, 19},
-  {18, 11, 25, 17, 19,  4, 32, 16, 20}, 
-  {19, 12, 26, 18, 20,  5, 33, 17, -1}, 
-  {20, 13, 27, 19, -1,  6, 34, 18, -1}, 
-  {21, 14, 28, -1, 22,  7, 35, -1, 23}, 
-  {22, 15, 29, 21, 23,  8, 36, -1, 24}, 
-  {23, 16, 30, 22, 24,  9, 37, 21, 25},
-  {24, 17, 31, 23, 25, 10, 38, 22, 26}, 
-  {25, 18, 32, 24, 26, 11, 39, 23, 27}, 
-  {26, 19, 33, 25, 27, 12, 40, 24, -1}, 
-  {27, 20, 34, 26, -1, 13, 41, 25, -1}, 
-  {28, 21, 35, -1, 29, 14, 42, -1, 30}, 
-  {29, 22, 36, 28, 30, 15, 43, -1, 31},
-  {30, 23, 37, 29, 31, 16, 44, 28, 32}, 
-  {31, 24, 38, 30, 32, 17, 45, 29, 33}, 
-  {32, 25, 39, 31, 33, 18, 46, 30, 34}, 
-  {33, 26, 40, 32, 34, 19, 47, 31, -1}, 
-  {34, 27, 41, 33, -1, 20, 48, 32, -1}, 
-  {35, 28, 42, -1, 36, 21, 49, -1, 37},
-  {36, 29, 43, 35, 37, 22, 50, -1, 38}, 
-  {37, 30, 44, 36, 38, 23, 51, 35, 39}, 
-  {38, 31, 45, 37, 39, 24, 52, 36, 40}, 
-  {39, 32, 46, 38, 40, 25, 53, 37, 41}, 
-  {40, 33, 47, 39, 41, 26, 54, 38, -1}, 
-  {41, 34, 48, 40, -1, 27, 55, 39, -1},
-  {42, 35, 49, -1, 43, 28, -1, -1, 44}, 
-  {43, 36, 50, 42, 44, 29, -1, -1, 45}, 
-  {44, 37, 51, 43, 45, 30, -1, 42, 46}, 
-  {45, 38, 52, 44, 46, 31, -1, 43, 47}, 
-  {46, 39, 53, 45, 47, 32, -1, 44, 48}, 
-  {47, 40, 54, 46, 48, 33, -1, 45, -1},
-  {48, 41, 55, 47, -1, 34, -1, 46, -1}, 
-  {49, 42, -1, -1, 50, 35, -1, -1, 51}, 
-  {50, 43, -1, 49, 51, 36, -1, -1, 52}, 
-  {51, 44, -1, 50, 52, 37, -1, 49, 53}, 
-  {52, 45, -1, 51, 53, 38, -1, 50, 54}, 
-  {53, 46, -1, 52, 54, 39, -1, 51, 55},
-  {54, 47, -1, 53, 55, 40, -1, 52, -1}, 
-  {55, 48, -1, 54, -1, 41, -1, 53, -1}
-};
-#elif defined GC_62
-int core2test[62][NUM_CORES2TEST] = {
-  { 0, -1,  6, -1,  1, -1, 14, -1,  2}, 
-  { 1, -1,  7,  0,  2, -1, 15, -1,  3}, 
-  { 2, -1,  8,  1,  3, -1, 16,  0,  4}, 
-  { 3, -1,  9,  2,  4, -1, 17,  1,  5}, 
-  { 4, -1, 10,  3,  5, -1, 18,  2, -1}, 
-  { 5, -1, 11,  4, -1, -1, 19,  3, -1},
-  { 6,  0, 14, -1,  7, -1, 22, -1,  8}, 
-  { 7,  1, 15,  6,  8, -1, 23, -1,  9}, 
-  { 8,  2, 16,  7,  9, -1, 24,  6, 10}, 
-  { 9,  3, 17,  8, 10, -1, 25,  7, 11}, 
-  {10,  4, 18,  9, 11, -1, 26,  8, 12}, 
-  {11,  5, 19, 10, 12, -1, 27,  9, 13},
-  {12, -1, 20, 11, 13, -1, 28, 10, -1}, 
-  {13, -1, 21, 12, -1, -1, 29, 11, -1}, 
-  {14,  6, 22, -1, 15,  0, 30, -1, 16}, 
-  {15,  7, 23, 14, 16,  1, 31, -1, 17}, 
-  {16,  8, 24, 15, 17,  2, 32, 14, 18}, 
-  {17,  9, 25, 16, 18,  3, 33, 15, 19},
-  {18, 10, 26, 17, 19,  4, 34, 16, 20}, 
-  {19, 11, 27, 18, 20,  5, 35, 17, 21}, 
-  {20, 12, 28, 19, 21, -1, 36, 18, -1}, 
-  {21, 13, 29, 28, -1, -1, 37, 19, -1}, 
-  {22, 14, 30, -1, 23,  6, 38, -1, 24}, 
-  {23, 15, 31, 22, 24,  7, 39, -1, 25},
-  {24, 16, 32, 23, 25,  8, 40, 22, 26}, 
-  {25, 17, 33, 24, 26,  9, 41, 23, 27}, 
-  {26, 18, 34, 25, 27, 10, 42, 24, 28}, 
-  {27, 19, 35, 26, 28, 11, 43, 25, 29}, 
-  {28, 20, 36, 27, 29, 12, 44, 26, -1}, 
-  {29, 21, 37, 28, -1, 13, 45, 27, -1},
-  {30, 22, 38, -1, 31, 22, 46, -1, 32}, 
-  {31, 23, 39, 30, 32, 15, 47, -1, 33}, 
-  {32, 24, 40, 31, 33, 16, 48, 30, 34}, 
-  {33, 25, 41, 32, 34, 17, 49, 31, 35}, 
-  {34, 26, 42, 33, 35, 18, 50, 32, 36}, 
-  {35, 27, 43, 34, 36, 19, 51, 33, 37},
-  {36, 28, 44, 35, 37, 20, 52, 34, -1}, 
-  {37, 29, 45, 36, -1, 21, 53, 35, -1}, 
-  {38, 30, 46, -1, 39, 22, 54, -1, 40}, 
-  {39, 31, 47, 38, 40, 23, 55, -1, 41}, 
-  {40, 32, 48, 39, 41, 24, 56, 38, 42}, 
-  {41, 33, 49, 40, 42, 25, 57, 39, 43},
-  {42, 34, 50, 41, 43, 26, 58, 40, 44}, 
-  {43, 35, 51, 42, 44, 27, 59, 41, 45}, 
-  {44, 36, 52, 43, 45, 28, 60, 42, -1}, 
-  {45, 37, 53, 44, -1, 29, 61, 43, -1}, 
-  {46, 38, 54, -1, 47, 30, -1, -1, 48}, 
-  {47, 39, 55, 46, 48, 31, -1, -1, 49},
-  {48, 40, 56, 47, 49, 32, -1, 46, 50}, 
-  {49, 41, 57, 48, 50, 33, -1, 47, 51}, 
-  {50, 42, 58, 49, 51, 34, -1, 48, 52}, 
-  {51, 43, 59, 50, 52, 35, -1, 49, 53}, 
-  {52, 44, 60, 51, 53, 36, -1, 50, -1}, 
-  {53, 45, 61, 52, -1, 37, -1, 51, -1},
-  {54, 46, -1, -1, 55, 38, -1, -1, 56}, 
-  {55, 47, -1, 54, 56, 39, -1, -1, 57}, 
-  {56, 48, -1, 55, 57, 40, -1, 54, 58}, 
-  {57, 49, -1, 56, 59, 41, -1, 55, 59}, 
-  {58, 50, -1, 57, 59, 42, -1, 56, 60}, 
-  {59, 51, -1, 58, 60, 43, -1, 57, 61},
-  {60, 52, -1, 59, 61, 44, -1, 58, -1}, 
-  {61, 53, -1, 60, -1, 45, -1, 59, -1}
-};
-#endif // GC_1
-#endif
-
-inline __attribute__((always_inline))
-void setupsmemmode(void) {
-#ifdef SMEML
-  // Only allocate local mem chunks to each core.
-  // If a core has used up its local shared memory, start gc.
-  bamboo_smem_mode = SMEMLOCAL;
-#elif defined SMEMF
-  // Allocate the local shared memory to each core with the highest priority,
-  // if a core has used up its local shared memory, try to allocate the 
-  // shared memory that belong to its neighbours, if also failed, start gc.
-  bamboo_smem_mode = SMEMFIXED;
-#elif defined SMEMM
-  // Allocate the local shared memory to each core with the highest priority,
-  // if a core has used up its local shared memory, try to allocate the 
-  // shared memory that belong to its neighbours first, if failed, check 
-  // current memory allocation rate, if it has already reached the threshold,
-  // start gc, otherwise, allocate the shared memory globally.  If all the 
-  // shared memory has been used up, start gc.
-  bamboo_smem_mode = SMEMMIXED;
-#elif defined SMEMG
-  // Allocate all the memory chunks globally, do not consider the host cores
-  // When all the shared memory are used up, start gc.
-  bamboo_smem_mode = SMEMGLOBAL;
-#else
-  // defaultly using local mode
-  bamboo_smem_mode = SMEMLOCAL;
-  //bamboo_smem_mode = SMEMGLOBAL;
-  //bamboo_smem_mode = SMEMFIXED;
-#endif
-} // void setupsmemmode(void)
-#endif
-
-inline __attribute__((always_inline))
-void initruntimedata() {
-  int i;
-  // initialize the arrays
-  if(STARTUPCORE == BAMBOO_NUM_OF_CORE) {
-    // startup core to initialize corestatus[]
-    for(i = 0; i < NUMCORESACTIVE; ++i) {
-      corestatus[i] = 1;
-      numsendobjs[i] = 0;
-      numreceiveobjs[i] = 0;
-#ifdef PROFILE
-      // initialize the profile data arrays
-      profilestatus[i] = 1;
-#endif
-#ifdef MULTICORE_GC
-      gccorestatus[i] = 1;
-      gcnumsendobjs[0][i] = gcnumsendobjs[1][i] = 0;
-      gcnumreceiveobjs[0][i] = gcnumreceiveobjs[1][i] = 0;
-#endif
-    } // for(i = 0; i < NUMCORESACTIVE; ++i)
-#ifdef MULTICORE_GC
-    for(i = 0; i < NUMCORES4GC; ++i) {
-      gcloads[i] = 0;
-      gcrequiredmems[i] = 0;
-      gcstopblock[i] = 0;
-      gcfilledblocks[i] = 0;
-    } // for(i = 0; i < NUMCORES4GC; ++i)
-#ifdef GC_PROFILE
-    gc_infoIndex = 0;
-    gc_infoOverflow = false;
-       gc_num_livespace = 0;
-       gc_num_freespace = 0;
-#endif
-#endif
-    numconfirm = 0;
-    waitconfirm = false;
-
-    // TODO for test
-    total_num_t6 = 0;
-  }
-
-  busystatus = true;
-  self_numsendobjs = 0;
-  self_numreceiveobjs = 0;
-
-  for(i = 0; i < BAMBOO_MSG_BUF_LENGTH; ++i) {
-    msgdata[i] = -1;
-  }
-  msgdataindex = 0;
-  msgdatalast = 0;
-  msglength = BAMBOO_MSG_BUF_LENGTH;
-  msgdatafull = false;
-  for(i = 0; i < BAMBOO_OUT_BUF_LENGTH; ++i) {
-    outmsgdata[i] = -1;
-  }
-  outmsgindex = 0;
-  outmsglast = 0;
-  outmsgleft = 0;
-  isMsgHanging = false;
-  //isMsgSending = false;
-
-  smemflag = true;
-  bamboo_cur_msp = NULL;
-  bamboo_smem_size = 0;
-  totransobjqueue = createQueue_I();
-
-#ifdef MULTICORE_GC
-  bamboo_smem_zero_top = NULL;
-  gcflag = false;
-  gcprocessing = false;
-  gcphase = FINISHPHASE;
-  //gcnumpre = 0;
-  gcprecheck = true;
-  gccurr_heaptop = 0;
-  gcself_numsendobjs = 0;
-  gcself_numreceiveobjs = 0;
-  gcmarkedptrbound = 0;
-#ifdef LOCALHASHTBL_TEST
-  gcpointertbl = allocateRuntimeHash_I(20);
-#else
-  gcpointertbl = mgchashCreate_I(2000, 0.75);
-#endif
-  //gcpointertbl = allocateMGCHash_I(20);
-  gcforwardobjtbl = allocateMGCHash_I(20, 3);
-  gcobj2map = 0;
-  gcmappedobj = 0;
-  //gcismapped = false;
-  gcnumlobjs = 0;
-  gcheaptop = 0;
-  gctopcore = 0;
-  gctopblock = 0;
-  gcmovestartaddr = 0;
-  gctomove = false;
-  gcmovepending = 0;
-  gcblock2fill = 0;
-  gcsbstarttbl = BAMBOO_BASE_VA;
-  bamboo_smemtbl = (void *)gcsbstarttbl
-               + (BAMBOO_SHARED_MEM_SIZE/BAMBOO_SMEM_SIZE)*sizeof(INTPTR);
-  if(BAMBOO_NUM_OF_CORE < NUMCORES4GC) {
-       int t_size = ((BAMBOO_RMSP_SIZE)-sizeof(mgcsharedhashtbl_t)*2
-               -128*sizeof(size_t))/sizeof(mgcsharedhashlistnode_t)-2;
-       int kk = 0;
-       unsigned int tmp_k = 1 << (sizeof(int)*8 -1);
-       while(((t_size & tmp_k) == 0) && (kk < sizeof(int)*8)) {
-         t_size = t_size << 1;
-         kk++;
-       }
-       t_size = tmp_k >> kk;
-       gcsharedptbl = mgcsharedhashCreate_I(t_size,0.30);//allocateGCSharedHash_I(20);
-  } else {
-       gcsharedptbl = NULL;
-  }
-  BAMBOO_MEMSET_WH(gcrpointertbls, 0, 
-         sizeof(mgcsharedhashtbl_t *)*NUMCORES4GC);
-         //sizeof(struct RuntimeHash *)*NUMCORES4GC);
-#ifdef SMEMM
-  gcmem_mixed_threshold = (unsigned int)((BAMBOO_SHARED_MEM_SIZE
-               -bamboo_reserved_smem*BAMBOO_SMEM_SIZE)*0.8);
-  gcmem_mixed_usedmem = 0;
-#endif
-#ifdef GC_PROFILE
-  gc_num_obj = 0;
-  gc_num_liveobj = 0;
-  gc_num_forwardobj = 0;
-  gc_num_profiles = NUMCORESACTIVE - 1;
-#endif
-#ifdef GC_FLUSH_DTLB
-  gc_num_flush_dtlb = 0;
-#endif
-  gc_localheap_s = false;
-#ifdef GC_CACHE_ADAPT
-  gccachestage = false;
-  // enable the timer interrupt
-  bamboo_tile_timer_set_next_event(500000000); // TODO
-  bamboo_unmask_timer_intr();
-  bamboo_dtlb_sampling_process();
-#endif // GC_CACHE_ADAPT
+  // do nothing
 #else
   // create the lock table, lockresult table and obj queue
   locktable.size = 20;
@@ -399,51 +41,37 @@ void initruntimedata() {
   lockRedirectTbl = allocateRuntimeHash_I(20);
   objRedirectLockTbl = allocateRuntimeHash_I(20);
 #endif
-#ifndef INTERRUPT
-  reside = false;
+}
+
+INLINE void dislocktable() {
+#ifdef MULTICORE_GC
+  // do nothing
+#else
+  freeRuntimeHash(lockRedirectTbl);
+  freeRuntimeHash(objRedirectLockTbl);
+  RUNFREE(locktable.bucket);
 #endif
+}
+
+void inittaskdata() {
+  if(STARTUPCORE == BAMBOO_NUM_OF_CORE) {
+    // startup core to initialize corestatus[]
+    total_num_t6 = 0; // TODO for test
+  }
+  totransobjqueue = createQueue_I();
   objqueue.head = NULL;
   objqueue.tail = NULL;
-
   currtpd = NULL;
-
-#ifdef PROFILE
-  stall = false;
-  //isInterrupt = true;
-  totalexetime = -1;
-  //interrupttime = 0;
-  taskInfoIndex = 0;
-  taskInfoOverflow = false;
-#ifdef PROFILE_INTERRUPT
-  interruptInfoIndex = 0;
-  interruptInfoOverflow = false;
-#endif // PROFILE_INTERRUPT
-#endif // PROFILE
-
-  for(i = 0; i < MAXTASKPARAMS; i++) {
+  for(int i = 0; i < MAXTASKPARAMS; i++) {
     runtime_locks[i].redirectlock = 0;
     runtime_locks[i].value = 0;
   }
   runtime_locklen = 0;
+  initlocktable();
+  INIT_TASKPROFILE_DATA();
 }
 
-inline __attribute__((always_inline))
-void disruntimedata() {
-#ifdef MULTICORE_GC
-#ifdef LOCALHASHTBL_TEST
-  freeRuntimeHash(gcpointertbl);
-#else
-  mgchashDelete(gcpointertbl);
-#endif
-  //freeMGCHash(gcpointertbl);
-  freeMGCHash(gcforwardobjtbl);
-  // for mapping info structures
-  //freeRuntimeHash(gcrcoretbl);
-#else
-  freeRuntimeHash(lockRedirectTbl);
-  freeRuntimeHash(objRedirectLockTbl);
-  RUNFREE(locktable.bucket);
-#endif
+void distaskdata() {
   if(activetasks != NULL) {
     genfreehashtable(activetasks);
   }
@@ -452,54 +80,35 @@ void disruntimedata() {
     RUNFREE(currtpd);
     currtpd = NULL;
   }
-  BAMBOO_LOCAL_MEM_CLOSE();
-  BAMBOO_SHARE_MEM_CLOSE();
+  dislocktable();
 }
 
-inline __attribute__((always_inline))
-bool checkObjQueue() {
+INLINE bool checkObjQueue() {
   bool rflag = false;
   struct transObjInfo * objInfo = NULL;
   int grount = 0;
 
-#ifdef PROFILE
 #ifdef ACCURATEPROFILE
-  bool isChecking = false;
-  if(!isEmpty(&objqueue)) {
-    profileTaskStart("objqueue checking");
-    isChecking = true;
-  }       // if(!isEmpty(&objqueue))
-#endif
+  PROFILE_TASK_START("objqueue checking");
 #endif
 
   while(!isEmpty(&objqueue)) {
     void * obj = NULL;
     BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
-#ifdef DEBUG
-    BAMBOO_DEBUGPRINT(0xf001);
-#endif
-#ifdef PROFILE
-    //isInterrupt = false;
-#endif
-#ifdef DEBUG
-    BAMBOO_DEBUGPRINT(0xeee1);
-#endif
     rflag = true;
     objInfo = (struct transObjInfo *)getItem(&objqueue);
     obj = objInfo->objptr;
-#ifdef DEBUG
-    BAMBOO_DEBUGPRINT_REG((int)obj);
-#endif
     // grab lock and flush the obj
     grount = 0;
-    getwritelock_I(obj);
+    struct ___Object___ * tmpobj = (struct ___Object___ *)obj;
+    while(tmpobj->lock != NULL) {
+      tmpobj = (struct ___Object___ *)(tmpobj->lock);
+    }
+    getwritelock_I(tmpobj);
     while(!lockflag) {
-      BAMBOO_WAITING_FOR_LOCK(0);
-    }   // while(!lockflag)
+      BAMBOO_WAITING_FOR_LOCK_I();
+    } 
     grount = lockresult;
-#ifdef DEBUG
-    BAMBOO_DEBUGPRINT_REG(grount);
-#endif
 
     lockresult = 0;
     lockobj = 0;
@@ -512,33 +121,20 @@ bool checkObjQueue() {
     if(grount == 1) {
       int k = 0;
       // flush the object
-#ifdef CACHEFLUSH
       BAMBOO_CACHE_FLUSH_RANGE((int)obj,sizeof(int));
-      BAMBOO_CACHE_FLUSH_RANGE((int)obj,
-                 classsize[((struct ___Object___ *)obj)->type]);
-#endif
+      BAMBOO_CACHE_FLUSH_RANGE((int)obj, 
+          classsize[((struct ___Object___ *)obj)->type]);
       // enqueue the object
-      for(k = 0; k < objInfo->length; ++k) {
-               int taskindex = objInfo->queues[2 * k];
-               int paramindex = objInfo->queues[2 * k + 1];
-               struct parameterwrapper ** queues =
-                 &(paramqueues[BAMBOO_NUM_OF_CORE][taskindex][paramindex]);
-#ifdef DEBUG
-               BAMBOO_DEBUGPRINT_REG(taskindex);
-               BAMBOO_DEBUGPRINT_REG(paramindex);
-               struct ___Object___ * tmpptr = (struct ___Object___ *)obj;
-               tprintf("Process %x(%d): receive obj %x(%lld), ptrflag %x\n",
-                               BAMBOO_NUM_OF_CORE, BAMBOO_NUM_OF_CORE, (int)obj,
-                               (long)obj, tmpptr->flag);
-#endif
-               enqueueObject_I(obj, queues, 1);
-#ifdef DEBUG
-               BAMBOO_DEBUGPRINT_REG(hashsize(activetasks));
-#endif
-      }  // for(k = 0; k < objInfo->length; ++k)
-      releasewritelock_I(obj);
-      RUNFREE(objInfo->queues);
-      RUNFREE(objInfo);
+      for(k = 0; k < objInfo->length; k++) {
+       int taskindex = objInfo->queues[2 * k];
+       int paramindex = objInfo->queues[2 * k + 1];
+       struct parameterwrapper ** queues =
+         &(paramqueues[BAMBOO_NUM_OF_CORE][taskindex][paramindex]);
+       enqueueObject_I(obj, queues, 1);
+      } 
+      releasewritelock_I(tmpobj);
+      RUNFREE_I(objInfo->queues);
+      RUNFREE_I(objInfo);
     } else {
       // can not get lock
       // put it at the end of the queue if no update version in the queue
@@ -550,365 +146,36 @@ bool checkObjQueue() {
                if(tmpinfo->objptr == obj) {
                  // the same object in the queue, which should be enqueued
                  // recently. Current one is outdate, do not re-enqueue it
-                 RUNFREE(objInfo->queues);
-                 RUNFREE(objInfo);
+                 RUNFREE_I(objInfo->queues);
+                 RUNFREE_I(objInfo);
                  goto objqueuebreak;
                } else {
                  prev = qitem;
-               }  // if(tmpinfo->objptr == obj)
+               } 
                qitem = getNextQueueItem(prev);
-         }  // while(qitem != NULL)
+         } 
       // try to execute active tasks already enqueued first
       addNewItem_I(&objqueue, objInfo);
-#ifdef PROFILE
-      //isInterrupt = true;
-#endif
 objqueuebreak:
       BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
-#ifdef DEBUG
-      BAMBOO_DEBUGPRINT(0xf000);
-#endif
       break;
-    }  // if(grount == 1)
+    } 
     BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
-#ifdef DEBUG
-    BAMBOO_DEBUGPRINT(0xf000);
-#endif
-  }  // while(!isEmpty(&objqueue))
+  }
 
-#ifdef PROFILE
 #ifdef ACCURATEPROFILE
-  if(isChecking) {
-    profileTaskEnd();
-  }  // if(isChecking)
-#endif
+  PROFILE_TASK_END();
 #endif
 
-#ifdef DEBUG
-  BAMBOO_DEBUGPRINT(0xee02);
-#endif
   return rflag;
 }
 
-inline __attribute__((always_inline))
-void checkCoreStatus() {
-  bool allStall = false;
-  int i = 0;
-  int sumsendobj = 0;
-  if((!waitconfirm) ||
-     (waitconfirm && (numconfirm == 0))) {
-#ifdef DEBUG
-    BAMBOO_DEBUGPRINT(0xee04);
-    BAMBOO_DEBUGPRINT_REG(waitconfirm);
-#endif
-    BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
-#ifdef DEBUG
-    BAMBOO_DEBUGPRINT(0xf001);
-#endif
-    corestatus[BAMBOO_NUM_OF_CORE] = 0;
-    numsendobjs[BAMBOO_NUM_OF_CORE] = self_numsendobjs;
-    numreceiveobjs[BAMBOO_NUM_OF_CORE] = self_numreceiveobjs;
-    // check the status of all cores
-    allStall = true;
-#ifdef DEBUG
-    BAMBOO_DEBUGPRINT_REG(NUMCORESACTIVE);
-#endif
-    for(i = 0; i < NUMCORESACTIVE; ++i) {
-#ifdef DEBUG
-      BAMBOO_DEBUGPRINT(0xe000 + corestatus[i]);
-#endif
-      if(corestatus[i] != 0) {
-               allStall = false;
-               break;
-      }
-    }  // for(i = 0; i < NUMCORESACTIVE; ++i)
-    if(allStall) {
-      // check if the sum of send objs and receive obj are the same
-      // yes->check if the info is the latest; no->go on executing
-      sumsendobj = 0;
-      for(i = 0; i < NUMCORESACTIVE; ++i) {
-               sumsendobj += numsendobjs[i];
-#ifdef DEBUG
-               BAMBOO_DEBUGPRINT(0xf000 + numsendobjs[i]);
-#endif
-      }  // for(i = 0; i < NUMCORESACTIVE; ++i)
-      for(i = 0; i < NUMCORESACTIVE; ++i) {
-               sumsendobj -= numreceiveobjs[i];
-#ifdef DEBUG
-               BAMBOO_DEBUGPRINT(0xf000 + numreceiveobjs[i]);
-#endif
-      }  // for(i = 0; i < NUMCORESACTIVE; ++i)
-      if(0 == sumsendobj) {
-               if(!waitconfirm) {
-                 // the first time found all cores stall
-                 // send out status confirm msg to all other cores
-                 // reset the corestatus array too
-#ifdef DEBUG
-                 BAMBOO_DEBUGPRINT(0xee05);
-#endif
-                 corestatus[BAMBOO_NUM_OF_CORE] = 1;
-                 waitconfirm = true;
-                 numconfirm = NUMCORESACTIVE - 1;
-                 BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
-                 for(i = 1; i < NUMCORESACTIVE; ++i) {
-                       corestatus[i] = 1;
-                       // send status confirm msg to core i
-                       send_msg_1(i, STATUSCONFIRM, false);
-                 }   // for(i = 1; i < NUMCORESACTIVE; ++i)
-                 return;
-               } else {
-                 // all the core status info are the latest
-                 // terminate; for profiling mode, send request to all
-                 // other cores to pour out profiling data
-#ifdef DEBUG
-                 BAMBOO_DEBUGPRINT(0xee06);
-#endif
-
-#ifdef USEIO
-                 totalexetime = BAMBOO_GET_EXE_TIME() - bamboo_start_time;
-#else
-#ifdef PROFILE
-                 //BAMBOO_DEBUGPRINT_REG(interrupttime);
-#endif
-
-                 BAMBOO_DEBUGPRINT(BAMBOO_GET_EXE_TIME() - bamboo_start_time);
-                 //BAMBOO_DEBUGPRINT_REG(total_num_t6); // TODO for test
-#ifdef GC_FLUSH_DTLB
-                 BAMBOO_DEBUGPRINT_REG(gc_num_flush_dtlb);
-#endif
-#ifndef BAMBOO_MEMPROF
-                 BAMBOO_DEBUGPRINT(0xbbbbbbbb);
-#endif
-#endif
-                 // profile mode, send msgs to other cores to request pouring
-                 // out progiling data
-#ifdef PROFILE
-                 BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
-#ifdef DEBUG
-                 BAMBOO_DEBUGPRINT(0xf000);
-#endif
-                 for(i = 1; i < NUMCORESACTIVE; ++i) {
-                       // send profile request msg to core i
-                       send_msg_2(i, PROFILEOUTPUT, totalexetime, false);
-                 } // for(i = 1; i < NUMCORESACTIVE; ++i)
-#ifndef RT_TEST
-                 // pour profiling data on startup core
-                 outputProfileData();
-#endif
-                 while(true) {
-                       BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
-#ifdef DEBUG
-                       BAMBOO_DEBUGPRINT(0xf001);
-#endif
-                       profilestatus[BAMBOO_NUM_OF_CORE] = 0;
-                       // check the status of all cores
-                       allStall = true;
-#ifdef DEBUG
-                       BAMBOO_DEBUGPRINT_REG(NUMCORESACTIVE);
-#endif
-                       for(i = 0; i < NUMCORESACTIVE; ++i) {
-#ifdef DEBUG
-                         BAMBOO_DEBUGPRINT(0xe000 + profilestatus[i]);
-#endif
-                         if(profilestatus[i] != 0) {
-                               allStall = false;
-                               break;
-                         }
-                       }  // for(i = 0; i < NUMCORESACTIVE; ++i)
-                       if(!allStall) {
-                         int halt = 100;
-                         BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
-#ifdef DEBUG
-                         BAMBOO_DEBUGPRINT(0xf000);
-#endif
-                         while(halt--) {
-                         }
-                       } else {
-                         BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
-                         break;
-                       }  // if(!allStall)
-                 }  // while(true)
-#endif
-
-                 // gc_profile mode, output gc prfiling data
-#ifdef MULTICORE_GC
-#ifdef GC_CACHE_ADAPT
-                 bamboo_mask_timer_intr(); // disable the TILE_TIMER interrupt
-#endif // GC_CACHE_ADAPT
-#ifdef GC_PROFILE
-                 gc_outputProfileData();
-#endif // #ifdef GC_PROFILE
-#endif // #ifdef MULTICORE_GC
-                 disruntimedata();
-                 BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
-                 terminate();  // All done.
-               }  // if(!waitconfirm)
-      } else {
-               // still some objects on the fly on the network
-               // reset the waitconfirm and numconfirm
-#ifdef DEBUG
-               BAMBOO_DEBUGPRINT(0xee07);
-#endif
-               waitconfirm = false;
-               numconfirm = 0;
-         }  //  if(0 == sumsendobj)
-    } else {
-      // not all cores are stall, keep on waiting
-#ifdef DEBUG
-      BAMBOO_DEBUGPRINT(0xee08);
-#endif
-      waitconfirm = false;
-      numconfirm = 0;
-    }  //  if(allStall)
-    BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
-#ifdef DEBUG
-    BAMBOO_DEBUGPRINT(0xf000);
-#endif
-  }  // if((!waitconfirm) ||
-}
-
-// main function for each core
-inline void run(void * arg) {
-  int i = 0;
-  int argc = 1;
-  char ** argv = NULL;
-  bool sendStall = false;
-  bool isfirst = true;
-  bool tocontinue = false;
-
-  corenum = BAMBOO_GET_NUM_OF_CORE();
-#ifdef DEBUG
-  BAMBOO_DEBUGPRINT(0xeeee);
-  BAMBOO_DEBUGPRINT_REG(corenum);
-  BAMBOO_DEBUGPRINT(STARTUPCORE);
-#endif
-  //BAMBOO_DEBUGPRINT(BAMBOO_GET_EXE_TIME()); // TODO
-
-  // initialize runtime data structures
-  initruntimedata();
-
-  // other architecture related initialization
-  initialization();
-  initCommunication();
-
-  initializeexithandler();
-
-  // main process of the execution module
-  if(BAMBOO_NUM_OF_CORE > NUMCORESACTIVE - 1) {
-    // non-executing cores, only processing communications
-    activetasks = NULL;
-#ifdef PROFILE
-    //isInterrupt = false;
-#endif
-    fakeExecution();
-  } else {
-    /* Create queue of active tasks */
-    activetasks=
-      genallocatehashtable((unsigned int (*)(void *)) &hashCodetpd,
-                           (int (*)(void *,void *)) &comparetpd);
-
-    /* Process task information */
-    processtasks();
-
-    if(STARTUPCORE == BAMBOO_NUM_OF_CORE) {
-      /* Create startup object */
-      createstartupobject(argc, argv);
-    }
-
-#ifdef DEBUG
-    BAMBOO_DEBUGPRINT(0xee00);
-#endif
-
-    while(true) {
-
-#ifdef MULTICORE_GC
-      // check if need to do GC
-      if(gcflag) {
-               gc(NULL);
-         }
-#endif // MULTICORE_GC
-
-      // check if there are new active tasks can be executed
-      executetasks();
-      if(busystatus) {
-               sendStall = false;
-      }
-
-#ifndef INTERRUPT
-      while(receiveObject() != -1) {
-      }
-#endif
-
-#ifdef DEBUG
-      BAMBOO_DEBUGPRINT(0xee01);
-#endif
-
-      // check if there are some pending objects,
-      // if yes, enqueue them and executetasks again
-      tocontinue = checkObjQueue();
-
-      if(!tocontinue) {
-               // check if stop
-               if(STARTUPCORE == BAMBOO_NUM_OF_CORE) {
-                 if(isfirst) {
-#ifdef DEBUG
-                       BAMBOO_DEBUGPRINT(0xee03);
-#endif
-                       isfirst = false;
-                 }
-                 checkCoreStatus();
-               } else {
-                 if(!sendStall) {
-#ifdef DEBUG
-                       BAMBOO_DEBUGPRINT(0xee09);
-#endif
-#ifdef PROFILE
-                       if(!stall) {
-#endif
-                       if(isfirst) {
-                         // wait for some time
-                         int halt = 10000;
-#ifdef DEBUG
-                         BAMBOO_DEBUGPRINT(0xee0a);
-#endif
-                         while(halt--) {
-                         }
-                         isfirst = false;
-                       } else {
-                         // send StallMsg to startup core
-#ifdef DEBUG
-                         BAMBOO_DEBUGPRINT(0xee0b);
-#endif
-                         // send stall msg
-                         send_msg_4(STARTUPCORE, TRANSTALL, BAMBOO_NUM_OF_CORE,
-                                                self_numsendobjs, self_numreceiveobjs, false);
-                         sendStall = true;
-                         isfirst = true;
-                         busystatus = false;
-                       }
-#ifdef PROFILE
-                 }
-#endif
-                 } else {
-                       isfirst = true;
-                       busystatus = false;
-#ifdef DEBUG
-                       BAMBOO_DEBUGPRINT(0xee0c);
-#endif
-                 }   // if(!sendStall)
-               }   // if(STARTUPCORE == BAMBOO_NUM_OF_CORE)
-      }  // if(!tocontinue)
-    }  // while(true)
-  } // if(BAMBOO_NUM_OF_CORE > NUMCORESACTIVE - 1)
-
-} // run()
-
 struct ___createstartupobject____I_locals {
   INTPTR size;
   void * next;
   struct  ___StartupObject___ * ___startupobject___;
   struct ArrayObject * ___stringarray___;
-}; // struct ___createstartupobject____I_locals
+};
 
 void createstartupobject(int argc,
                          char ** argv) {
@@ -949,9 +216,7 @@ void createstartupobject(int argc,
   /* Set initialized flag for startup object */
   flagorandinit(startupobject,1,0xFFFFFFFF);
   enqueueObject(startupobject, NULL, 0);
-#ifdef CACHEFLUSH
   BAMBOO_CACHE_FLUSH_ALL();
-#endif
 }
 
 int hashCodetpd(struct taskparamdescriptor *ftd) {
@@ -1069,46 +334,43 @@ void tagset(struct ___Object___ * obj,
     } else {
       struct ArrayObject *ao=(struct ArrayObject *) tagset;
       if (ao->___cachedCode___<ao->___length___) {
-               ARRAYSET(ao, struct ___Object___*, ao->___cachedCode___++, obj);
+       ARRAYSET(ao, struct ___Object___*, ao->___cachedCode___++, obj);
       } else {
-               int i;
+       int i;
 #ifdef MULTICORE_GC
-               int ptrarray[]={2, (int) ptr, (int) obj, (int)tagd};
-               struct ArrayObject * aonew=
-                 allocate_newarray(&ptrarray,OBJECTARRAYTYPE,
-                                                       OBJECTARRAYINTERVAL+ao->___length___);
-               obj=(struct ___Object___ *)ptrarray[2];
-               tagd=(struct ___TagDescriptor___ *)ptrarray[3];
-               ao=(struct ArrayObject *)tagd->flagptr;
+       int ptrarray[]={2, (int) ptr, (int) obj, (int)tagd};
+       struct ArrayObject * aonew=
+         allocate_newarray(&ptrarray,OBJECTARRAYTYPE,
+                           OBJECTARRAYINTERVAL+ao->___length___);
+       obj=(struct ___Object___ *)ptrarray[2];
+       tagd=(struct ___TagDescriptor___ *)ptrarray[3];
+       ao=(struct ArrayObject *)tagd->flagptr;
 #else
-               struct ArrayObject * aonew=allocate_newarray(OBJECTARRAYTYPE,
-                       OBJECTARRAYINTERVAL+ao->___length___);
+       struct ArrayObject * aonew=allocate_newarray(OBJECTARRAYTYPE,
+                                                    OBJECTARRAYINTERVAL+ao->___length___);
 #endif
-               aonew->___cachedCode___=ao->___cachedCode___+1;
-               for(i=0; i<ao->___length___; i++) {
-                 ARRAYSET(aonew, struct ___Object___*, i,
-                                  ARRAYGET(ao, struct ___Object___*, i));
-               }
-               ARRAYSET(aonew, struct ___Object___ *, ao->___cachedCode___, obj);
-               tagd->flagptr=(struct ___Object___ *) aonew;
+       aonew->___cachedCode___=ao->___cachedCode___+1;
+       for(i=0; i<ao->___length___; i++) {
+         ARRAYSET(aonew, struct ___Object___*, i,
+                  ARRAYGET(ao, struct ___Object___*, i));
+       }
+       ARRAYSET(aonew, struct ___Object___ *, ao->___cachedCode___, obj);
+       tagd->flagptr=(struct ___Object___ *) aonew;
       }
     }
   }
 }
-
 /* This function clears a tag. */
 #ifdef MULTICORE_GC
-void tagclear(void *ptr,
-              struct ___Object___ * obj,
-              struct ___TagDescriptor___ * tagd) {
+void tagclear(void *ptr, struct ___Object___ * obj, struct ___TagDescriptor___ * tagd) {
 #else
-void tagclear(struct ___Object___ * obj,
-              struct ___TagDescriptor___ * tagd) {
+void tagclear(struct ___Object___ * obj, struct ___TagDescriptor___ * tagd) {
 #endif
   /* We'll assume that tag is alway there.
      Need to statically check for this of course. */
   struct ___Object___ * tagptr=obj->___tags___;
-
+  
   if (tagptr->type==TAGTYPE) {
     if ((struct ___TagDescriptor___ *)tagptr==tagd)
       obj->___tags___=NULL;
@@ -1119,49 +381,48 @@ void tagclear(struct ___Object___ * obj,
       struct ___TagDescriptor___ * td=
         ARRAYGET(ao, struct ___TagDescriptor___ *, i);
       if (td==tagd) {
-               ao->___cachedCode___--;
-               if (i<ao->___cachedCode___)
-                 ARRAYSET(ao, struct ___TagDescriptor___ *, i,
-                         ARRAYGET(ao,struct ___TagDescriptor___*,ao->___cachedCode___));
-               ARRAYSET(ao,struct ___TagDescriptor___ *,ao->___cachedCode___, NULL);
-               if (ao->___cachedCode___==0)
-                 obj->___tags___=NULL;
-               goto PROCESSCLEAR;
+       ao->___cachedCode___--;
+       if (i<ao->___cachedCode___)
+         ARRAYSET(ao, struct ___TagDescriptor___ *, i,
+                  ARRAYGET(ao,struct ___TagDescriptor___*,ao->___cachedCode___));
+       ARRAYSET(ao,struct ___TagDescriptor___ *,ao->___cachedCode___, NULL);
+       if (ao->___cachedCode___==0)
+         obj->___tags___=NULL;
+       goto PROCESSCLEAR;
       }
     }
   }
-PROCESSCLEAR:
+ PROCESSCLEAR:
   {
     struct ___Object___ *tagset=tagd->flagptr;
     if (tagset->type!=OBJECTARRAYTYPE) {
       if (tagset==obj)
-               tagd->flagptr=NULL;
+       tagd->flagptr=NULL;
     } else {
       struct ArrayObject *ao=(struct ArrayObject *) tagset;
       int i;
       for(i=0; i<ao->___cachedCode___; i++) {
-               struct ___Object___ * tobj=ARRAYGET(ao, struct ___Object___ *, i);
-               if (tobj==obj) {
-                 ao->___cachedCode___--;
-                 if (i<ao->___cachedCode___)
-                       ARRAYSET(ao, struct ___Object___ *, i,
-                               ARRAYGET(ao, struct ___Object___ *, ao->___cachedCode___));
-                 ARRAYSET(ao, struct ___Object___ *, ao->___cachedCode___, NULL);
-                 if (ao->___cachedCode___==0)
-                       tagd->flagptr=NULL;
-                 goto ENDCLEAR;
-               }
+       struct ___Object___ * tobj=ARRAYGET(ao, struct ___Object___ *, i);
+       if (tobj==obj) {
+         ao->___cachedCode___--;
+         if (i<ao->___cachedCode___)
+           ARRAYSET(ao, struct ___Object___ *, i,
+                    ARRAYGET(ao, struct ___Object___ *, ao->___cachedCode___));
+         ARRAYSET(ao, struct ___Object___ *, ao->___cachedCode___, NULL);
+         if (ao->___cachedCode___==0)
+           tagd->flagptr=NULL;
+         goto ENDCLEAR;
+       }
       }
     }
   }
-ENDCLEAR:
+ ENDCLEAR:
   return;
 }
 
 /* This function allocates a new tag. */
 #ifdef MULTICORE_GC
-struct ___TagDescriptor___ * allocate_tag(void *ptr,
-                                          int index) {
+struct ___TagDescriptor___ * allocate_tag(void *ptr, int index) {
   struct ___TagDescriptor___ * v=
     (struct ___TagDescriptor___ *) FREEMALLOC((struct garbagelist *) ptr,
                                               classsize[TAGTYPE]);
@@ -1174,59 +435,41 @@ struct ___TagDescriptor___ * allocate_tag(int index) {
   return v;
 }
 
-
-
 /* This function updates the flag for object ptr.  It or's the flag
    with the or mask and and's it with the andmask. */
 
-void flagbody(struct ___Object___ *ptr,
-              int flag,
-              struct parameterwrapper ** queues,
-              int length,
-              bool isnew);
+void flagbody(struct ___Object___ *ptr, int flag, struct parameterwrapper ** queues, int length, bool isnew);
 
 int flagcomp(const int *val1, const int *val2) {
   return (*val1)-(*val2);
 }
-
-void flagorand(void * ptr,
-               int ormask,
-               int andmask,
-               struct parameterwrapper ** queues,
-               int length) {
-  {
-    int oldflag=((int *)ptr)[1];
-    int flag=ormask|oldflag;
-    flag&=andmask;
-    flagbody(ptr, flag, queues, length, false);
-  }
+void flagorand(void * ptr, int ormask, int andmask, struct parameterwrapper ** queues, int length) {
+  int oldflag=((int *)ptr)[2]; // the flag field is now the third one
+  int flag=ormask|oldflag;
+  flag&=andmask;
+  flagbody(ptr, flag, queues, length, false);
 }
 
-bool intflagorand(void * ptr,
-                  int ormask,
-                  int andmask) {
-  {
-    int oldflag=((int *)ptr)[1];
-    int flag=ormask|oldflag;
-    flag&=andmask;
-    if (flag==oldflag)   /* Don't do anything */
-      return false;
-    else {
-      flagbody(ptr, flag, NULL, 0, false);
-      return true;
-    }
+bool intflagorand(void * ptr, int ormask, int andmask) {
+  int oldflag=((int *)ptr)[2]; // the flag field is the third one
+  int flag=ormask|oldflag;
+  flag&=andmask;
+  if (flag==oldflag)   /* Don't do anything */
+    return false;
+  else {
+    flagbody(ptr, flag, NULL, 0, false);
+    return true;
   }
 }
-
-void flagorandinit(void * ptr,
-                   int ormask,
-                   int andmask) {
-  int oldflag=((int *)ptr)[1];
+void flagorandinit(void * ptr, int ormask, int andmask) {
+  int oldflag=((int *)ptr)[2]; // the flag field is the third one
   int flag=ormask|oldflag;
   flag&=andmask;
   flagbody(ptr,flag,NULL,0,true);
 }
-
 void flagbody(struct ___Object___ *ptr,
               int flag,
               struct parameterwrapper ** vqueues,
@@ -1250,7 +493,7 @@ void flagbody(struct ___Object___ *ptr,
   ptr->flag=flag;
 
   /*Remove object from all queues */
-  for(i = 0; i < length; ++i) {
+  for(i = 0; i < length; i++) {
     flagptr = queues[i];
     ObjectHashget(flagptr->objectset, (int) ptr, (int *) &next,
                   (int *) &enterflags, &UNUSED, &UNUSED2);
@@ -1264,2195 +507,261 @@ void enqueueObject(void * vptr,
                    struct parameterwrapper ** vqueues,
                    int vlength) {
   struct ___Object___ *ptr = (struct ___Object___ *)vptr;
+  
+  {
+    struct parameterwrapper * parameter=NULL;
+    int j;
+    int i;
+    struct parameterwrapper * prevptr=NULL;
+    struct ___Object___ *tagptr=NULL;
+    struct parameterwrapper ** queues = vqueues;
+    int length = vlength;
+    if(BAMBOO_NUM_OF_CORE > NUMCORESACTIVE - 1) {
+      return;
+    }
+    if(queues == NULL) {
+      queues = objectqueues[BAMBOO_NUM_OF_CORE][ptr->type];
+      length = numqueues[BAMBOO_NUM_OF_CORE][ptr->type];
+    }
+    tagptr=ptr->___tags___;
 
-  {
-    //struct QueueItem *tmpptr;
-    struct parameterwrapper * parameter=NULL;
-    int j;
-    int i;
-    struct parameterwrapper * prevptr=NULL;
-    struct ___Object___ *tagptr=NULL;
-    struct parameterwrapper ** queues = vqueues;
-    int length = vlength;
-    if(BAMBOO_NUM_OF_CORE > NUMCORESACTIVE - 1) {
-      return;
-    }
-    if(queues == NULL) {
-      queues = objectqueues[BAMBOO_NUM_OF_CORE][ptr->type];
-      length = numqueues[BAMBOO_NUM_OF_CORE][ptr->type];
-    }
-    tagptr=ptr->___tags___;
-
-    /* Outer loop iterates through all parameter queues an object of
-       this type could be in.  */
-    for(j = 0; j < length; ++j) {
-      parameter = queues[j];
-      /* Check tags */
-      if (parameter->numbertags>0) {
-               if (tagptr==NULL)
-                 goto nextloop;  //that means the object has no tag
-               //but that param needs tag
-               else if(tagptr->type==TAGTYPE) {     //one tag
-                 //struct ___TagDescriptor___ * tag=
-                 //(struct ___TagDescriptor___*) tagptr;
-                 for(i=0; i<parameter->numbertags; i++) {
-                       //slotid is parameter->tagarray[2*i];
-                       int tagid=parameter->tagarray[2*i+1];
-                       if (tagid!=tagptr->flag)
-                         goto nextloop;   /*We don't have this tag */
-                 }
-               } else {                         //multiple tags
-                 struct ArrayObject * ao=(struct ArrayObject *) tagptr;
-                 for(i=0; i<parameter->numbertags; i++) {
-                       //slotid is parameter->tagarray[2*i];
-                       int tagid=parameter->tagarray[2*i+1];
-                       int j;
-                       for(j=0; j<ao->___cachedCode___; j++) {
-                         if (tagid==ARRAYGET(ao, struct ___TagDescriptor___*, j)->flag)
-                               goto foundtag;
-                       }
-                       goto nextloop;
-foundtag:
-                       ;
-                 }
-               }
-      }
-
-      /* Check flags */
-      for(i=0; i<parameter->numberofterms; i++) {
-               int andmask=parameter->intarray[i*2];
-               int checkmask=parameter->intarray[i*2+1];
-               if ((ptr->flag&andmask)==checkmask) {
-                 enqueuetasks(parameter, prevptr, ptr, NULL, 0);
-                 prevptr=parameter;
-                 break;
-               }
-      }
-nextloop:
-      ;
-    }
-  }
-}
-
-void enqueueObject_I(void * vptr,
-                     struct parameterwrapper ** vqueues,
-                     int vlength) {
-  struct ___Object___ *ptr = (struct ___Object___ *)vptr;
-
-  {
-    //struct QueueItem *tmpptr;
-    struct parameterwrapper * parameter=NULL;
-    int j;
-    int i;
-    struct parameterwrapper * prevptr=NULL;
-    struct ___Object___ *tagptr=NULL;
-    struct parameterwrapper ** queues = vqueues;
-    int length = vlength;
-    if(BAMBOO_NUM_OF_CORE > NUMCORESACTIVE - 1) {
-      return;
-    }
-    if(queues == NULL) {
-      queues = objectqueues[BAMBOO_NUM_OF_CORE][ptr->type];
-      length = numqueues[BAMBOO_NUM_OF_CORE][ptr->type];
-    }
-    tagptr=ptr->___tags___;
-
-    /* Outer loop iterates through all parameter queues an object of
-       this type could be in.  */
-    for(j = 0; j < length; ++j) {
-      parameter = queues[j];
-      /* Check tags */
-      if (parameter->numbertags>0) {
-               if (tagptr==NULL)
-                 goto nextloop;      //that means the object has no tag
-               //but that param needs tag
-               else if(tagptr->type==TAGTYPE) {   //one tag
-               //struct ___TagDescriptor___*tag=(struct ___TagDescriptor___*)tagptr;
-                 for(i=0; i<parameter->numbertags; i++) {
-                       //slotid is parameter->tagarray[2*i];
-                       int tagid=parameter->tagarray[2*i+1];
-                       if (tagid!=tagptr->flag)
-                         goto nextloop;            /*We don't have this tag */
-                 }
-               } else {    //multiple tags
-                 struct ArrayObject * ao=(struct ArrayObject *) tagptr;
-                 for(i=0; i<parameter->numbertags; i++) {
-                       //slotid is parameter->tagarray[2*i];
-                       int tagid=parameter->tagarray[2*i+1];
-                       int j;
-                       for(j=0; j<ao->___cachedCode___; j++) {
-                         if (tagid==ARRAYGET(ao, struct ___TagDescriptor___*, j)->flag)
-                               goto foundtag;
-                       }
-                       goto nextloop;
-foundtag:
-                       ;
-                 }
-               }
-      }
-
-      /* Check flags */
-      for(i=0; i<parameter->numberofterms; i++) {
-               int andmask=parameter->intarray[i*2];
-               int checkmask=parameter->intarray[i*2+1];
-               if ((ptr->flag&andmask)==checkmask) {
-                 enqueuetasks_I(parameter, prevptr, ptr, NULL, 0);
-                 prevptr=parameter;
-                 break;
-               }
-      }
-nextloop:
-      ;
-    }
-  }
-}
-
-
-int * getAliasLock(void ** ptrs,
-                   int length,
-                   struct RuntimeHash * tbl) {
-  if(length == 0) {
-    return (int*)(RUNMALLOC(sizeof(int)));
-  } else {
-    int i = 0;
-    int locks[length];
-    int locklen = 0;
-    bool redirect = false;
-    int redirectlock = 0;
-    for(; i < length; i++) {
-      struct ___Object___ * ptr = (struct ___Object___ *)(ptrs[i]);
-      int lock = 0;
-      int j = 0;
-      if(ptr->lock == NULL) {
-               lock = (int)(ptr);
-      } else {
-               lock = (int)(ptr->lock);
-      }
-      if(redirect) {
-               if(lock != redirectlock) {
-                 RuntimeHashadd(tbl, lock, redirectlock);
-               }
-      } else {
-               if(RuntimeHashcontainskey(tbl, lock)) {
-                 // already redirected
-                 redirect = true;
-                 RuntimeHashget(tbl, lock, &redirectlock);
-                 for(; j < locklen; j++) {
-                       if(locks[j] != redirectlock) {
-                         RuntimeHashadd(tbl, locks[j], redirectlock);
-                       }
-                 }
-               } else {
-                 bool insert = true;
-                 for(j = 0; j < locklen; j++) {
-                       if(locks[j] == lock) {
-                         insert = false;
-                         break;
-                       } else if(locks[j] > lock) {
-                         break;
-                       }
-                 }
-                 if(insert) {
-                       int h = locklen;
-                       for(; h > j; h--) {
-                         locks[h] = locks[h-1];
-                       }
-                       locks[j] = lock;
-                       locklen++;
-                 }
-               }
-      }
-    }
-    if(redirect) {
-      return (int *)redirectlock;
-    } else {
-      return (int *)(locks[0]);
-    }
-  }
-}
-
-void addAliasLock(void * ptr,
-                  int lock) {
-  struct ___Object___ * obj = (struct ___Object___ *)ptr;
-  if(((int)ptr != lock) && (obj->lock != (int*)lock)) {
-    // originally no alias lock associated or have a different alias lock
-    // flush it as the new one
-    obj->lock = (int *)lock;
-  }
-}
-
-#ifdef PROFILE
-inline void setTaskExitIndex(int index) {
-  taskInfoArray[taskInfoIndex]->exitIndex = index;
-}
-
-inline void addNewObjInfo(void * nobj) {
-  if(taskInfoArray[taskInfoIndex]->newObjs == NULL) {
-    taskInfoArray[taskInfoIndex]->newObjs = createQueue();
-  }
-  addNewItem(taskInfoArray[taskInfoIndex]->newObjs, nobj);
-}
-#endif
-
-#ifdef MULTICORE_GC
-// Only allocate local mem chunks to each core.
-// If a core has used up its local shared memory, start gc.
-void * localmalloc_I(int coren,
-                     int isize,
-                     int * allocsize) {
-  void * mem = NULL;
-  int gccorenum = (coren < NUMCORES4GC) ? (coren) : (coren % NUMCORES4GC);
-  int i = 0;
-  int j = 0;
-  int tofindb = gc_core2block[2*gccorenum+i]+(NUMCORES4GC*2)*j;
-  int totest = tofindb;
-  int bound = BAMBOO_SMEM_SIZE_L;
-  int foundsmem = 0;
-  int size = 0;
-  do {
-    bound = (totest < NUMCORES4GC) ? BAMBOO_SMEM_SIZE_L : BAMBOO_SMEM_SIZE;
-    int nsize = bamboo_smemtbl[totest];
-    bool islocal = true;
-    if(nsize < bound) {
-      bool tocheck = true;
-      // have some space in the block
-      if(totest == tofindb) {
-               // the first partition
-               size = bound - nsize;
-      } else if(nsize == 0) {
-               // an empty partition, can be appended
-               size += bound;
-      } else {
-               // not an empty partition, can not be appended
-               // the last continuous block is not big enough, go to check the next
-               // local block
-               islocal = true;
-               tocheck = false;
-      } // if(totest == tofindb) else if(nsize == 0) else ...
-      if(tocheck) {
-               if(size >= isize) {
-                 // have enough space in the block, malloc
-                 foundsmem = 1;
-                 break;
-               } else {
-                 // no enough space yet, try to append next continuous block
-                 islocal = false;
-               }  // if(size > isize) else ...
-      }  // if(tocheck)
-    } // if(nsize < bound)
-    if(islocal) {
-      // no space in the block, go to check the next block
-      i++;
-      if(2==i) {
-               i = 0;
-               j++;
-      }
-      tofindb = totest = gc_core2block[2*gccorenum+i]+(NUMCORES4GC*2)*j;
-    } else {
-      totest += 1;
-    }  // if(islocal) else ...
-    if(totest > gcnumblock-1-bamboo_reserved_smem) {
-      // no more local mem, do not find suitable block
-      foundsmem = 2;
-      break;
-    }  // if(totest > gcnumblock-1-bamboo_reserved_smem) ...
-  } while(true);
-
-  if(foundsmem == 1) {
-    // find suitable block
-    mem = gcbaseva+bamboo_smemtbl[tofindb]+((tofindb<NUMCORES4GC) ?
-          (BAMBOO_SMEM_SIZE_L*tofindb) : (BAMBOO_LARGE_SMEM_BOUND+
-          (tofindb-NUMCORES4GC)*BAMBOO_SMEM_SIZE));
-    *allocsize = size;
-    // set bamboo_smemtbl
-    for(i = tofindb; i <= totest; i++) {
-      bamboo_smemtbl[i]=(i<NUMCORES4GC)?BAMBOO_SMEM_SIZE_L:BAMBOO_SMEM_SIZE;
-    }
-  } else if(foundsmem == 2) {
-    // no suitable block
-    *allocsize = 0;
-  }
-
-  return mem;
-} // void * localmalloc_I(int, int, int *)
-
-#ifdef SMEMF
-// Allocate the local shared memory to each core with the highest priority,
-// if a core has used up its local shared memory, try to allocate the 
-// shared memory that belong to its neighbours, if also failed, start gc.
-void * fixedmalloc_I(int coren,
-                     int isize,
-                     int * allocsize) {
-  void * mem = NULL;
-  int i = 0;
-  int j = 0;
-  int k = 0;
-  int gccorenum = (coren < NUMCORES4GC) ? (coren) : (coren % NUMCORES4GC);
-  int coords_x = bamboo_cpu2coords[gccorenum*2];
-  int coords_y = bamboo_cpu2coords[gccorenum*2+1];
-  int ii = 1;
-  int tofindb = gc_core2block[2*core2test[gccorenum][k]+i]+(NUMCORES4GC*2)*j;
-  int totest = tofindb;
-  int bound = BAMBOO_SMEM_SIZE_L;
-  int foundsmem = 0;
-  int size = 0;
-  do {
-    bound = (totest < NUMCORES4GC) ? BAMBOO_SMEM_SIZE_L : BAMBOO_SMEM_SIZE;
-    int nsize = bamboo_smemtbl[totest];
-    bool islocal = true;
-    if(nsize < bound) {
-      bool tocheck = true;
-      // have some space in the block
-      if(totest == tofindb) {
-               // the first partition
-               size = bound - nsize;
-      } else if(nsize == 0) {
-               // an empty partition, can be appended
-               size += bound;
-      } else {
-               // not an empty partition, can not be appended
-               // the last continuous block is not big enough, go to check the next
-               // local block
-               islocal = true;
-               tocheck = false;
-      } // if(totest == tofindb) else if(nsize == 0) else ...
-      if(tocheck) {
-               if(size >= isize) {
-                 // have enough space in the block, malloc
-                 foundsmem = 1;
-                 break;
-               } else {
-                 // no enough space yet, try to append next continuous block
-                 // TODO may consider to go to next local block?
-                 islocal = false;
-               }  // if(size > isize) else ...
-      }  // if(tocheck)
-    } // if(nsize < bound)
-    if(islocal) {
-      // no space in the block, go to check the next block
-      i++;
-      if(2==i) {
-               i = 0;
-               j++;
-      }
-      tofindb=totest=
-               gc_core2block[2*core2test[gccorenum][k]+i]+(NUMCORES4GC*2)*j;
-    } else {
-      totest += 1;
-    }  // if(islocal) else ...
-    if(totest > gcnumblock-1-bamboo_reserved_smem) {
-      // no more local mem, do not find suitable block on local mem
-         // try to malloc shared memory assigned to the neighbour cores
-         do{
-               k++;
-               if(k >= NUM_CORES2TEST) {
-                 // no more memory available on either coren or its neighbour cores
-                 foundsmem = 2;
-                 goto memsearchresult;
-               }
-         } while(core2test[gccorenum][k] == -1);
-         i = 0;
-         j = 0;
-         tofindb=totest=
-               gc_core2block[2*core2test[gccorenum][k]+i]+(NUMCORES4GC*2)*j;
-    }  // if(totest > gcnumblock-1-bamboo_reserved_smem) ...
-  } while(true);
-
-memsearchresult:
-  if(foundsmem == 1) {
-    // find suitable block
-    mem = gcbaseva+bamboo_smemtbl[tofindb]+((tofindb<NUMCORES4GC) ?
-          (BAMBOO_SMEM_SIZE_L*tofindb) : (BAMBOO_LARGE_SMEM_BOUND+
-          (tofindb-NUMCORES4GC)*BAMBOO_SMEM_SIZE));
-    *allocsize = size;
-    // set bamboo_smemtbl
-    for(i = tofindb; i <= totest; i++) {
-      bamboo_smemtbl[i]=(i<NUMCORES4GC)?BAMBOO_SMEM_SIZE_L:BAMBOO_SMEM_SIZE;
-    }
-  } else if(foundsmem == 2) {
-    // no suitable block
-    *allocsize = 0;
-  }
-
-  return mem;
-} // void * fixedmalloc_I(int, int, int *)
-#endif // #ifdef SMEMF
-
-#ifdef SMEMM
-// Allocate the local shared memory to each core with the highest priority,
-// if a core has used up its local shared memory, try to allocate the 
-// shared memory that belong to its neighbours first, if failed, check 
-// current memory allocation rate, if it has already reached the threshold,
-// start gc, otherwise, allocate the shared memory globally.  If all the 
-// shared memory has been used up, start gc.
-void * mixedmalloc_I(int coren,
-                     int isize,
-                     int * allocsize) {
-  void * mem = NULL;
-  int i = 0;
-  int j = 0;
-  int k = 0;
-  int gccorenum = (coren < NUMCORES4GC) ? (coren) : (coren % NUMCORES4GC);
-  int ii = 1;
-  int tofindb = gc_core2block[2*core2test[gccorenum][k]+i]+(NUMCORES4GC*2)*j;
-  int totest = tofindb;
-  int bound = BAMBOO_SMEM_SIZE_L;
-  int foundsmem = 0;
-  int size = 0;
-  do {
-    bound = (totest < NUMCORES4GC) ? BAMBOO_SMEM_SIZE_L : BAMBOO_SMEM_SIZE;
-    int nsize = bamboo_smemtbl[totest];
-    bool islocal = true;
-    if(nsize < bound) {
-      bool tocheck = true;
-      // have some space in the block
-      if(totest == tofindb) {
-               // the first partition
-               size = bound - nsize;
-      } else if(nsize == 0) {
-               // an empty partition, can be appended
-               size += bound;
-      } else {
-               // not an empty partition, can not be appended
-               // the last continuous block is not big enough, go to check the next
-               // local block
-               islocal = true;
-               tocheck = false;
-      } // if(totest == tofindb) else if(nsize == 0) else ...
-      if(tocheck) {
-               if(size >= isize) {
-                 // have enough space in the block, malloc
-                 foundsmem = 1;
-                 break;
-               } else {
-                 // no enough space yet, try to append next continuous block
-                 // TODO may consider to go to next local block?
-                 islocal = false;
-               }  // if(size > isize) else ...
-      }  // if(tocheck)
-    } // if(nsize < bound)
-    if(islocal) {
-      // no space in the block, go to check the next block
-      i++;
-      if(2==i) {
-               i = 0;
-               j++;
-      }
-      tofindb=totest=
-               gc_core2block[2*core2test[gccorenum][k]+i]+(NUMCORES4GC*2)*j;
-    } else {
-      totest += 1;
-    }  // if(islocal) else ...
-    if(totest > gcnumblock-1-bamboo_reserved_smem) {
-      // no more local mem, do not find suitable block on local mem
-         // try to malloc shared memory assigned to the neighbour cores
-         do{
-               k++;
-               if(k >= NUM_CORES2TEST) {
-                 if(gcmem_mixed_usedmem >= gcmem_mixed_threshold) {
-                       // no more memory available on either coren or its neighbour cores
-                       foundsmem = 2;
-                       goto memmixedsearchresult;
-                 } else {
-                       // try allocate globally
-                       mem = globalmalloc_I(coren, isize, allocsize);
-                       return mem;
-                 }
-               }
-         } while(core2test[gccorenum][k] == -1);
-         i = 0;
-         j = 0;
-         tofindb=totest=
-               gc_core2block[2*core2test[gccorenum][k]+i]+(NUMCORES4GC*2)*j;
-    }  // if(totest > gcnumblock-1-bamboo_reserved_smem) ...
-  } while(true);
-
-memmixedsearchresult:
-  if(foundsmem == 1) {
-    // find suitable block
-    mem = gcbaseva+bamboo_smemtbl[tofindb]+((tofindb<NUMCORES4GC) ?
-          (BAMBOO_SMEM_SIZE_L*tofindb) : (BAMBOO_LARGE_SMEM_BOUND+
-          (tofindb-NUMCORES4GC)*BAMBOO_SMEM_SIZE));
-    *allocsize = size;
-    // set bamboo_smemtbl
-    for(i = tofindb; i <= totest; i++) {
-      bamboo_smemtbl[i]=(i<NUMCORES4GC)?BAMBOO_SMEM_SIZE_L:BAMBOO_SMEM_SIZE;
-    }
-       gcmem_mixed_usedmem += size;
-       if(tofindb == bamboo_free_block) {
-      bamboo_free_block = totest+1;
-    }
-  } else if(foundsmem == 2) {
-    // no suitable block
-    *allocsize = 0;
-  }
-
-  return mem;
-} // void * mixedmalloc_I(int, int, int *)
-#endif // #ifdef SMEMM
-
-// Allocate all the memory chunks globally, do not consider the host cores
-// When all the shared memory are used up, start gc.
-void * globalmalloc_I(int coren,
-                      int isize,
-                      int * allocsize) {
-  void * mem = NULL;
-  int tofindb = bamboo_free_block;       //0;
-  int totest = tofindb;
-  int bound = BAMBOO_SMEM_SIZE_L;
-  int foundsmem = 0;
-  int size = 0;
-  if(tofindb > gcnumblock-1-bamboo_reserved_smem) {
-       // Out of shared memory
-    *allocsize = 0;
-    return NULL;
-  }
-  do {
-    bound = (totest < NUMCORES4GC) ? BAMBOO_SMEM_SIZE_L : BAMBOO_SMEM_SIZE;
-    int nsize = bamboo_smemtbl[totest];
-    bool isnext = false;
-    if(nsize < bound) {
-      bool tocheck = true;
-      // have some space in the block
-      if(totest == tofindb) {
-               // the first partition
-               size = bound - nsize;
-      } else if(nsize == 0) {
-               // an empty partition, can be appended
-               size += bound;
-      } else {
-               // not an empty partition, can not be appended
-               // the last continuous block is not big enough, start another block
-               isnext = true;
-               tocheck = false;
-      }  // if(totest == tofindb) else if(nsize == 0) else ...
-      if(tocheck) {
-               if(size >= isize) {
-                 // have enough space in the block, malloc
-                 foundsmem = 1;
-                 break;
-               }  // if(size > isize)
-      }   // if(tocheck)
-    } else {
-      isnext = true;
-    }  // if(nsize < bound) else ...
-    totest += 1;
-    if(totest > gcnumblock-1-bamboo_reserved_smem) {
-      // no more local mem, do not find suitable block
-      foundsmem = 2;
-      break;
-    }  // if(totest > gcnumblock-1-bamboo_reserved_smem) ...
-    if(isnext) {
-      // start another block
-      tofindb = totest;
-    } // if(islocal)
-  } while(true);
-
-  if(foundsmem == 1) {
-    // find suitable block
-    mem = gcbaseva+bamboo_smemtbl[tofindb]+((tofindb<NUMCORES4GC) ?
-          (BAMBOO_SMEM_SIZE_L*tofindb) : (BAMBOO_LARGE_SMEM_BOUND+
-          (tofindb-NUMCORES4GC)*BAMBOO_SMEM_SIZE));
-    *allocsize = size;
-    // set bamboo_smemtbl
-    for(int i = tofindb; i <= totest; i++) {
-      bamboo_smemtbl[i]=(i<NUMCORES4GC)?BAMBOO_SMEM_SIZE_L:BAMBOO_SMEM_SIZE;
-    }
-    if(tofindb == bamboo_free_block) {
-      bamboo_free_block = totest+1;
-    }
-  } else if(foundsmem == 2) {
-    // no suitable block
-    *allocsize = 0;
-    mem = NULL;
-  }
-
-  return mem;
-} // void * globalmalloc_I(int, int, int *)
-#endif // #ifdef MULTICORE_GC
-
-// malloc from the shared memory
-void * smemalloc_I(int coren,
-                   int size,
-                   int * allocsize) {
-  void * mem = NULL;
-#ifdef MULTICORE_GC
-  int isize = size+(BAMBOO_CACHE_LINE_SIZE);
-
-  // go through the bamboo_smemtbl for suitable partitions
-  switch(bamboo_smem_mode) {
-  case SMEMLOCAL: {
-    mem = localmalloc_I(coren, isize, allocsize);
-    break;
-  }
-
-  case SMEMFIXED: {
-#ifdef SMEMF
-       mem = fixedmalloc_I(coren, isize, allocsize);
-#else
-       // not supported yet
-       BAMBOO_EXIT(0xe001);
-#endif
-    break;
-  }
-
-  case SMEMMIXED: {
-#ifdef SMEMM
-       mem = mixedmalloc_I(coren, isize, allocsize);
-#else
-       // not supported yet
-    BAMBOO_EXIT(0xe002);
-#endif
-    break;
-  }
-
-  case SMEMGLOBAL: {
-    mem = globalmalloc_I(coren, isize, allocsize);
-    break;
-  }
-
-  default:
-    break;
-  }
-
-  if(mem == NULL) {
-#else 
-  int toallocate = (size>(BAMBOO_SMEM_SIZE)) ? (size) : (BAMBOO_SMEM_SIZE);
-  if(toallocate > bamboo_free_smem_size) {
-       // no enough mem
-       mem = NULL;
-  } else {
-       mem = (void *)bamboo_free_smemp;
-       bamboo_free_smemp = ((void*)bamboo_free_smemp) + toallocate;
-       bamboo_free_smem_size -= toallocate;
-  }
-  *allocsize = toallocate;
-  if(mem == NULL) {
-#endif // MULTICORE_GC
-    // no enough shared global memory
-    *allocsize = 0;
-#ifdef MULTICORE_GC
-       if(!gcflag) {
-         gcflag = true;
-         // inform other cores to stop and wait for gc
-         gcprecheck = true;
-         for(int i = 0; i < NUMCORESACTIVE; i++) {
-               // reuse the gcnumsendobjs & gcnumreceiveobjs
-               gccorestatus[i] = 1;
-               gcnumsendobjs[0][i] = 0;
-               gcnumreceiveobjs[0][i] = 0;
-         }
-         for(int i = 0; i < NUMCORESACTIVE; i++) {
-               if(i != BAMBOO_NUM_OF_CORE) {
-                 if(BAMBOO_CHECK_SEND_MODE()) {
-                       cache_msg_1(i, GCSTARTPRE);
-                 } else {
-                       send_msg_1(i, GCSTARTPRE, true);
-                 }
-               }
-         }
-       }
-       return NULL;
-#else
-    BAMBOO_DEBUGPRINT(0xa001);
-    BAMBOO_EXIT(0xa001);
-#endif
-  }
-  return mem;
-}  // void * smemalloc_I(int, int, int)
-
-INLINE int checkMsgLength_I(int size) {
-#ifdef DEBUG
-#ifndef TILERA
-  BAMBOO_DEBUGPRINT(0xcccc);
-#endif
-#endif
-  int type = msgdata[msgdataindex];
-  switch(type) {
-  case STATUSCONFIRM:
-  case TERMINATE:
-#ifdef MULTICORE_GC
-  case GCSTARTPRE:
-  case GCSTARTINIT:
-  case GCSTART:
-  case GCSTARTMAPINFO:
-  case GCSTARTFLUSH:
-  case GCFINISH:
-  case GCMARKCONFIRM:
-  case GCLOBJREQUEST:
-#ifdef GC_CACHE_ADAPT
-  case GCSTARTPREF:
-#endif // GC_CACHE_ADAPT
-#endif // MULTICORE_GC
-  {
-       msglength = 1;
-       break;
-  }
-
-  case PROFILEOUTPUT:
-  case PROFILEFINISH:
-#ifdef MULTICORE_GC
-  case GCSTARTCOMPACT:
-  case GCMARKEDOBJ:
-  case GCFINISHINIT:
-  case GCFINISHMAPINFO:
-  case GCFINISHFLUSH:
-#ifdef GC_CACHE_ADAPT
-  case GCFINISHPREF:
-#endif // GC_CACHE_ADAPT
-#endif // MULTICORE_GC
-  {
-       msglength = 2;
-       break;
-  }
-
-  case MEMREQUEST:
-  case MEMRESPONSE:
-#ifdef MULTICORE_GC
-  case GCMAPREQUEST:
-  case GCMAPINFO:
-  case GCMAPTBL:
-  case GCLOBJMAPPING:
-#endif
-  {
-       msglength = 3;
-       break;
-  }
-
-  case TRANSTALL:
-  case LOCKGROUNT:
-  case LOCKDENY:
-  case LOCKRELEASE:
-  case REDIRECTGROUNT:
-  case REDIRECTDENY:
-  case REDIRECTRELEASE:
-#ifdef MULTICORE_GC
-  case GCFINISHPRE:
-  case GCFINISHMARK:
-  case GCMOVESTART:
-#ifdef GC_PROFILE
-  case GCPROFILES:
-#endif
-#endif
-  {
-       msglength = 4;
-       break;
-  }
-
-  case LOCKREQUEST:
-  case STATUSREPORT:
-#ifdef MULTICORE_GC
-  case GCFINISHCOMPACT:
-  case GCMARKREPORT:
-#endif
-  {
-       msglength = 5;
-       break;
-  }
-
-  case REDIRECTLOCK:
-  {
-    msglength = 6;
-    break;
-  }
-
-  case TRANSOBJ:   // nonfixed size
-#ifdef MULTICORE_GC
-  case GCLOBJINFO:
-#endif
-  {             // nonfixed size
-       if(size > 1) {
-         msglength = msgdata[msgdataindex+1];
-       } else {
-         return -1;
-       }
-       break;
-  }
-
-  default:
-  {
-    BAMBOO_DEBUGPRINT_REG(type);
-       BAMBOO_DEBUGPRINT_REG(size);
-    BAMBOO_DEBUGPRINT_REG(msgdataindex);
-       BAMBOO_DEBUGPRINT_REG(msgdatalast);
-       BAMBOO_DEBUGPRINT_REG(msgdatafull);
-    int i = 6;
-    while(i-- > 0) {
-      BAMBOO_DEBUGPRINT(msgdata[msgdataindex+i]);
-    }
-    BAMBOO_EXIT(0xd005);
-    break;
-  }
-  }
-#ifdef DEBUG
-#ifndef TILERA
-  BAMBOO_DEBUGPRINT_REG(msgdata[msgdataindex]);
-#endif
-#endif
-#ifdef DEBUG
-#ifndef TILERA
-  BAMBOO_DEBUGPRINT(0xffff);
-#endif
-#endif
-  return msglength;
-}
-
-INLINE void processmsg_transobj_I() {
-#ifdef PROFILE_INTERRUPT
-  /*if(!interruptInfoOverflow) {
-    InterruptInfo* intInfo = RUNMALLOC_I(sizeof(struct interrupt_info));
-    interruptInfoArray[interruptInfoIndex] = intInfo;
-    intInfo->startTime = BAMBOO_GET_EXE_TIME();
-    intInfo->endTime = -1;
-  }*/
-#endif
-  MSG_INDEXINC_I();
-  struct transObjInfo * transObj=RUNMALLOC_I(sizeof(struct transObjInfo));
-  int k = 0;
-#ifdef DEBUG
-#ifndef CLOSE_PRINT
-  BAMBOO_DEBUGPRINT(0xe880);
-#endif
-#endif
-  if(BAMBOO_NUM_OF_CORE > NUMCORESACTIVE - 1) {
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT_REG(msgdata[msgdataindex] /*[2]*/);
-#endif
-    BAMBOO_EXIT(0xa002);
-  }
-  // store the object and its corresponding queue info, enqueue it later
-  transObj->objptr = (void *)msgdata[msgdataindex];  //[2]
-  MSG_INDEXINC_I();
-  transObj->length = (msglength - 3) / 2;
-  transObj->queues = RUNMALLOC_I(sizeof(int)*(msglength - 3));
-  for(k = 0; k < transObj->length; ++k) {
-    transObj->queues[2*k] = msgdata[msgdataindex];   //[3+2*k];
-    MSG_INDEXINC_I();
-#ifdef DEBUG
-#ifndef CLOSE_PRINT
-    //BAMBOO_DEBUGPRINT_REG(transObj->queues[2*k]);
-#endif
-#endif
-    transObj->queues[2*k+1] = msgdata[msgdataindex]; //[3+2*k+1];
-    MSG_INDEXINC_I();
-#ifdef DEBUG
-#ifndef CLOSE_PRINT
-    //BAMBOO_DEBUGPRINT_REG(transObj->queues[2*k+1]);
-#endif
-#endif
-  }
-  // check if there is an existing duplicate item
-  {
-    struct QueueItem * qitem = getHead(&objqueue);
-    struct QueueItem * prev = NULL;
-    while(qitem != NULL) {
-      struct transObjInfo * tmpinfo =
-        (struct transObjInfo *)(qitem->objectptr);
-      if(tmpinfo->objptr == transObj->objptr) {
-               // the same object, remove outdate one
-               RUNFREE(tmpinfo->queues);
-               RUNFREE(tmpinfo);
-               removeItem(&objqueue, qitem);
-               //break;
-      } else {
-               prev = qitem;
-      }
-      if(prev == NULL) {
-               qitem = getHead(&objqueue);
-      } else {
-               qitem = getNextQueueItem(prev);
-      }
-    }
-    addNewItem_I(&objqueue, (void *)transObj);
-  }
-  ++(self_numreceiveobjs);
-#ifdef MULTICORE_GC
-  if(gcprocessing) {
-       if(STARTUPCORE == BAMBOO_NUM_OF_CORE) {
-         // set the gcprecheck to enable checking again
-         gcprecheck = true;
-       } else {
-         // send a update pregc information msg to the master core
-         if(BAMBOO_CHECK_SEND_MODE()) {
-               cache_msg_4(STARTUPCORE, GCFINISHPRE, BAMBOO_NUM_OF_CORE, 
-                       self_numsendobjs, self_numreceiveobjs);
-         } else {
-               send_msg_4(STARTUPCORE, GCFINISHPRE, BAMBOO_NUM_OF_CORE, 
-                       self_numsendobjs, self_numreceiveobjs, true);
-         }
-       }
-  }
-#endif 
-#ifdef PROFILE_INTERRUPT
-  /*if(!interruptInfoOverflow) {
-    interruptInfoArray[interruptInfoIndex]->endTime=BAMBOO_GET_EXE_TIME();
-    interruptInfoIndex++;
-    if(interruptInfoIndex == INTERRUPTINFOLENGTH) {
-      interruptInfoOverflow = true;
-    }
-  }*/
-#endif
-}
-
-INLINE void processmsg_transtall_I() {
-  if(BAMBOO_NUM_OF_CORE != STARTUPCORE) {
-    // non startup core can not receive stall msg
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT_REG(msgdata[msgdataindex] /*[1]*/);
-#endif
-    BAMBOO_EXIT(0xa003);
-  }
-  int num_core = msgdata[msgdataindex]; //[1]
-  MSG_INDEXINC_I();
-  if(num_core < NUMCORESACTIVE) {
-#ifdef DEBUG
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT(0xe881);
-#endif
-#endif
-    corestatus[num_core] = 0;
-    numsendobjs[num_core] = msgdata[msgdataindex]; //[2];
-    MSG_INDEXINC_I();
-    numreceiveobjs[num_core] = msgdata[msgdataindex]; //[3];
-    MSG_INDEXINC_I();
-  }
-}
-
-#ifndef MULTICORE_GC
-INLINE void processmsg_lockrequest_I() {
-  // check to see if there is a lock exist for the required obj
-  // msgdata[1] -> lock type
-  int locktype = msgdata[msgdataindex]; //[1];
-  MSG_INDEXINC_I();
-  int data2 = msgdata[msgdataindex];  // obj pointer
-  MSG_INDEXINC_I();
-  int data3 = msgdata[msgdataindex];  // lock
-  MSG_INDEXINC_I();
-  int data4 = msgdata[msgdataindex];  // request core
-  MSG_INDEXINC_I();
-  // -1: redirected, 0: approved, 1: denied
-  int deny=processlockrequest(locktype, data3, data2, data4, data4, true);
-  if(deny == -1) {
-    // this lock request is redirected
-    return;
-  } else {
-    // send response msg
-    // for 32 bit machine, the size is always 4 words, cache the msg first
-    int tmp = deny==1 ? LOCKDENY : LOCKGROUNT;
-    if(BAMBOO_CHECK_SEND_MODE()) {
-         cache_msg_4(data4, tmp, locktype, data2, data3);
-    } else {
-         send_msg_4(data4, tmp, locktype, data2, data3, true);
-    }
-  }
-}
-
-INLINE void processmsg_lockgrount_I() {
-  MSG_INDEXINC_I();
-  if(BAMBOO_NUM_OF_CORE > NUMCORESACTIVE - 1) {
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT_REG(msgdata[msgdataindex] /*[2]*/);
-#endif
-    BAMBOO_EXIT(0xa004);
-  }
-  int data2 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  int data3 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  if((lockobj == data2) && (lock2require == data3)) {
-#ifdef DEBUG
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT(0xe882);
-#endif
-#endif
-    lockresult = 1;
-    lockflag = true;
-#ifndef INTERRUPT
-    reside = false;
-#endif
-  } else {
-    // conflicts on lockresults
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT_REG(data2);
-#endif
-    BAMBOO_EXIT(0xa005);
-  }
-}
-
-INLINE void processmsg_lockdeny_I() {
-  MSG_INDEXINC_I();
-  int data2 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  int data3 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  if(BAMBOO_NUM_OF_CORE > NUMCORESACTIVE - 1) {
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT_REG(data2);
-#endif
-    BAMBOO_EXIT(0xa006);
-  }
-  if((lockobj == data2) && (lock2require == data3)) {
-#ifdef DEBUG
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT(0xe883);
-#endif
-#endif
-    lockresult = 0;
-    lockflag = true;
-#ifndef INTERRUPT
-    reside = false;
-#endif
-  } else {
-    // conflicts on lockresults
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT_REG(data2);
-#endif
-    BAMBOO_EXIT(0xa007);
-  }
-}
-
-INLINE void processmsg_lockrelease_I() {
-  int data1 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  int data2 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  // receive lock release msg
-  processlockrelease(data1, data2, 0, false);
-}
-
-INLINE void processmsg_redirectlock_I() {
-  // check to see if there is a lock exist for the required obj
-  int data1 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();    //msgdata[1]; // lock type
-  int data2 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();    //msgdata[2]; // obj pointer
-  int data3 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();    //msgdata[3]; // redirect lock
-  int data4 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();    //msgdata[4]; // root request core
-  int data5 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();    //msgdata[5]; // request core
-  int deny = processlockrequest(data1, data3, data2, data5, data4, true);
-  if(deny == -1) {
-    // this lock request is redirected
-    return;
-  } else {
-    // send response msg
-    // for 32 bit machine, the size is always 4 words, cache the msg first
-    if(BAMBOO_CHECK_SEND_MODE()) {
-         cache_msg_4(data4, deny==1 ? REDIRECTDENY : REDIRECTGROUNT,
-                                 data1, data2, data3);
-    } else {
-         send_msg_4(data4, deny==1?REDIRECTDENY:REDIRECTGROUNT,
-                                data1, data2, data3, true);
-    }
-  }
-}
-
-INLINE void processmsg_redirectgrount_I() {
-  MSG_INDEXINC_I();
-  int data2 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  if(BAMBOO_NUM_OF_CORE > NUMCORESACTIVE - 1) {
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT_REG(data2);
-#endif
-    BAMBOO_EXIT(0xa00a);
-  }
-  if(lockobj == data2) {
-#ifdef DEBUG
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT(0xe891);
-#endif
-#endif
-    int data3 = msgdata[msgdataindex];
-    MSG_INDEXINC_I();
-    lockresult = 1;
-    lockflag = true;
-    RuntimeHashadd_I(objRedirectLockTbl, lockobj, data3);
-#ifndef INTERRUPT
-    reside = false;
-#endif
-  } else {
-    // conflicts on lockresults
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT_REG(data2);
-#endif
-    BAMBOO_EXIT(0xa00b);
-  }
-}
-
-INLINE void processmsg_redirectdeny_I() {
-  MSG_INDEXINC_I();
-  int data2 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  if(BAMBOO_NUM_OF_CORE > NUMCORESACTIVE - 1) {
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT_REG(data2);
-#endif
-    BAMBOO_EXIT(0xa00c);
-  }
-  if(lockobj == data2) {
-#ifdef DEBUG
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT(0xe892);
-#endif
-#endif
-    lockresult = 0;
-    lockflag = true;
-#ifndef INTERRUPT
-    reside = false;
-#endif
-  } else {
-    // conflicts on lockresults
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT_REG(data2);
-#endif
-    BAMBOO_EXIT(0xa00d);
-  }
-}
-
-INLINE void processmsg_redirectrelease_I() {
-  int data1 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  int data2 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  int data3 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  processlockrelease(data1, data2, data3, true);
-}
-#endif // #ifndef MULTICORE_GC
-
-#ifdef PROFILE
-INLINE void processmsg_profileoutput_I() {
-  if(BAMBOO_NUM_OF_CORE == STARTUPCORE) {
-    // startup core can not receive profile output finish msg
-    BAMBOO_EXIT(0xa008);
-  }
-#ifdef DEBUG
-#ifndef CLOSE_PRINT
-  BAMBOO_DEBUGPRINT(0xe885);
-#endif
-#endif
-  stall = true;
-  totalexetime = msgdata[msgdataindex];  //[1]
-  MSG_INDEXINC_I();
-#ifdef RT_TEST
-  BAMBOO_DEBUGPRINT_REG(dot_num);
-#else
-  outputProfileData();
-#endif
-  // cache the msg first
-  if(BAMBOO_CHECK_SEND_MODE()) {
-       cache_msg_2(STARTUPCORE, PROFILEFINISH, BAMBOO_NUM_OF_CORE);
-  } else {
-       send_msg_2(STARTUPCORE, PROFILEFINISH, BAMBOO_NUM_OF_CORE, true);
-  }
-}
-
-INLINE void processmsg_profilefinish_I() {
-  if(BAMBOO_NUM_OF_CORE != STARTUPCORE) {
-    // non startup core can not receive profile output finish msg
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT_REG(msgdata[msgdataindex /*1*/]);
-#endif
-    BAMBOO_EXIT(0xa009);
-  }
-#ifdef DEBUG
-#ifndef CLOSE_PRINT
-  BAMBOO_DEBUGPRINT(0xe886);
-#endif
-#endif
-  int data1 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  profilestatus[data1] = 0;
-}
-#endif // #ifdef PROFILE
-
-INLINE void processmsg_statusconfirm_I() {
-  if((BAMBOO_NUM_OF_CORE == STARTUPCORE)
-     || (BAMBOO_NUM_OF_CORE > NUMCORESACTIVE - 1)) {
-    // wrong core to receive such msg
-    BAMBOO_EXIT(0xa00e);
-  } else {
-    // send response msg
-#ifdef DEBUG
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT(0xe887);
-#endif
-#endif
-    // cache the msg first
-    if(BAMBOO_CHECK_SEND_MODE()) {
-         cache_msg_5(STARTUPCORE, STATUSREPORT,
-                                 busystatus ? 1 : 0, BAMBOO_NUM_OF_CORE,
-                                 self_numsendobjs, self_numreceiveobjs);
-    } else {
-         send_msg_5(STARTUPCORE, STATUSREPORT, busystatus?1:0,
-                                BAMBOO_NUM_OF_CORE, self_numsendobjs,
-                                self_numreceiveobjs, true);
-    }
-  }
-}
-
-INLINE void processmsg_statusreport_I() {
-  int data1 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  int data2 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  int data3 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  int data4 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  // receive a status confirm info
-  if(BAMBOO_NUM_OF_CORE != STARTUPCORE) {
-    // wrong core to receive such msg
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT_REG(data2);
-#endif
-    BAMBOO_EXIT(0xa00f);
-  } else {
-#ifdef DEBUG
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT(0xe888);
-#endif
-#endif
-    if(waitconfirm) {
-      numconfirm--;
-    }
-    corestatus[data2] = data1;
-    numsendobjs[data2] = data3;
-    numreceiveobjs[data2] = data4;
-  }
-}
-
-INLINE void processmsg_terminate_I() {
-#ifdef DEBUG
-#ifndef CLOSE_PRINT
-  BAMBOO_DEBUGPRINT(0xe889);
-#endif
-#endif
-  disruntimedata();
-#ifdef MULTICORE_GC
-#ifdef GC_CACHE_ADAPT
-  bamboo_mask_timer_intr(); // disable the TILE_TIMER interrupt
-#endif // GC_CACHE_ADAPT
-#endif // MULTICORE_GC
-  BAMBOO_EXIT_APP(0);
-}
-
-INLINE void processmsg_memrequest_I() {
-#ifdef PROFILE_INTERRUPT
-  /*if(!interruptInfoOverflow) {
-    InterruptInfo* intInfo = RUNMALLOC_I(sizeof(struct interrupt_info));
-    interruptInfoArray[interruptInfoIndex] = intInfo;
-    intInfo->startTime = BAMBOO_GET_EXE_TIME();
-    intInfo->endTime = -1;
-  }*/
-#endif
-  int data1 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  int data2 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  // receive a shared memory request msg
-  if(BAMBOO_NUM_OF_CORE != STARTUPCORE) {
-    // wrong core to receive such msg
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT_REG(data2);
-#endif
-    BAMBOO_EXIT(0xa010);
-  } else {
-#ifdef DEBUG
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT(0xe88a);
-#endif
-#endif
-    int allocsize = 0;
-    void * mem = NULL;
-#ifdef MULTICORE_GC
-    if(gcprocessing) {
-      // is currently doing gc, dump this msg
-      if(INITPHASE == gcphase) {
-               // if still in the initphase of gc, send a startinit msg again,
-               // cache the msg first
-               if(BAMBOO_CHECK_SEND_MODE()) {
-                 cache_msg_1(data2, GCSTARTINIT);
-               } else {
-                 send_msg_1(data2, GCSTARTINIT, true);
-               }
-      }
-    } else {
-#endif
-    mem = smemalloc_I(data2, data1, &allocsize);
-    if(mem != NULL) {
-      // send the start_va to request core, cache the msg first
-      if(BAMBOO_CHECK_SEND_MODE()) {
-               cache_msg_3(data2, MEMRESPONSE, mem, allocsize);
-      } else {
-               send_msg_3(data2, MEMRESPONSE, mem, allocsize, true);
-         }
-    } //else 
-         // if mem == NULL, the gcflag of the startup core has been set
-         // and all the other cores have been informed to start gc
-#ifdef MULTICORE_GC
-  }
-#endif
-  }
-#ifdef PROFILE_INTERRUPT
-  /*if(!interruptInfoOverflow) {
-    interruptInfoArray[interruptInfoIndex]->endTime=BAMBOO_GET_EXE_TIME();
-    interruptInfoIndex++;
-    if(interruptInfoIndex == INTERRUPTINFOLENGTH) {
-      interruptInfoOverflow = true;
-    }
-  }*/
-#endif
-}
-
-INLINE void processmsg_memresponse_I() {
-  int data1 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  int data2 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  // receive a shared memory response msg
-#ifdef DEBUG
-#ifndef CLOSE_PRINT
-  BAMBOO_DEBUGPRINT(0xe88b);
-#endif
-#endif
-#ifdef MULTICORE_GC
-  // if is currently doing gc, dump this msg
-  if(!gcprocessing) {
-#endif
-  if(data2 == 0) {
-    bamboo_smem_size = 0;
-    bamboo_cur_msp = 0;
-#ifdef MULTICORE_GC
-       bamboo_smem_zero_top = 0;
-#endif
-  } else {
-#ifdef MULTICORE_GC
-    // fill header to store the size of this mem block
-    BAMBOO_MEMSET_WH(data1, '\0', BAMBOO_CACHE_LINE_SIZE); 
-       //memset(data1, 0, BAMBOO_CACHE_LINE_SIZE);
-    (*((int*)data1)) = data2;
-    bamboo_smem_size = data2 - BAMBOO_CACHE_LINE_SIZE;
-    bamboo_cur_msp = data1 + BAMBOO_CACHE_LINE_SIZE;
-       bamboo_smem_zero_top = bamboo_cur_msp;
-#else
-    bamboo_smem_size = data2;
-    bamboo_cur_msp =(void*)(data1);
-#endif
-  }
-  smemflag = true;
-#ifdef MULTICORE_GC
-}
-#endif
-}
-
-#ifdef MULTICORE_GC
-INLINE void processmsg_gcstartpre_I() {
-  if(gcprocessing) {
-       // already stall for gc
-       // send a update pregc information msg to the master core
-       if(BAMBOO_CHECK_SEND_MODE()) {
-         cache_msg_4(STARTUPCORE, GCFINISHPRE, BAMBOO_NUM_OF_CORE, 
-                 self_numsendobjs, self_numreceiveobjs);
-       } else {
-         send_msg_4(STARTUPCORE, GCFINISHPRE, BAMBOO_NUM_OF_CORE, 
-                 self_numsendobjs, self_numreceiveobjs, true);
-       }
-  } else {
-       // the first time to be informed to start gc
-       gcflag = true;
-       if(!smemflag) {
-         // is waiting for response of mem request
-         // let it return NULL and start gc
-         bamboo_smem_size = 0;
-         bamboo_cur_msp = NULL;
-         smemflag = true;
-         bamboo_smem_zero_top = NULL;
-       }
-  }
-}
-
-INLINE void processmsg_gcstartinit_I() {
-  gcphase = INITPHASE;
-}
-
-INLINE void processmsg_gcstart_I() {
-#ifdef DEBUG
-#ifndef CLOSE_PRINT
-  BAMBOO_DEBUGPRINT(0xe88c);
-#endif
-#endif
-  // set the GC flag
-  gcphase = MARKPHASE;
-}
-
-INLINE void processmsg_gcstartcompact_I() {
-  gcblock2fill = msgdata[msgdataindex];
-  MSG_INDEXINC_I();  //msgdata[1];
-  gcphase = COMPACTPHASE;
-}
-
-INLINE void processmsg_gcstartmapinfo_I() {
-  gcphase = MAPPHASE;
-}
-
-INLINE void processmsg_gcstartflush_I() {
-  gcphase = FLUSHPHASE;
-}
-
-INLINE void processmsg_gcfinishpre_I() {
-  int data1 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  int data2 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  int data3 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  // received a init phase finish msg
-  if(BAMBOO_NUM_OF_CORE != STARTUPCORE) {
-    // non startup core can not receive this msg
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT_REG(data1);
-#endif
-    BAMBOO_EXIT(0xb000);
-  }
-  // All cores should do init GC
-  if(!gcprecheck) {
-       gcprecheck = true;
-  }
-  gccorestatus[data1] = 0;
-  gcnumsendobjs[0][data1] = data2;
-  gcnumreceiveobjs[0][data1] = data3;
-}
-
-INLINE void processmsg_gcfinishinit_I() {
-  int data1 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  // received a init phase finish msg
-  if(BAMBOO_NUM_OF_CORE != STARTUPCORE) {
-    // non startup core can not receive this msg
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT_REG(data1);
-#endif
-    BAMBOO_EXIT(0xb001);
-  }
-#ifdef DEBUG
-  BAMBOO_DEBUGPRINT(0xe88c);
-  BAMBOO_DEBUGPRINT_REG(data1);
-#endif
-  // All cores should do init GC
-  if(data1 < NUMCORESACTIVE) {
-    gccorestatus[data1] = 0;
-  }
-}
-
-INLINE void processmsg_gcfinishmark_I() {
-  int data1 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  int data2 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  int data3 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  // received a mark phase finish msg
-  if(BAMBOO_NUM_OF_CORE != STARTUPCORE) {
-    // non startup core can not receive this msg
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT_REG(data1);
-#endif
-    BAMBOO_EXIT(0xb002);
-  }
-  // all cores should do mark
-  if(data1 < NUMCORESACTIVE) {
-    gccorestatus[data1] = 0;
-       int entry_index = 0;
-       if(waitconfirm)  {
-         // phase 2
-         entry_index = (gcnumsrobjs_index == 0) ? 1 : 0;
-       } else {
-         // phase 1
-         entry_index = gcnumsrobjs_index;
-       }
-    gcnumsendobjs[entry_index][data1] = data2;
-    gcnumreceiveobjs[entry_index][data1] = data3;
-  }
-}
-
-INLINE void processmsg_gcfinishcompact_I() {
-  if(BAMBOO_NUM_OF_CORE != STARTUPCORE) {
-    // non startup core can not receive this msg
-    // return -1
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT_REG(msgdata[msgdataindex] /*[1]*/);
-#endif
-    BAMBOO_EXIT(0xb003);
-  }
-  int cnum = msgdata[msgdataindex];
-  MSG_INDEXINC_I();       //msgdata[1];
-  int filledblocks = msgdata[msgdataindex];
-  MSG_INDEXINC_I();       //msgdata[2];
-  int heaptop = msgdata[msgdataindex];
-  MSG_INDEXINC_I();       //msgdata[3];
-  int data4 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();       //msgdata[4];
-  // only gc cores need to do compact
-  if(cnum < NUMCORES4GC) {
-    if(COMPACTPHASE == gcphase) {
-      gcfilledblocks[cnum] = filledblocks;
-      gcloads[cnum] = heaptop;
-    }
-    if(data4 > 0) {
-      // ask for more mem
-      int startaddr = 0;
-      int tomove = 0;
-      int dstcore = 0;
-      if(gcfindSpareMem_I(&startaddr, &tomove, &dstcore, data4, cnum)) {
-               // cache the msg first
-               if(BAMBOO_CHECK_SEND_MODE()) {
-                 cache_msg_4(cnum, GCMOVESTART, dstcore, startaddr, tomove);
-               } else {
-                 send_msg_4(cnum, GCMOVESTART, dstcore, startaddr, tomove, true);
-               }
-      }
-    } else {
-      gccorestatus[cnum] = 0;
-    }  // if(data4>0)
-  }  // if(cnum < NUMCORES4GC)
-}
-
-INLINE void processmsg_gcfinishmapinfo_I() {
-  int data1 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  // received a map phase finish msg
-  if(BAMBOO_NUM_OF_CORE != STARTUPCORE) {
-    // non startup core can not receive this msg
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT_REG(data1);
-#endif
-    BAMBOO_EXIT(0xb004);
-  }
-  // all cores should do flush
-  if(data1 < NUMCORES4GC) {
-    gccorestatus[data1] = 0;
-  }
-}
-
-
-INLINE void processmsg_gcfinishflush_I() {
-  int data1 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  // received a flush phase finish msg
-  if(BAMBOO_NUM_OF_CORE != STARTUPCORE) {
-    // non startup core can not receive this msg
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT_REG(data1);
-#endif
-    BAMBOO_EXIT(0xb005);
-  }
-  // all cores should do flush
-  if(data1 < NUMCORESACTIVE) {
-    gccorestatus[data1] = 0;
-  }
-}
-
-INLINE void processmsg_gcmarkconfirm_I() {
-  if((BAMBOO_NUM_OF_CORE == STARTUPCORE)
-     || (BAMBOO_NUM_OF_CORE > NUMCORESACTIVE - 1)) {
-    // wrong core to receive such msg
-    BAMBOO_EXIT(0xb006);
-  } else {
-    // send response msg, cahce the msg first
-    if(BAMBOO_CHECK_SEND_MODE()) {
-         cache_msg_5(STARTUPCORE, GCMARKREPORT, BAMBOO_NUM_OF_CORE,
-                                 gcbusystatus, gcself_numsendobjs,
-                                 gcself_numreceiveobjs);
-    } else {
-         send_msg_5(STARTUPCORE, GCMARKREPORT, BAMBOO_NUM_OF_CORE,
-                                gcbusystatus, gcself_numsendobjs,
-                                gcself_numreceiveobjs, true);
-    }
-  }
-}
-
-INLINE void processmsg_gcmarkreport_I() {
-  int data1 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  int data2 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  int data3 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  int data4 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  // received a marked phase finish confirm response msg
-  if(BAMBOO_NUM_OF_CORE != STARTUPCORE) {
-    // wrong core to receive such msg
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT_REG(data2);
-#endif
-    BAMBOO_EXIT(0xb007);
-  } else {
-       int entry_index = 0;
-    if(waitconfirm) {
-         // phse 2
-      numconfirm--;
-         entry_index = (gcnumsrobjs_index == 0) ? 1 : 0;
-    } else {
-         // can never reach here
-         // phase 1
-         entry_index = gcnumsrobjs_index;
-       }
-    gccorestatus[data1] = data2;
-    gcnumsendobjs[entry_index][data1] = data3;
-    gcnumreceiveobjs[entry_index][data1] = data4;
-  }
-}
-
-INLINE void processmsg_gcmarkedobj_I() {
-  int data1 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  // received a markedObj msg
-  if(((int *)data1)[6] == INIT) {
-    // this is the first time that this object is discovered,
-    // set the flag as DISCOVERED
-    ((int *)data1)[6] = DISCOVERED;
-    gc_enqueue_I(data1);
-  } 
-  // set the remote flag
-  ((int *)data1)[6] |= REMOTEM;
-  gcself_numreceiveobjs++;
-  gcbusystatus = true;
-}
-
-INLINE void processmsg_gcmovestart_I() {
-  gctomove = true;
-  gcdstcore = msgdata[msgdataindex];
-  MSG_INDEXINC_I();       //msgdata[1];
-  gcmovestartaddr = msgdata[msgdataindex];
-  MSG_INDEXINC_I();       //msgdata[2];
-  gcblock2fill = msgdata[msgdataindex];
-  MSG_INDEXINC_I();       //msgdata[3];
-}
-
-INLINE void processmsg_gcmaprequest_I() {
-#ifdef GC_PROFILE
-  //unsigned long long ttime = BAMBOO_GET_EXE_TIME();
-#endif
-  void * dstptr = NULL;
-  int data1 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-#ifdef GC_PROFILE
-  // TODO unsigned long long ttime = BAMBOO_GET_EXE_TIME();
-#endif
-#ifdef LOCALHASHTBL_TEST
-  RuntimeHashget(gcpointertbl, data1, &dstptr);
-#else
-  dstptr = mgchashSearch(gcpointertbl, data1);
-#endif
-  //MGCHashget(gcpointertbl, data1, &dstptr);
-#ifdef GC_PROFILE
-  // TODO flushstalltime += BAMBOO_GET_EXE_TIME() - ttime;
-#endif
-  int data2 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-#ifdef GC_PROFILE
-  // TODO unsigned long long ttimei = BAMBOO_GET_EXE_TIME();
-#endif
-  if(NULL == dstptr) {
-    // no such pointer in this core, something is wrong
-#ifdef DEBUG
-    BAMBOO_DEBUGPRINT_REG(data1);
-    BAMBOO_DEBUGPRINT_REG(data2);
-#endif
-    BAMBOO_EXIT(0xb008);
-    //assume that the object was not moved, use the original address
-    /*if(isMsgSending) {
-            cache_msg_3(msgdata[2], GCMAPINFO, msgdata[1], msgdata[1]);
-       } else {
-            send_msg_3(msgdata[2], GCMAPINFO, msgdata[1], msgdata[1]);
-       }*/
-  } else {
-    // send back the mapping info, cache the msg first
-    if(BAMBOO_CHECK_SEND_MODE()) {
-         cache_msg_3(data2, GCMAPINFO, data1, (int)dstptr);
-    } else {
-         send_msg_3(data2, GCMAPINFO, data1, (int)dstptr, true);
-    }
-  }
-#ifdef GC_PROFILE
-  // TODO flushstalltime_i += BAMBOO_GET_EXE_TIME()-ttimei;
-  //num_mapinforequest_i++;
-#endif
-}
-
-INLINE void processmsg_gcmapinfo_I() {
-#ifdef GC_PROFILE
-  //unsigned long long ttime = BAMBOO_GET_EXE_TIME();
-#endif
-  int data1 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  gcmappedobj = msgdata[msgdataindex];  // [2]
-  MSG_INDEXINC_I();
-#ifdef LOCALHASHTBL_TEST
-  RuntimeHashadd_I(gcpointertbl, data1, gcmappedobj);
-#else
-  mgchashInsert_I(gcpointertbl, data1, gcmappedobj);
-#endif
-  //MGCHashadd_I(gcpointertbl, data1, gcmappedobj);
-  if(data1 == gcobj2map) {
-       gcismapped = true;
-  }
-#ifdef GC_PROFILE
-  //flushstalltime += BAMBOO_GET_EXE_TIME() - ttime;
-#endif
-}
-
-INLINE void processmsg_gcmaptbl_I() {
-  int data1 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  int data2 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  gcrpointertbls[data2] = (mgcsharedhashtbl_t *)data1; //(struct GCSharedHash *)data1;
-}
-
-INLINE void processmsg_gclobjinfo_I() {
-  numconfirm--;
-
-  int data1 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  int data2 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  if(BAMBOO_NUM_OF_CORE > NUMCORES4GC - 1) {
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT_REG(data2);
-#endif
-    BAMBOO_EXIT(0xb009);
-  }
-  // store the mark result info
-  int cnum = data2;
-  gcloads[cnum] = msgdata[msgdataindex];
-  MSG_INDEXINC_I();       // msgdata[3];
-  int data4 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  if(gcheaptop < data4) {
-    gcheaptop = data4;
-  }
-  // large obj info here
-  for(int k = 5; k < data1; ) {
-    int lobj = msgdata[msgdataindex];
-    MSG_INDEXINC_I();   //msgdata[k++];
-    int length = msgdata[msgdataindex];
-    MSG_INDEXINC_I();   //msgdata[k++];
-    gc_lobjenqueue_I(lobj, length, cnum);
-    gcnumlobjs++;
-  }  // for(int k = 5; k < msgdata[1];)
-}
-
-INLINE void processmsg_gclobjmapping_I() {
-  int data1 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  int data2 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-#ifdef LOCALHASHTBL_TEST
-  RuntimeHashadd_I(gcpointertbl, data1, data2);
-#else
-  mgchashInsert_I(gcpointertbl, data1, data2);
-#endif
-  //MGCHashadd_I(gcpointertbl, data1, data2);
-  mgcsharedhashInsert_I(gcsharedptbl, data1, data2);
-}
-
-#ifdef GC_PROFILE
-INLINE void processmsg_gcprofiles_I() {
-  int data1 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  int data2 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  int data3 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  gc_num_obj += data1;
-  gc_num_liveobj += data2;
-  gc_num_forwardobj += data3;
-  gc_num_profiles--;
-}
-#endif // GC_PROFILE
-
-#ifdef GC_CACHE_ADAPT
-INLINE void processmsg_gcstartpref_I() {
-  gcphase = PREFINISHPHASE;
-}
-
-INLINE void processmsg_gcfinishpref_I() {
-  int data1 = msgdata[msgdataindex];
-  MSG_INDEXINC_I();
-  // received a flush phase finish msg
-  if(BAMBOO_NUM_OF_CORE != STARTUPCORE) {
-    // non startup core can not receive this msg
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT_REG(data1);
-#endif
-    BAMBOO_EXIT(0xb00a);
-  }
-  // all cores should do flush
-  if(data1 < NUMCORESACTIVE) {
-    gccorestatus[data1] = 0;
-  }
-}
-#endif // GC_CACHE_ADAPT
-#endif // #ifdef MULTICORE_GC
-
-// receive object transferred from other cores
-// or the terminate message from other cores
-// Should be invoked in critical sections!!
-// NOTICE: following format is for threadsimulate version only
-//         RAW version please see previous description
-// format: type + object
-// type: -1--stall msg
-//      !-1--object
-// return value: 0--received an object
-//               1--received nothing
-//               2--received a Stall Msg
-//               3--received a lock Msg
-//               RAW version: -1 -- received nothing
-//                            otherwise -- received msg type
-int receiveObject(int send_port_pending) {
-#ifdef PROFILE_INTERRUPT
-  if(!interruptInfoOverflow) {
-    InterruptInfo* intInfo = RUNMALLOC_I(sizeof(struct interrupt_info));
-    interruptInfoArray[interruptInfoIndex] = intInfo;
-    intInfo->startTime = BAMBOO_GET_EXE_TIME();
-    intInfo->endTime = -1;
-  }
-#endif
-msg:
-  // get the incoming msgs
-  if(receiveMsg(send_port_pending) == -1) {
-    return -1;
-  }
-processmsg:
-  // processing received msgs
-  int size = 0;
-  MSG_REMAINSIZE_I(&size);
-  if((size == 0) || (checkMsgLength_I(size) == -1)) {
-    // not a whole msg
-    // have new coming msg
-    if((BAMBOO_MSG_AVAIL() != 0) && !msgdatafull) {
-      goto msg;
-    } else {
-      return -1;
-    }
-  }
-
-  if(msglength <= size) {
-    // have some whole msg
-    MSGTYPE type;
-    type = msgdata[msgdataindex]; //[0]
-    MSG_INDEXINC_I();
-    msgdatafull = false;
-    // TODO
-    //tprintf("msg type: %x\n", type);
-    switch(type) {
-    case TRANSOBJ: {
-      // receive a object transfer msg
-      processmsg_transobj_I();
-      break;
-    }   // case TRANSOBJ
-
-    case TRANSTALL: {
-      // receive a stall msg
-      processmsg_transtall_I();
-      break;
-    }   // case TRANSTALL
-
-// GC version have no lock msgs
-#ifndef MULTICORE_GC
-    case LOCKREQUEST: {
-      // receive lock request msg, handle it right now
-      processmsg_lockrequest_I();
-      break;
-    }   // case LOCKREQUEST
-
-    case LOCKGROUNT: {
-      // receive lock grount msg
-      processmsg_lockgrount_I();
-      break;
-    }   // case LOCKGROUNT
-
-    case LOCKDENY: {
-      // receive lock deny msg
-      processmsg_lockdeny_I();
-      break;
-    }   // case LOCKDENY
-
-    case LOCKRELEASE: {
-      processmsg_lockrelease_I();
-      break;
-    }   // case LOCKRELEASE
-#endif // #ifndef MULTICORE_GC
-
-#ifdef PROFILE
-    case PROFILEOUTPUT: {
-      // receive an output profile data request msg
-      processmsg_profileoutput_I();
-      break;
-    }   // case PROFILEOUTPUT
-
-    case PROFILEFINISH: {
-      // receive a profile output finish msg
-      processmsg_profilefinish_I();
-      break;
-    }   // case PROFILEFINISH
-#endif // #ifdef PROFILE
-
-// GC version has no lock msgs
-#ifndef MULTICORE_GC
-    case REDIRECTLOCK: {
-      // receive a redirect lock request msg, handle it right now
-      processmsg_redirectlock_I();
-      break;
-    }   // case REDIRECTLOCK
-
-    case REDIRECTGROUNT: {
-      // receive a lock grant msg with redirect info
-      processmsg_redirectgrount_I();
-      break;
-    }   // case REDIRECTGROUNT
-
-    case REDIRECTDENY: {
-      // receive a lock deny msg with redirect info
-      processmsg_redirectdeny_I();
-      break;
-    }   // case REDIRECTDENY
-
-    case REDIRECTRELEASE: {
-      // receive a lock release msg with redirect info
-      processmsg_redirectrelease_I();
-      break;
-    }   // case REDIRECTRELEASE
-#endif // #ifndef MULTICORE_GC
-
-    case STATUSCONFIRM: {
-      // receive a status confirm info
-      processmsg_statusconfirm_I();
-      break;
-    }   // case STATUSCONFIRM
-
-    case STATUSREPORT: {
-      processmsg_statusreport_I();
-      break;
-    }   // case STATUSREPORT
-
-    case TERMINATE: {
-      // receive a terminate msg
-      processmsg_terminate_I();
-      break;
-    }   // case TERMINATE
-
-    case MEMREQUEST: {
-      processmsg_memrequest_I();
-      break;
-    }   // case MEMREQUEST
-
-    case MEMRESPONSE: {
-      processmsg_memresponse_I();
-      break;
-    }   // case MEMRESPONSE
-
-#ifdef MULTICORE_GC
-    // GC msgs
-    case GCSTARTPRE: {
-      processmsg_gcstartpre_I();
-      break;
-    }   // case GCSTARTPRE
-       
-       case GCSTARTINIT: {
-      processmsg_gcstartinit_I();
-      break;
-    }   // case GCSTARTINIT
-
-    case GCSTART: {
-      // receive a start GC msg
-      processmsg_gcstart_I();
-      break;
-    }   // case GCSTART
-
-    case GCSTARTCOMPACT: {
-      // a compact phase start msg
-      processmsg_gcstartcompact_I();
-      break;
-    }   // case GCSTARTCOMPACT
-
-       case GCSTARTMAPINFO: {
-      // received a flush phase start msg
-      processmsg_gcstartmapinfo_I();
-      break;
-    }   // case GCSTARTFLUSH
-
-    case GCSTARTFLUSH: {
-      // received a flush phase start msg
-      processmsg_gcstartflush_I();
-      break;
-    }   // case GCSTARTFLUSH
-
-    case GCFINISHPRE: {
-      processmsg_gcfinishpre_I();
-      break;
-    }   // case GCFINISHPRE
-       
-       case GCFINISHINIT: {
-      processmsg_gcfinishinit_I();
-      break;
-    }   // case GCFINISHINIT
-
-    case GCFINISHMARK: {
-      processmsg_gcfinishmark_I();
-      break;
-    }   // case GCFINISHMARK
-
-    case GCFINISHCOMPACT: {
-      // received a compact phase finish msg
-      processmsg_gcfinishcompact_I();
-      break;
-    }   // case GCFINISHCOMPACT
-
-       case GCFINISHMAPINFO: {
-      processmsg_gcfinishmapinfo_I();
-      break;
-    }   // case GCFINISHMAPINFO
-
-    case GCFINISHFLUSH: {
-      processmsg_gcfinishflush_I();
-      break;
-    }   // case GCFINISHFLUSH
-
-    case GCFINISH: {
-      // received a GC finish msg
-      gcphase = FINISHPHASE;
-      break;
-    }   // case GCFINISH
-
-    case GCMARKCONFIRM: {
-      // received a marked phase finish confirm request msg
-      // all cores should do mark
-      processmsg_gcmarkconfirm_I();
-      break;
-    }   // case GCMARKCONFIRM
-
-    case GCMARKREPORT: {
-      processmsg_gcmarkreport_I();
-      break;
-    }   // case GCMARKREPORT
-
-    case GCMARKEDOBJ: {
-      processmsg_gcmarkedobj_I();
-      break;
-    }   // case GCMARKEDOBJ
-
-    case GCMOVESTART: {
-      // received a start moving objs msg
-      processmsg_gcmovestart_I();
-      break;
-    }   // case GCMOVESTART
-
-    case GCMAPREQUEST: {
-      // received a mapping info request msg
-      processmsg_gcmaprequest_I();
-      break;
-    }   // case GCMAPREQUEST
-
-    case GCMAPINFO: {
-      // received a mapping info response msg
-      processmsg_gcmapinfo_I();
-      break;
-    }   // case GCMAPINFO
-
-    case GCMAPTBL: {
-      // received a mapping tbl response msg
-      processmsg_gcmaptbl_I();
-      break;
-    }   // case GCMAPTBL
-       
-       case GCLOBJREQUEST: {
-      // received a large objs info request msg
-      transferMarkResults_I();
-      break;
-    }   // case GCLOBJREQUEST
-
-    case GCLOBJINFO: {
-      // received a large objs info response msg
-      processmsg_gclobjinfo_I();
-      break;
-    }   // case GCLOBJINFO
+    /* Outer loop iterates through all parameter queues an object of
+       this type could be in.  */
+    for(j = 0; j < length; j++) {
+      parameter = queues[j];
+      /* Check tags */
+      if (parameter->numbertags>0) {
+       if (tagptr==NULL)
+         goto nextloop;  //that means the object has no tag
+       //but that param needs tag
+       else if(tagptr->type==TAGTYPE) {     //one tag
+         for(i=0; i<parameter->numbertags; i++) {
+           //slotid is parameter->tagarray[2*i];
+           int tagid=parameter->tagarray[2*i+1];
+           if (tagid!=tagptr->flag)
+             goto nextloop;   /*We don't have this tag */
+         }
+       } else {   //multiple tags
+         struct ArrayObject * ao=(struct ArrayObject *) tagptr;
+         for(i=0; i<parameter->numbertags; i++) {
+           //slotid is parameter->tagarray[2*i];
+           int tagid=parameter->tagarray[2*i+1];
+           int j;
+           for(j=0; j<ao->___cachedCode___; j++) {
+             if (tagid==ARRAYGET(ao, struct ___TagDescriptor___*, j)->flag)
+               goto foundtag;
+           }
+           goto nextloop;
+         foundtag:
+           ;
+         }
+       }
+      }
+      
+      /* Check flags */
+      for(i=0; i<parameter->numberofterms; i++) {
+       int andmask=parameter->intarray[i*2];
+       int checkmask=parameter->intarray[i*2+1];
+       if ((ptr->flag&andmask)==checkmask) {
+         enqueuetasks(parameter, prevptr, ptr, NULL, 0);
+         prevptr=parameter;
+         break;
+       }
+      }
+    nextloop:
+      ;
+    }
+  }
+}
 
-    case GCLOBJMAPPING: {
-      // received a large obj mapping info msg
-      processmsg_gclobjmapping_I();
-      break;
-    }  // case GCLOBJMAPPING
+void enqueueObject_I(void * vptr,
+                     struct parameterwrapper ** vqueues,
+                     int vlength) {
+  struct ___Object___ *ptr = (struct ___Object___ *)vptr;
 
-#ifdef GC_PROFILE
-       case GCPROFILES: {
-      // received a gcprofiles msg
-      processmsg_gcprofiles_I();
-      break;
+  {
+    struct parameterwrapper * parameter=NULL;
+    int j;
+    int i;
+    struct parameterwrapper * prevptr=NULL;
+    struct ___Object___ *tagptr=NULL;
+    struct parameterwrapper ** queues = vqueues;
+    int length = vlength;
+    if(BAMBOO_NUM_OF_CORE > NUMCORESACTIVE - 1) {
+      return;
     }
-#endif // GC_PROFILE
-
-#ifdef GC_CACHE_ADAPT
-       case GCSTARTPREF: {
-      // received a gcstartpref msg
-      processmsg_gcstartpref_I();
-      break;
+    if(queues == NULL) {
+      queues = objectqueues[BAMBOO_NUM_OF_CORE][ptr->type];
+      length = numqueues[BAMBOO_NUM_OF_CORE][ptr->type];
     }
+    tagptr=ptr->___tags___;
 
-       case GCFINISHPREF: {
-      // received a gcfinishpref msg
-      processmsg_gcfinishpref_I();
-      break;
+    /* Outer loop iterates through all parameter queues an object of
+       this type could be in.  */
+    for(j = 0; j < length; j++) {
+      parameter = queues[j];
+      /* Check tags */
+      if (parameter->numbertags>0) {
+       if (tagptr==NULL)
+         goto nextloop;      //that means the object has no tag
+       //but that param needs tag
+       else if(tagptr->type==TAGTYPE) {   //one tag
+         for(i=0; i<parameter->numbertags; i++) {
+           //slotid is parameter->tagarray[2*i];
+           int tagid=parameter->tagarray[2*i+1];
+           if (tagid!=tagptr->flag)
+             goto nextloop;            /*We don't have this tag */
+         }
+       } else {    //multiple tags
+         struct ArrayObject * ao=(struct ArrayObject *) tagptr;
+         for(i=0; i<parameter->numbertags; i++) {
+           //slotid is parameter->tagarray[2*i];
+           int tagid=parameter->tagarray[2*i+1];
+           int j;
+           for(j=0; j<ao->___cachedCode___; j++) {
+             if (tagid==ARRAYGET(ao, struct ___TagDescriptor___*, j)->flag)
+               goto foundtag;
+           }
+           goto nextloop;
+         foundtag:
+           ;
+         }
+       }
+      }
+      
+      /* Check flags */
+      for(i=0; i<parameter->numberofterms; i++) {
+       int andmask=parameter->intarray[i*2];
+       int checkmask=parameter->intarray[i*2+1];
+       if ((ptr->flag&andmask)==checkmask) {
+         enqueuetasks_I(parameter, prevptr, ptr, NULL, 0);
+         prevptr=parameter;
+         break;
+       }
+      }
+    nextloop:
+      ;
     }
-#endif // GC_CACHE_ADAPT
-#endif // #ifdef MULTICORE_GC
+  }
+}
 
-    default:
-      break;
-    }  // switch(type)
-    msglength = BAMBOO_MSG_BUF_LENGTH;
-    // TODO
-    //printf("++ msg: %x \n", type);
 
-    if(msgdataindex != msgdatalast) {
-      // still have available msg
-      goto processmsg;
+int * getAliasLock(void ** ptrs, int length, struct RuntimeHash * tbl) {
+#ifdef TILERA_BME
+  int i = 0;
+  int locks[length];
+  int locklen = 0;
+  // sort all the locks required by the objs in the aliased set
+  for(; i < length; i++) {
+    struct ___Object___ * ptr = (struct ___Object___ *)(ptrs[i]);
+    int lock = 0;
+    int j = 0;
+    if(ptr->lock == NULL) {
+      lock = (int)(ptr);
+    } else {
+      lock = (int)(ptr->lock);
     }
-#ifdef DEBUG
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT(0xe88d);
-#endif
-#endif
-
-    // have new coming msg
-    if(BAMBOO_MSG_AVAIL() != 0) {
-      goto msg;
-    } // TODO
-
-#ifdef PROFILE_INTERRUPT
-  if(!interruptInfoOverflow) {
-    interruptInfoArray[interruptInfoIndex]->endTime=BAMBOO_GET_EXE_TIME();
-    interruptInfoIndex++;
-    if(interruptInfoIndex == INTERRUPTINFOLENGTH) {
-      interruptInfoOverflow = true;
+    bool insert = true;
+    for(j = 0; j < locklen; j++) {
+      if(locks[j] == lock) {
+       insert = false;
+       break;
+      } else if(locks[j] > lock) {
+       break;
+      }
+    }
+    if(insert) {
+      int h = locklen;
+      for(; h > j; h--) {
+       locks[h] = locks[h-1];
+      }
+      locks[j] = lock;
+      locklen++;
     }
   }
-#endif
-    return (int)type;
+  // use the smallest lock as the shared lock for the whole set
+  return (int *)(locks[0]);
+#else // TILERA_BME
+  // TODO possible bug here!!!
+  if(length == 0) {
+    return (int*)(RUNMALLOC(sizeof(int)));
   } else {
-    // not a whole msg
-#ifdef DEBUG
-#ifndef CLOSE_PRINT
-    BAMBOO_DEBUGPRINT(0xe88e);
-#endif
-#endif
-    return -2;
+    int i = 0;
+    int locks[length];
+    int locklen = 0;
+    bool redirect = false;
+    int redirectlock = 0;
+    for(; i < length; i++) {
+      struct ___Object___ * ptr = (struct ___Object___ *)(ptrs[i]);
+      int lock = 0;
+      int j = 0;
+      if(ptr->lock == NULL) {
+       lock = (int)(ptr);
+      } else {
+       lock = (int)(ptr->lock);
+      }
+      if(redirect) {
+       if(lock != redirectlock) {
+         RuntimeHashadd(tbl, lock, redirectlock);
+       }
+      } else {
+       if(RuntimeHashcontainskey(tbl, lock)) {
+         // already redirected
+         redirect = true;
+         RuntimeHashget(tbl, lock, &redirectlock);
+         for(; j < locklen; j++) {
+           if(locks[j] != redirectlock) {
+             RuntimeHashadd(tbl, locks[j], redirectlock);
+           }
+         }
+       } else {
+         bool insert = true;
+         for(j = 0; j < locklen; j++) {
+           if(locks[j] == lock) {
+             insert = false;
+             break;
+           } else if(locks[j] > lock) {
+             break;
+           }
+         }
+         if(insert) {
+           int h = locklen;
+           for(; h > j; h--) {
+             locks[h] = locks[h-1];
+           }
+           locks[j] = lock;
+           locklen++;
+         }
+       }
+      }
+    }
+    if(redirect) {
+      return (int *)redirectlock;
+    } else {
+      // use the first lock as the shared lock
+      for(j = 1; j < locklen; j++) {
+       if(locks[j] != locks[0]) {
+         RuntimeHashadd(tbl, locks[j], locks[0]);
+       }
+      }
+      return (int *)(locks[0]);
+    }
+  }
+#endif // TILERA_BME
+}
+
+void addAliasLock(void * ptr, int lock) {
+  struct ___Object___ * obj = (struct ___Object___ *)ptr;
+  if(((int)ptr != lock) && (obj->lock != (int*)lock)) {
+    // originally no alias lock associated or have a different alias lock
+    // flush it as the new one
+#ifdef TILERA_BME
+    while(obj->lock != NULL) {
+      // previously have alias lock, trace the 'root' obj and redirect it
+      obj = (struct ___Object___ *)(obj->lock);
+    } 
+#endif // TILERA_BME
+    obj->lock = (int *)lock;
   }
 }
 
@@ -3463,7 +772,6 @@ int enqueuetasks(struct parameterwrapper *parameter,
                  int numenterflags) {
   void * taskpointerarray[MAXTASKPARAMS];
   int j;
-  //int numparams=parameter->task->numParameters;
   int numiterators=parameter->task->numTotal-1;
   int retval=1;
 
@@ -3471,7 +779,7 @@ int enqueuetasks(struct parameterwrapper *parameter,
 
   //this add the object to parameterwrapper
   ObjectHashadd(parameter->objectset, (int) ptr, 0, (int) enterflags,
-                numenterflags, enterflags==NULL);
+      numenterflags, enterflags==NULL);
 
   /* Add enqueued object to parameter vector */
   taskpointerarray[parameter->slot]=ptr;
@@ -3511,8 +819,7 @@ backtrackinit:
       tpd->parameterArray[j]=taskpointerarray[j];
     }
     /* Enqueue task */
-    if (( /*!gencontains(failedtasks, tpd)&&*/
-          !gencontains(activetasks,tpd))) {
+    if (!gencontains(activetasks,tpd)) {
       genputtable(activetasks, tpd, tpd);
     } else {
       RUNFREE(tpd->parameterArray);
@@ -3525,17 +832,16 @@ backtrackinit:
 
     for(j=numiterators-1; j<numiterators; j++) {
 backtrackinc:
-      if(toiHasNext(
-                       &parameter->iterators[j],taskpointerarray OPTARG(failed)))
-               toiNext(&parameter->iterators[j], taskpointerarray OPTARG(failed));
+      if(toiHasNext(&parameter->iterators[j],taskpointerarray OPTARG(failed)))
+        toiNext(&parameter->iterators[j], taskpointerarray OPTARG(failed));
       else if (j>0) {
-               /* Need to backtrack */
-               toiReset(&parameter->iterators[j]);
-               j--;
-               goto backtrackinc;
+        /* Need to backtrack */
+        toiReset(&parameter->iterators[j]);
+        j--;
+        goto backtrackinc;
       } else {
-               /* Nothing more to enqueue */
-               return retval;
+        /* Nothing more to enqueue */
+        return retval;
       }
     }
   }
@@ -3549,11 +855,8 @@ int enqueuetasks_I(struct parameterwrapper *parameter,
                    int numenterflags) {
   void * taskpointerarray[MAXTASKPARAMS];
   int j;
-  //int numparams=parameter->task->numParameters;
   int numiterators=parameter->task->numTotal-1;
   int retval=1;
-  //int addnormal=1;
-  //int adderror=1;
 
   struct taskdescriptor * task=parameter->task;
 
@@ -3599,12 +902,11 @@ backtrackinit:
       tpd->parameterArray[j]=taskpointerarray[j];
     }
     /* Enqueue task */
-    if (( /*!gencontains(failedtasks, tpd)&&*/
-          !gencontains(activetasks,tpd))) {
+    if (!gencontains(activetasks,tpd)) {
       genputtable_I(activetasks, tpd, tpd);
     } else {
-      RUNFREE(tpd->parameterArray);
-      RUNFREE(tpd);
+      RUNFREE_I(tpd->parameterArray);
+      RUNFREE_I(tpd);
     }
 
     /* This loop iterates to the next parameter combination */
@@ -3613,17 +915,16 @@ backtrackinit:
 
     for(j=numiterators-1; j<numiterators; j++) {
 backtrackinc:
-      if(toiHasNext(
-                       &parameter->iterators[j], taskpointerarray OPTARG(failed)))
-               toiNext(&parameter->iterators[j], taskpointerarray OPTARG(failed));
+      if(toiHasNext(&parameter->iterators[j], taskpointerarray OPTARG(failed)))
+        toiNext(&parameter->iterators[j], taskpointerarray OPTARG(failed));
       else if (j>0) {
-               /* Need to backtrack */
-               toiReset(&parameter->iterators[j]);
-               j--;
-               goto backtrackinc;
+        /* Need to backtrack */
+        toiReset(&parameter->iterators[j]);
+        j--;
+        goto backtrackinc;
       } else {
-               /* Nothing more to enqueue */
-               return retval;
+        /* Nothing more to enqueue */
+        return retval;
       }
     }
   }
@@ -3645,49 +946,26 @@ void releasewritelock_r(void * lock, void * redirectlock) {
   int reallock = (int)lock;
   targetcore = (reallock >> 5) % NUMCORES;
 
-#ifdef DEBUG
-  BAMBOO_DEBUGPRINT(0xe671);
-  BAMBOO_DEBUGPRINT_REG((int)lock);
-  BAMBOO_DEBUGPRINT_REG(reallock);
-  BAMBOO_DEBUGPRINT_REG(targetcore);
-#endif
-
   if(targetcore == BAMBOO_NUM_OF_CORE) {
     BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
-#ifdef DEBUG
-    BAMBOO_DEBUGPRINT(0xf001);
-#endif
     // reside on this core
     if(!RuntimeHashcontainskey(locktbl, reallock)) {
       // no locks for this object, something is wrong
-      BAMBOO_EXIT(0xa00b);
+      BAMBOO_EXIT();
     } else {
       int rwlock_obj = 0;
       struct LockValue * lockvalue = NULL;
-#ifdef DEBUG
-      BAMBOO_DEBUGPRINT(0xe672);
-#endif
       RuntimeHashget(locktbl, reallock, &rwlock_obj);
       lockvalue = (struct LockValue *)rwlock_obj;
-#ifdef DEBUG
-      BAMBOO_DEBUGPRINT_REG(lockvalue->value);
-#endif
       lockvalue->value++;
       lockvalue->redirectlock = (int)redirectlock;
-#ifdef DEBUG
-      BAMBOO_DEBUGPRINT_REG(lockvalue->value);
-#endif
     }
     BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
-#ifdef DEBUG
-    BAMBOO_DEBUGPRINT(0xf000);
-#endif
     return;
   } else {
     // send lock release with redirect info msg
     // for 32 bit machine, the size is always 4 words
-    send_msg_4(targetcore, REDIRECTRELEASE, 1, (int)lock,
-               (int)redirectlock, false);
+    send_msg_4(targetcore,REDIRECTRELEASE,1,(int)lock,(int)redirectlock);
   }
 }
 #endif
@@ -3709,23 +987,13 @@ void executetasks() {
 
 newtask:
   while(hashsize(activetasks)>0) {
-#ifdef MULTICORE_GC
-    if(gcflag) gc(NULL);
-#endif
-#ifdef DEBUG
-    BAMBOO_DEBUGPRINT(0xe990);
-#endif
+    GCCHECK(NULL);
 
     /* See if there are any active tasks */
-    //if (hashsize(activetasks)>0) {
     int i;
-#ifdef PROFILE
 #ifdef ACCURATEPROFILE
-    profileTaskStart("tpd checking");
-#endif
+    PROFILE_TASK_START("tpd checking");
 #endif
-    //long clock1;
-    //clock1 = BAMBOO_GET_EXE_TIME();
 
     busystatus = true;
     currtpd=(struct taskparamdescriptor *) getfirstkey(activetasks);
@@ -3734,13 +1002,8 @@ newtask:
     numparams=currtpd->task->numParameters;
     numtotal=currtpd->task->numTotal;
 
-    // clear the lockRedirectTbl
     // (TODO, this table should be empty after all locks are released)
     // reset all locks
-    /*for(j = 0; j < MAXTASKPARAMS; j++) {
-            runtime_locks[j].redirectlock = 0;
-            runtime_locks[j].value = 0;
-       }*/
     // get all required locks
     runtime_locklen = 0;
     // check which locks are needed
@@ -3750,65 +1013,50 @@ newtask:
       int j = 0;
       bool insert = true;
       if(((struct ___Object___ *)param)->type == STARTUPTYPE) {
-               islock = false;
-               taskpointerarray[i+OFFSET]=param;
-               goto execute;
+        islock = false;
+        taskpointerarray[i+OFFSET]=param;
+        goto execute;
       }
-      if(((struct ___Object___ *)param)->lock == NULL) {
-               tmplock = (int)param;
-      } else {
-               tmplock = (int)(((struct ___Object___ *)param)->lock);
+      struct ___Object___ * obj = (struct ___Object___ *)param;
+      while(obj->lock != NULL) {
+        obj = (struct ___Object___ *)(obj->lock);
       }
+      tmplock = (int)(obj);
       // insert into the locks array
       for(j = 0; j < runtime_locklen; j++) {
-               if(runtime_locks[j].value == tmplock) {
-                 insert = false;
-                 break;
-               } else if(runtime_locks[j].value > tmplock) {
-                 break;
-               }
+        if(runtime_locks[j].value == tmplock) {
+          insert = false;
+          break;
+        } else if(runtime_locks[j].value > tmplock) {
+          break;
+        }
       }
       if(insert) {
-               int h = runtime_locklen;
-               for(; h > j; h--) {
-                 runtime_locks[h].redirectlock = runtime_locks[h-1].redirectlock;
-                 runtime_locks[h].value = runtime_locks[h-1].value;
-               }
-               runtime_locks[j].value = tmplock;
-               runtime_locks[j].redirectlock = (int)param;
-               runtime_locklen++;
+        int h = runtime_locklen;
+        for(; h > j; h--) {
+          runtime_locks[h].redirectlock = runtime_locks[h-1].redirectlock;
+          runtime_locks[h].value = runtime_locks[h-1].value;
+        }
+        runtime_locks[j].value = tmplock;
+        runtime_locks[j].redirectlock = (int)param;
+        runtime_locklen++;
       }
-    }  // line 2713: for(i = 0; i < numparams; i++)
-       // grab these required locks
-#ifdef DEBUG
-    BAMBOO_DEBUGPRINT(0xe991);
-#endif
-    //long clock2;
-    //clock2 = BAMBOO_GET_EXE_TIME();
+    }  // for(i = 0; i < numparams; i++)
+    // grab these required locks
 
     for(i = 0; i < runtime_locklen; i++) {
-      int * lock = (int *)(runtime_locks[i].redirectlock);
+      int * lock = (int *)(runtime_locks[i].value);
       islock = true;
       // require locks for this parameter if it is not a startup object
-#ifdef DEBUG
-      BAMBOO_DEBUGPRINT_REG((int)lock);
-      BAMBOO_DEBUGPRINT_REG((int)(runtime_locks[i].value));
-#endif
       getwritelock(lock);
       BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
-#ifdef DEBUG
-      BAMBOO_DEBUGPRINT(0xf001);
-#endif
-#ifdef PROFILE
-      //isInterrupt = false;
-#endif
       while(!lockflag) {
-               BAMBOO_WAITING_FOR_LOCK(0);
-         }
+        BAMBOO_WAITING_FOR_LOCK_I();
+      }
 #ifndef INTERRUPT
       if(reside) {
-               while(BAMBOO_WAITING_FOR_LOCK(0) != -1) {
-               }
+        while(BAMBOO_WAITING_FOR_LOCK_I() != -1) {
+        }
       }
 #endif
       grount = lockresult;
@@ -3819,154 +1067,117 @@ newtask:
       lockflag = false;
 #ifndef INTERRUPT
       reside = false;
-#endif
-#ifdef PROFILE
-      //isInterrupt = true;
 #endif
       BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
-#ifdef DEBUG
-      BAMBOO_DEBUGPRINT(0xf000);
-#endif
 
       if(grount == 0) {
-#ifdef DEBUG
-               BAMBOO_DEBUGPRINT(0xe992);
-               BAMBOO_DEBUGPRINT_REG(lock);
-#endif
-               // check if has the lock already
-               // can not get the lock, try later
-               // release all grabbed locks for previous parameters
-               for(j = 0; j < i; ++j) {
-                 lock = (int*)(runtime_locks[j].redirectlock);
-                 releasewritelock(lock);
-               }
-               genputtable(activetasks, currtpd, currtpd);
-               if(hashsize(activetasks) == 1) {
-                 // only one task right now, wait a little while before next try
-                 int halt = 10000;
-                 while(halt--) {
-                 }
-               }
-#ifdef PROFILE
+        // check if has the lock already
+        // can not get the lock, try later
+        // release all grabbed locks for previous parameters           
+        for(j = 0; j < i; j++) {
+          lock = (int*)(runtime_locks[j].value/*redirectlock*/);
+          releasewritelock(lock);
+        }
+        genputtable(activetasks, currtpd, currtpd);
+        if(hashsize(activetasks) == 1) {
+          // only one task right now, wait a little while before next try
+          int halt = 10000;
+          while(halt--) {
+          }
+        }
 #ifdef ACCURATEPROFILE
-               // fail, set the end of the checkTaskInfo
-               profileTaskEnd();
-#endif
+        // fail, set the end of the checkTaskInfo
+        PROFILE_TASK_END();
 #endif
-               goto newtask;
-       //}
+        goto newtask;
       }
     }   // line 2752:  for(i = 0; i < runtime_locklen; i++)
 
-    /*long clock3;
-       clock3 = BAMBOO_GET_EXE_TIME();
-       //tprintf("sort: %d, grab: %d \n", clock2-clock1, clock3-clock2);*/
-
-#ifdef DEBUG
-    BAMBOO_DEBUGPRINT(0xe993);
-#endif
     /* Make sure that the parameters are still in the queues */
     for(i=0; i<numparams; i++) {
       void * parameter=currtpd->parameterArray[i];
 
       // flush the object
-#ifdef CACHEFLUSH
       BAMBOO_CACHE_FLUSH_RANGE((int)parameter,
-                 classsize[((struct ___Object___ *)parameter)->type]);
-#endif
+          classsize[((struct ___Object___ *)parameter)->type]);
       tmpparam = (struct ___Object___ *)parameter;
       pd=currtpd->task->descriptorarray[i];
       pw=(struct parameterwrapper *) pd->queue;
       /* Check that object is still in queue */
       {
-               if (!ObjectHashcontainskey(pw->objectset, (int) parameter)) {
-#ifdef DEBUG
-                 BAMBOO_DEBUGPRINT(0xe994);
-                 BAMBOO_DEBUGPRINT_REG(parameter);
-#endif
-                 // release grabbed locks
-                 for(j = 0; j < runtime_locklen; ++j) {
-                       int * lock = (int *)(runtime_locks[j].redirectlock);
-                       releasewritelock(lock);
-                 }
-                 RUNFREE(currtpd->parameterArray);
-                 RUNFREE(currtpd);
-                 currtpd = NULL;
-                 goto newtask;
-               }
-      }   // line2865
-          /* Check if the object's flags still meets requirements */
+        if (!ObjectHashcontainskey(pw->objectset, (int) parameter)) {
+          // release grabbed locks
+          for(j = 0; j < runtime_locklen; j++) {
+            int * lock = (int *)(runtime_locks[j].value);
+            releasewritelock(lock);
+          }
+          RUNFREE(currtpd->parameterArray);
+          RUNFREE(currtpd);
+          currtpd = NULL;
+          goto newtask;
+        }
+      } 
+      /* Check if the object's flags still meets requirements */
       {
-               int tmpi = 0;
-               bool ismet = false;
-               for(tmpi = 0; tmpi < pw->numberofterms; ++tmpi) {
-                 andmask=pw->intarray[tmpi*2];
-                 checkmask=pw->intarray[tmpi*2+1];
-                 if((((struct ___Object___ *)parameter)->flag&andmask)==checkmask) {
-                       ismet = true;
-                       break;
-                 }
-               }
-               if (!ismet) {
-                 // flags are never suitable
-                 // remove this obj from the queue
-                 int next;
-                 int UNUSED, UNUSED2;
-                 int * enterflags;
-#ifdef DEBUG
-                 BAMBOO_DEBUGPRINT(0xe995);
-                 BAMBOO_DEBUGPRINT_REG(parameter);
-#endif
-                 ObjectHashget(pw->objectset, (int) parameter, (int *) &next,
-                                               (int *) &enterflags, &UNUSED, &UNUSED2);
-                 ObjectHashremove(pw->objectset, (int)parameter);
-                 if (enterflags!=NULL)
-                       RUNFREE(enterflags);
-                 // release grabbed locks
-                 for(j = 0; j < runtime_locklen; ++j) {
-                       int * lock = (int *)(runtime_locks[j].redirectlock);
-                       releasewritelock(lock);
-                 }
-                 RUNFREE(currtpd->parameterArray);
-                 RUNFREE(currtpd);
-                 currtpd = NULL;
-#ifdef PROFILE
+        int tmpi = 0;
+        bool ismet = false;
+        for(tmpi = 0; tmpi < pw->numberofterms; tmpi++) {
+          andmask=pw->intarray[tmpi*2];
+          checkmask=pw->intarray[tmpi*2+1];
+          if((((struct ___Object___ *)parameter)->flag&andmask)==checkmask) {
+            ismet = true;
+            break;
+          }
+        }
+        if (!ismet) {
+          // flags are never suitable
+          // remove this obj from the queue
+          int next;
+          int UNUSED, UNUSED2;
+          int * enterflags;
+          ObjectHashget(pw->objectset, (int) parameter, (int *) &next,
+              (int *) &enterflags, &UNUSED, &UNUSED2);
+          ObjectHashremove(pw->objectset, (int)parameter);
+          if (enterflags!=NULL)
+            RUNFREE(enterflags);
+          // release grabbed locks
+          for(j = 0; j < runtime_locklen; j++) {
+            int * lock = (int *)(runtime_locks[j].value/*redirectlock*/);
+            releasewritelock(lock);
+          }
+          RUNFREE(currtpd->parameterArray);
+          RUNFREE(currtpd);
+          currtpd = NULL;
 #ifdef ACCURATEPROFILE
-                 // fail, set the end of the checkTaskInfo
-                 profileTaskEnd();
-#endif
+          // fail, set the end of the checkTaskInfo
+          PROFILE_TASK_END();
 #endif
-                 goto newtask;
-               }   // line 2878: if (!ismet)
-      }   // line 2867
+          goto newtask;
+        }   //if (!ismet)
+      } 
 parameterpresent:
       ;
       /* Check that object still has necessary tags */
       for(j=0; j<pd->numbertags; j++) {
-               int slotid=pd->tagarray[2*j]+numparams;
-               struct ___TagDescriptor___ *tagd=currtpd->parameterArray[slotid];
-               if (!containstag(parameter, tagd)) {
-#ifdef DEBUG
-                 BAMBOO_DEBUGPRINT(0xe996);
-#endif
-                 {
-                       // release grabbed locks
-                       int tmpj = 0;
-                       for(tmpj = 0; tmpj < runtime_locklen; ++tmpj) {
-                         int * lock = (int *)(runtime_locks[tmpj].redirectlock);
-                         releasewritelock(lock);
-                       }
-                 }
-                 RUNFREE(currtpd->parameterArray);
-                 RUNFREE(currtpd);
-                 currtpd = NULL;
-                 goto newtask;
-               }   // line2911: if (!containstag(parameter, tagd))
-      }   // line 2808: for(j=0; j<pd->numbertags; j++)
+        int slotid=pd->tagarray[2*j]+numparams;
+        struct ___TagDescriptor___ *tagd=currtpd->parameterArray[slotid];
+        if (!containstag(parameter, tagd)) {
+         // release grabbed locks
+         int tmpj = 0;
+         for(tmpj = 0; tmpj < runtime_locklen; tmpj++) {
+           int * lock = (int *)(runtime_locks[tmpj].value/*redirectlock*/);
+           releasewritelock(lock);
+         }
+          RUNFREE(currtpd->parameterArray);
+          RUNFREE(currtpd);
+          currtpd = NULL;
+          goto newtask;                
+        }   
+      }   
 
       taskpointerarray[i+OFFSET]=parameter;
-    }   // line 2824: for(i=0; i<numparams; i++)
-        /* Copy the tags */
+    }   // for(i=0; i<numparams; i++)
+    /* Copy the tags */
     for(; i<numtotal; i++) {
       taskpointerarray[i+OFFSET]=currtpd->parameterArray[i];
     }
@@ -3978,93 +1189,53 @@ execute:
       ((int *)taskpointerarray)[0]=currtpd->numParameters;
       taskpointerarray[1]=NULL;
 #endif
-#ifdef PROFILE
 #ifdef ACCURATEPROFILE
       // check finish, set the end of the checkTaskInfo
-      profileTaskEnd();
+      PROFILE_TASK_END();
 #endif
-      profileTaskStart(currtpd->task->name);
-#endif
-      // TODO
-      //long clock4;
-      //clock4 = BAMBOO_GET_EXE_TIME();
-      //tprintf("sort: %d, grab: %d, check: %d \n", (int)(clock2-clock1), (int)(clock3-clock2), (int)(clock4-clock3));
+      PROFILE_TASK_START(currtpd->task->name);
 
-#ifdef DEBUG
-      BAMBOO_DEBUGPRINT(0xe997);
-#endif
       ((void (*)(void **))currtpd->task->taskptr)(taskpointerarray);
-      // TODO
-      //long clock5;
-      //clock5 = BAMBOO_GET_EXE_TIME();
-      // tprintf("sort: %d, grab: %d, check: %d \n", (int)(clock2-clock1), (int)(clock3-clock2), (int)(clock4-clock3));
 
-#ifdef PROFILE
 #ifdef ACCURATEPROFILE
       // task finish, set the end of the checkTaskInfo
-      profileTaskEnd();
+      PROFILE_TASK_END();
       // new a PostTaskInfo for the post-task execution
-      profileTaskStart("post task execution");
-#endif
-#endif
-#ifdef DEBUG
-      BAMBOO_DEBUGPRINT(0xe998);
-      BAMBOO_DEBUGPRINT_REG(islock);
+      PROFILE_TASK_START("post task execution");
 #endif
 
       if(islock) {
-#ifdef DEBUG
-               BAMBOO_DEBUGPRINT(0xe999);
-#endif
-               for(i = 0; i < runtime_locklen; ++i) {
-                 void * ptr = (void *)(runtime_locks[i].redirectlock);
-                 int * lock = (int *)(runtime_locks[i].value);
-#ifdef DEBUG
-                 BAMBOO_DEBUGPRINT_REG((int)ptr);
-                 BAMBOO_DEBUGPRINT_REG((int)lock);
-                 BAMBOO_DEBUGPRINT_REG(*((int*)lock+5));
-#endif
+        for(i = runtime_locklen; i>0; i--) {
+          void * ptr = (void *)(runtime_locks[i-1].redirectlock);
+          int * lock = (int *)(runtime_locks[i-1].value);
 #ifndef MULTICORE_GC
-                 if(RuntimeHashcontainskey(lockRedirectTbl, (int)lock)) {
-                       int redirectlock;
-                       RuntimeHashget(lockRedirectTbl, (int)lock, &redirectlock);
-                       RuntimeHashremovekey(lockRedirectTbl, (int)lock);
-                       releasewritelock_r(lock, (int *)redirectlock);
-                 } else {
+#ifndef TILERA_BME
+          if(RuntimeHashcontainskey(lockRedirectTbl, (int)lock)) {
+            int redirectlock;
+            RuntimeHashget(lockRedirectTbl, (int)lock, &redirectlock);
+            RuntimeHashremovekey(lockRedirectTbl, (int)lock);
+            releasewritelock_r(lock, (int *)redirectlock);
+          } else {
 #else
-                 {
+          {
 #endif
-                       releasewritelock(ptr);
-                 }
-               }
-      }     // line 3015: if(islock)
-
-      //long clock6;
-      //clock6 = BAMBOO_GET_EXE_TIME();
-      //tprintf("sort: %d, grab: %d, check: %d \n", (int)(clock2-clock1), (int)(clock3-clock2), (int)(clock4-clock3));
+#else
+          {
+#endif
+            releasewritelock(lock); // ptr
+          }
+        }
+      }     // if(islock)
 
-#ifdef PROFILE
       // post task execution finish, set the end of the postTaskInfo
-      profileTaskEnd();
-#endif
+      PROFILE_TASK_END();
 
       // Free up task parameter descriptor
       RUNFREE(currtpd->parameterArray);
       RUNFREE(currtpd);
       currtpd = NULL;
-#ifdef DEBUG
-      BAMBOO_DEBUGPRINT(0xe99a);
-#endif
-      //long clock7;
-      //clock7 = BAMBOO_GET_EXE_TIME();
-      //tprintf("sort: %d, grab: %d, check: %d, release: %d, other %d \n", (int)(clock2-clock1), (int)(clock3-clock2), (int)(clock4-clock3), (int)(clock6-clock5), (int)(clock7-clock6));
-
-    }   //
-    //} //  if (hashsize(activetasks)>0)
+    }   
   } //  while(hashsize(activetasks)>0)
-#ifdef DEBUG
-  BAMBOO_DEBUGPRINT(0xe99b);
-#endif
 }
 
 /* This function processes an objects tags */
@@ -4091,7 +1262,6 @@ void processtags(struct parameterdescriptor *pd,
   }
 }
 
-
 void processobject(struct parameterwrapper *parameter,
                    int index,
                    struct parameterdescriptor *pd,
@@ -4110,7 +1280,6 @@ void processobject(struct parameterwrapper *parameter,
 
   for(i=0; i<pd->numbertags; i++) {
     int slotid=pd->tagarray[2*i];
-    //int tagid=pd->tagarray[2*i+1];
     if (statusarray[slotid+numparams]!=0) {
       /* This tag has already been enqueued, use it to narrow search */
       parameter->iterators[*iteratorcount].tagbindings[tagcount]=
@@ -4145,44 +1314,44 @@ loopstart:
     /* Check for objects with existing tags */
     for(i=0; i<numparams; i++) {
       if (statusarray[i]==0) {
-               struct parameterdescriptor *pd=task->descriptorarray[i];
-               int j;
-               for(j=0; j<pd->numbertags; j++) {
-                 int slotid=pd->tagarray[2*j];
-                 if(statusarray[slotid+numparams]!=0) {
-                       processobject(parameter,i,pd,&iteratorcount,
-                               statusarray,numparams);
-                       processtags(pd,i,parameter,&iteratorcount,statusarray,numparams);
-                       goto loopstart;
-                 }
-               }
+       struct parameterdescriptor *pd=task->descriptorarray[i];
+       int j;
+       for(j=0; j<pd->numbertags; j++) {
+         int slotid=pd->tagarray[2*j];
+         if(statusarray[slotid+numparams]!=0) {
+           processobject(parameter,i,pd,&iteratorcount,
+                         statusarray,numparams);
+           processtags(pd,i,parameter,&iteratorcount,statusarray,numparams);
+           goto loopstart;
+         }
+       }
       }
     }
-
+    
     /* Next do objects w/ unbound tags*/
-
+    
     for(i=0; i<numparams; i++) {
       if (statusarray[i]==0) {
-               struct parameterdescriptor *pd=task->descriptorarray[i];
-               if (pd->numbertags>0) {
-                 processobject(parameter,i,pd,&iteratorcount,statusarray,numparams);
-                 processtags(pd,i,parameter,&iteratorcount,statusarray,numparams);
-                 goto loopstart;
-               }
+       struct parameterdescriptor *pd=task->descriptorarray[i];
+       if (pd->numbertags>0) {
+         processobject(parameter,i,pd,&iteratorcount,statusarray,numparams);
+         processtags(pd,i,parameter,&iteratorcount,statusarray,numparams);
+         goto loopstart;
+       }
       }
     }
-
+    
     /* Nothing with a tag enqueued */
-
+    
     for(i=0; i<numparams; i++) {
       if (statusarray[i]==0) {
-               struct parameterdescriptor *pd=task->descriptorarray[i];
-               processobject(parameter,i,pd,&iteratorcount,statusarray,numparams);
-               processtags(pd,i,parameter,&iteratorcount,statusarray,numparams);
-               goto loopstart;
+       struct parameterdescriptor *pd=task->descriptorarray[i];
+       processobject(parameter,i,pd,&iteratorcount,statusarray,numparams);
+       processtags(pd,i,parameter,&iteratorcount,statusarray,numparams);
+       goto loopstart;
       }
     }
-
+    
     /* Nothing left */
     return;
   }
@@ -4209,44 +1378,39 @@ void printdebug() {
 #endif
       ObjectHashiterator(set, &objit);
       while(ObjhasNext(&objit)) {
-               struct ___Object___ * obj=(struct ___Object___ *)Objkey(&objit);
-               struct ___Object___ * tagptr=obj->___tags___;
-               int nonfailed=Objdata4(&objit);
-               int numflags=Objdata3(&objit);
-               int flags=Objdata2(&objit);
-               Objnext(&objit);
+       struct ___Object___ * obj=(struct ___Object___ *)Objkey(&objit);
+       struct ___Object___ * tagptr=obj->___tags___;
+       int nonfailed=Objdata4(&objit);
+       int numflags=Objdata3(&objit);
+       int flags=Objdata2(&objit);
+       Objnext(&objit);
 #ifndef RAW
-               printf("    Contains %lx\n", obj);
-               printf("      flag=%d\n", obj->flag);
+       printf("    Contains %lx\n", obj);
+       printf("      flag=%d\n", obj->flag);
 #endif
-               if (tagptr==NULL) {
-               } else if (tagptr->type==TAGTYPE) {
+       if (tagptr==NULL) {
+       } else if (tagptr->type==TAGTYPE) {
 #ifndef RAW
-                 printf("      tag=%lx\n",tagptr);
-#else
-                 ;
+         printf("      tag=%lx\n",tagptr);
 #endif
-               } else {
-                 int tagindex=0;
-                 struct ArrayObject *ao=(struct ArrayObject *)tagptr;
-                 for(; tagindex<ao->___cachedCode___; tagindex++) {
+       } else {
+         int tagindex=0;
+         struct ArrayObject *ao=(struct ArrayObject *)tagptr;
+         for(; tagindex<ao->___cachedCode___; tagindex++) {
 #ifndef RAW
-                       printf("      tag=%lx\n",ARRAYGET(ao,struct ___TagDescriptor___*,
-                                                                                         tagindex));
+           printf("      tag=%lx\n",ARRAYGET(ao,struct ___TagDescriptor___*, tagindex));
 #else
-                       ;
+           ;
 #endif
-                 }
-               }
+         }
+       }
       }
     }
   }
 }
 
-
 /* This function processes the task information to create queues for
    each parameter type. */
-
 void processtasks() {
   int i;
   if(BAMBOO_NUM_OF_CORE > NUMCORESACTIVE - 1) {
@@ -4316,13 +1480,13 @@ int toiHasNext(struct tagobjectiterator *it,
     int i;
     if (objptr->type!=OBJECTARRAYTYPE) {
       if (it->tagobjindex>0)
-               return 0;
+       return 0;
       if (!ObjectHashcontainskey(it->objectset, (int) objptr))
-               return 0;
+       return 0;
       for(i=1; i<it->numtags; i++) {
-               struct ___TagDescriptor___ *tag2=objectarray[it->tagbindings[i]];
-               if (!containstag(objptr,tag2))
-                 return 0;
+       struct ___TagDescriptor___ *tag2=objectarray[it->tagbindings[i]];
+       if (!containstag(objptr,tag2))
+         return 0;
       }
       return 1;
     } else {
@@ -4330,20 +1494,20 @@ int toiHasNext(struct tagobjectiterator *it,
       int tagindex;
       int i;
       for(tagindex=it->tagobjindex;tagindex<ao->___cachedCode___;tagindex++){
-               struct ___Object___ *objptr=
-                 ARRAYGET(ao,struct ___Object___*,tagindex);
-               if (!ObjectHashcontainskey(it->objectset, (int) objptr))
-                 continue;
-               for(i=1; i<it->numtags; i++) {
-                 struct ___TagDescriptor___ *tag2=objectarray[it->tagbindings[i]];
-                 if (!containstag(objptr,tag2))
-                       goto nexttag;
-               }
-               it->tagobjindex=tagindex;
-               return 1;
-nexttag:
-               ;
-         }
+       struct ___Object___ *objptr=
+         ARRAYGET(ao,struct ___Object___*,tagindex);
+       if (!ObjectHashcontainskey(it->objectset, (int) objptr))
+         continue;
+       for(i=1; i<it->numtags; i++) {
+         struct ___TagDescriptor___ *tag2=objectarray[it->tagbindings[i]];
+         if (!containstag(objptr,tag2))
+           goto nexttag;
+       }
+       it->tagobjindex=tagindex;
+       return 1;
+      nexttag:
+       ;
+      }
       it->tagobjindex=tagindex;
       return 0;
     }
@@ -4360,7 +1524,7 @@ int containstag(struct ___Object___ *ptr,
     struct ArrayObject *ao=(struct ArrayObject *)objptr;
     for(j=0; j<ao->___cachedCode___; j++) {
       if (ptr==ARRAYGET(ao, struct ___Object___*, j)) {
-               return 1;
+       return 1;
       }
     }
     return 0;
@@ -4403,189 +1567,4 @@ void toiNext(struct tagobjectiterator *it,
     Objnext(&it->it);
   }
 }
-
-#ifdef PROFILE
-inline void profileTaskStart(char * taskname) {
-  if(!taskInfoOverflow) {
-    TaskInfo* taskInfo = RUNMALLOC(sizeof(struct task_info));
-    taskInfoArray[taskInfoIndex] = taskInfo;
-    taskInfo->taskName = taskname;
-    taskInfo->startTime = BAMBOO_GET_EXE_TIME();
-    taskInfo->endTime = -1;
-    taskInfo->exitIndex = -1;
-    taskInfo->newObjs = NULL;
-  }
-}
-
-inline void profileTaskEnd() {
-  if(!taskInfoOverflow) {
-    taskInfoArray[taskInfoIndex]->endTime = BAMBOO_GET_EXE_TIME();
-    taskInfoIndex++;
-    if(taskInfoIndex == TASKINFOLENGTH) {
-      taskInfoOverflow = true;
-      //taskInfoIndex = 0;
-    }
-  }
-}
-
-// output the profiling data
-void outputProfileData() {
-#ifdef USEIO
-  int i;
-  unsigned long long totaltasktime = 0;
-  unsigned long long preprocessingtime = 0;
-  unsigned long long objqueuecheckingtime = 0;
-  unsigned long long postprocessingtime = 0;
-  //int interruptiontime = 0;
-  unsigned long long other = 0;
-  unsigned long long averagetasktime = 0;
-  int tasknum = 0;
-
-  printf("Task Name, Start Time, End Time, Duration, Exit Index(, NewObj Name, Num)+\n");
-  // output task related info
-  for(i = 0; i < taskInfoIndex; i++) {
-    TaskInfo* tmpTInfo = taskInfoArray[i];
-    unsigned long long duration = tmpTInfo->endTime - tmpTInfo->startTime;
-    printf("%s, %lld, %lld, %lld, %lld",
-           tmpTInfo->taskName, tmpTInfo->startTime, tmpTInfo->endTime,
-           duration, tmpTInfo->exitIndex);
-    // summarize new obj info
-    if(tmpTInfo->newObjs != NULL) {
-      struct RuntimeHash * nobjtbl = allocateRuntimeHash(5);
-      struct RuntimeIterator * iter = NULL;
-      while(0 == isEmpty(tmpTInfo->newObjs)) {
-               char * objtype = (char *)(getItem(tmpTInfo->newObjs));
-               if(RuntimeHashcontainskey(nobjtbl, (int)(objtype))) {
-                 int num = 0;
-                 RuntimeHashget(nobjtbl, (int)objtype, &num);
-                 RuntimeHashremovekey(nobjtbl, (int)objtype);
-                 num++;
-                 RuntimeHashadd(nobjtbl, (int)objtype, num);
-               } else {
-                 RuntimeHashadd(nobjtbl, (int)objtype, 1);
-               }
-               //printf(stderr, "new obj!\n");
-      }
-
-      // output all new obj info
-      iter = RuntimeHashcreateiterator(nobjtbl);
-      while(RunhasNext(iter)) {
-               char * objtype = (char *)Runkey(iter);
-               int num = Runnext(iter);
-               printf(", %s, %d", objtype, num);
-      }
-    }
-    printf("\n");
-    if(strcmp(tmpTInfo->taskName, "tpd checking") == 0) {
-      preprocessingtime += duration;
-    } else if(strcmp(tmpTInfo->taskName, "post task execution") == 0) {
-      postprocessingtime += duration;
-    } else if(strcmp(tmpTInfo->taskName, "objqueue checking") == 0) {
-      objqueuecheckingtime += duration;
-    } else {
-      totaltasktime += duration;
-      averagetasktime += duration;
-      tasknum++;
-    }
-  }
-
-  if(taskInfoOverflow) {
-    printf("Caution: task info overflow!\n");
-  }
-
-  other = totalexetime-totaltasktime-preprocessingtime-postprocessingtime;
-  averagetasktime /= tasknum;
-
-  printf("\nTotal time: %lld\n", totalexetime);
-  printf("Total task execution time: %lld (%d%%)\n", totaltasktime,
-         (int)(((double)totaltasktime/(double)totalexetime)*100));
-  printf("Total objqueue checking time: %lld (%d%%)\n",
-         objqueuecheckingtime,
-         (int)(((double)objqueuecheckingtime/(double)totalexetime)*100));
-  printf("Total pre-processing time: %lld (%d%%)\n", preprocessingtime,
-         (int)(((double)preprocessingtime/(double)totalexetime)*100));
-  printf("Total post-processing time: %lld (%d%%)\n", postprocessingtime,
-         (int)(((double)postprocessingtime/(double)totalexetime)*100));
-  printf("Other time: %lld (%d%%)\n", other,
-         (int)(((double)other/(double)totalexetime)*100));
-
-
-  printf("\nAverage task execution time: %lld\n", averagetasktime);
-
-  //printf("\nTotal time spent for interruptions: %lld\n", interrupttime);
-#else
-  int i = 0;
-  int j = 0;
-
-  BAMBOO_DEBUGPRINT(0xdddd);
-  // output task related info
-  for(i= 0; i < taskInfoIndex; i++) {
-    TaskInfo* tmpTInfo = taskInfoArray[i];
-    char* tmpName = tmpTInfo->taskName;
-    int nameLen = strlen(tmpName);
-    BAMBOO_DEBUGPRINT(0xddda);
-    for(j = 0; j < nameLen; j++) {
-      BAMBOO_DEBUGPRINT_REG(tmpName[j]);
-    }
-    BAMBOO_DEBUGPRINT(0xdddb);
-    BAMBOO_DEBUGPRINT_REG(tmpTInfo->startTime);
-    BAMBOO_DEBUGPRINT_REG(tmpTInfo->endTime);
-    BAMBOO_DEBUGPRINT_REG(tmpTInfo->exitIndex);
-    if(tmpTInfo->newObjs != NULL) {
-      struct RuntimeHash * nobjtbl = allocateRuntimeHash(5);
-      struct RuntimeIterator * iter = NULL;
-      while(0 == isEmpty(tmpTInfo->newObjs)) {
-               char * objtype = (char *)(getItem(tmpTInfo->newObjs));
-               if(RuntimeHashcontainskey(nobjtbl, (int)(objtype))) {
-                 int num = 0;
-                 RuntimeHashget(nobjtbl, (int)objtype, &num);
-                 RuntimeHashremovekey(nobjtbl, (int)objtype);
-                 num++;
-                 RuntimeHashadd(nobjtbl, (int)objtype, num);
-               } else {
-                 RuntimeHashadd(nobjtbl, (int)objtype, 1);
-               }
-      }
-
-      // ouput all new obj info
-      iter = RuntimeHashcreateiterator(nobjtbl);
-      while(RunhasNext(iter)) {
-               char * objtype = (char *)Runkey(iter);
-               int num = Runnext(iter);
-               int nameLen = strlen(objtype);
-               BAMBOO_DEBUGPRINT(0xddda);
-               for(j = 0; j < nameLen; j++) {
-                 BAMBOO_DEBUGPRINT_REG(objtype[j]);
-               }
-               BAMBOO_DEBUGPRINT(0xdddb);
-               BAMBOO_DEBUGPRINT_REG(num);
-         }
-       }
-       BAMBOO_DEBUGPRINT(0xdddc);
-  }
-
-  if(taskInfoOverflow) {
-       BAMBOO_DEBUGPRINT(0xefee);
-  }
-
-#ifdef PROFILE_INTERRUPT
-  // output interrupt related info
-  for(i = 0; i < interruptInfoIndex; i++) {
-       InterruptInfo* tmpIInfo = interruptInfoArray[i];
-       BAMBOO_DEBUGPRINT(0xddde);
-       BAMBOO_DEBUGPRINT_REG(tmpIInfo->startTime);
-       BAMBOO_DEBUGPRINT_REG(tmpIInfo->endTime);
-       BAMBOO_DEBUGPRINT(0xdddf);
-  }
-
-  if(interruptInfoOverflow) {
-       BAMBOO_DEBUGPRINT(0xefef);
-  }
-#endif // PROFILE_INTERRUPT
-
-  BAMBOO_DEBUGPRINT(0xeeee);
-#endif
-}
-#endif  // #ifdef PROFILE
-
 #endif