2 #include "multicoremsg.h"
4 #include "multicoreruntime.h"
5 #include "multicoregarbage.h"
6 #include "multicoretaskprofile.h"
8 #include "runtime_arch.h"
11 int msgsizearray[] = {
13 -1, //TRANSOBJ, // 0xD1
14 4, //TRANSTALL, // 0xD2
15 5, //LOCKREQUEST, // 0xD3
16 4, //LOCKGROUNT, // 0xD4
17 4, //LOCKDENY, // 0xD5
18 4, //LOCKRELEASE, // 0xD6
19 2, //PROFILEOUTPUT, // 0xD7
20 1, //PROFILEFINISH, // 0xD8
21 6, //REDIRECTLOCK, // 0xD9
22 4, //REDIRECTGROUNT, // 0xDa
23 4, //REDIRECTDENY, // 0xDb
24 4, //REDIRECTRELEASE, // 0xDc
25 1, //STATUSCONFIRM, // 0xDd
26 5, //STATUSREPORT, // 0xDe
27 1, //TERMINATE, // 0xDf
28 3, //MEMREQUEST, // 0xE0
29 3, //MEMRESPONSE, // 0xE1
31 1, //GCSTARTPRE, // 0xE2
32 1, //GCSTARTINIT, // 0xE3
34 2, //GCSTARTCOMPACT, // 0xE5
35 1, //GCSTARTUPDATE, // 0xE6
36 4, //GCFINISHPRE, // 0xE7
37 2, //GCFINISHINIT, // 0xE8
38 4, //GCFINISHMARK, // 0xE9
39 3, //GCFINISHCOMPACT, // 0xEa
41 2, //GCFINISHUPDATE, // 0xEb
42 1, //GCFINISH, // 0xEc
43 1, //GCMARKCONFIRM, // 0xEd
44 5, //GCMARKREPORT, // 0xEe
45 2, //GCMARKEDOBJ, // 0xEf
46 2, //GCMOVESTART, // 0xF0
47 1, //GCLOBJREQUEST, // 0xF1
48 -1, //GCLOBJINFO, // 0xF2
50 4, //GCPROFILES, // 0xF3
53 1, //GCSTARTCACHEPOLICY // 0xF4
54 2, //GCFINISHCACHEPOLICY // 0xF5
55 1, //GCSTARTPREF, // 0xF6
56 2, //GCFINISHPREF, // 0xF7
57 #endif // GC_CACHE_ADAPT
58 #endif // MULTICORE_GC
62 INLINE unsigned int checkMsgLength_I(unsigned int realtype) {
63 #if (defined(TASK)||defined(MULTICORE_GC))
64 unsigned int type = realtype & 0xff;
66 unsigned int type = realtype;
68 BAMBOO_ASSERT(type<=MSGEND);
71 if(type==TRANSOBJ||type==GCLOBJINFO) {
76 if (type==GCLOBJINFO) {
78 #if (defined(TASK)||defined(MULTICORE_GC))
82 return msgsizearray[type];
86 INLINE void processmsg_transobj_I(int msglength) {
87 struct transObjInfo * transObj=RUNMALLOC_I(sizeof(struct transObjInfo));
88 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
90 // store the object and its corresponding queue info, enqueue it later
91 transObj->objptr = (void *)msgdata[msgdataindex];
93 transObj->length = (msglength - 2) / 2;
94 transObj->queues = RUNMALLOC_I(sizeof(int)*(msglength - 3));
95 for(int k = 0; k < transObj->length; k++) {
96 transObj->queues[2*k] = msgdata[msgdataindex];
98 transObj->queues[2*k+1] = msgdata[msgdataindex];
101 // check if there is an existing duplicate item
102 struct QueueItem * prev = NULL;
103 for(struct QueueItem * qitem = getHead(&objqueue);qitem != NULL;qitem=(prev==NULL)?getHead(&objqueue):getNextQueueItem(prev)) {
104 struct transObjInfo * tmpinfo = (struct transObjInfo *)(qitem->objectptr);
105 if(tmpinfo->objptr == transObj->objptr) {
106 // the same object, remove outdate one
107 RUNFREE_I(tmpinfo->queues);
109 removeItem(&objqueue, qitem);
115 addNewItem_I(&objqueue, (void *)transObj);
117 self_numreceiveobjs++;
119 if(gc_status_info.gcprocessing) {
120 if(STARTUPCORE == BAMBOO_NUM_OF_CORE) {
121 // set the gcprecheck to enable checking again
124 // send a update pregc information msg to the master core
125 if(BAMBOO_CHECK_SEND_MODE()) {
126 cache_msg_4_I(STARTUPCORE,GCFINISHPRE,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
128 send_msg_4_I(STARTUPCORE,GCFINISHPRE,BAMBOO_NUM_OF_CORE,self_numsendobjs, self_numreceiveobjs);
136 INLINE void processmsg_transtall_I() {
137 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
139 int num_core = msgdata[msgdataindex];
141 int data2 = msgdata[msgdataindex];
143 int data3 = msgdata[msgdataindex];
145 if(num_core < NUMCORESACTIVE) {
146 corestatus[num_core] = 0;
147 numsendobjs[num_core] = data2;
148 numreceiveobjs[num_core] = data3;
153 INLINE void processmsg_lockrequest_I() {
154 // check to see if there is a lock exist for the required obj
155 // msgdata[1] -> lock type
156 int locktype = msgdata[msgdataindex];
158 int data2 = msgdata[msgdataindex]; // obj pointer
160 int data3 = msgdata[msgdataindex]; // lock
162 int data4 = msgdata[msgdataindex]; // request core
164 // -1: redirected, 0: approved, 1: denied
165 int deny=processlockrequest(locktype, data3, data2, data4, data4, true);
168 // for 32 bit machine, the size is always 4 words, cache the msg first
169 int tmp = deny==1 ? LOCKDENY : LOCKGROUNT;
170 if(BAMBOO_CHECK_SEND_MODE()) {
171 cache_msg_4_I(data4,tmp,locktype,data2,data3);
173 send_msg_4_I(data4,tmp,locktype,data2,data3);
178 INLINE void processmsg_lockgrount_I() {
180 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
181 int data2 = msgdata[msgdataindex];
183 int data3 = msgdata[msgdataindex];
185 BAMBOO_ASSERT((lockobj == data2) && (lock2require == data3));
193 INLINE void processmsg_lockdeny_I() {
195 int data2 = msgdata[msgdataindex];
197 int data3 = msgdata[msgdataindex];
199 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
200 BAMBOO_ASSERT((lockobj == data2) && (lock2require == data3));
208 INLINE void processmsg_lockrelease_I() {
209 int data1 = msgdata[msgdataindex];
211 int data2 = msgdata[msgdataindex];
213 int data3 = msgdata[msgdataindex];
215 // receive lock release msg
216 processlockrelease(data1, data2, 0, false);
219 INLINE void processmsg_redirectlock_I() {
220 // check to see if there is a lock exist for the required obj
221 int data1 = msgdata[msgdataindex];
222 MSG_INDEXINC_I(); // lock type
223 int data2 = msgdata[msgdataindex];
224 MSG_INDEXINC_I(); // obj pointer
225 int data3 = msgdata[msgdataindex];
226 MSG_INDEXINC_I(); // redirect lock
227 int data4 = msgdata[msgdataindex];
228 MSG_INDEXINC_I(); // root request core
229 int data5 = msgdata[msgdataindex];
230 MSG_INDEXINC_I(); // request core
231 int deny = processlockrequest_I(data1, data3, data2, data5, data4, true);
234 // for 32 bit machine, the size is always 4 words, cache the msg first
235 if(BAMBOO_CHECK_SEND_MODE()) {
236 cache_msg_4_I(data4,deny==1?REDIRECTDENY:REDIRECTGROUNT,data1,data2,data3);
238 send_msg_4_I(data4,deny==1?REDIRECTDENY:REDIRECTGROUNT,data1,data2,data3);
243 INLINE void processmsg_redirectgrount_I() {
245 int data2 = msgdata[msgdataindex];
247 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
248 BAMBOO_ASSERT(lockobj == data2, 0xe207);
249 int data3 = msgdata[msgdataindex];
253 RuntimeHashadd_I(objRedirectLockTbl, lockobj, data3);
259 INLINE void processmsg_redirectdeny_I() {
261 int data2 = msgdata[msgdataindex];
263 int data3 = msgdata[msgdataindex];
265 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
266 BAMBOO_ASSERT(lockobj == data2);
274 INLINE void processmsg_redirectrelease_I() {
275 int data1 = msgdata[msgdataindex];
277 int data2 = msgdata[msgdataindex];
279 int data3 = msgdata[msgdataindex];
281 processlockrelease_I(data1, data2, data3, true);
283 #endif // #ifndef MULTICORE_GC
286 INLINE void processmsg_profileoutput_I() {
287 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE != STARTUPCORE);
289 totalexetime = msgdata[msgdataindex];
295 // cache the msg first
296 if(BAMBOO_CHECK_SEND_MODE()) {
297 cache_msg_1_I(STARTUPCORE,PROFILEFINISH);
299 send_msg_1_I(STARTUPCORE,PROFILEFINISH);
303 INLINE void processmsg_profilefinish_I() {
304 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
309 INLINE void processmsg_statusconfirm_I() {
310 BAMBOO_ASSERT(((BAMBOO_NUM_OF_CORE != STARTUPCORE) && (BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1)));
312 // cache the msg first
313 if(BAMBOO_CHECK_SEND_MODE()) {
314 cache_msg_5_I(STARTUPCORE,STATUSREPORT,busystatus?1:0,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
316 send_msg_5_I(STARTUPCORE,STATUSREPORT,busystatus?1:0,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
320 INLINE void processmsg_statusreport_I() {
321 int data1 = msgdata[msgdataindex];
323 int data2 = msgdata[msgdataindex];
325 int data3 = msgdata[msgdataindex];
327 int data4 = msgdata[msgdataindex];
329 // receive a status confirm info
330 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
334 corestatus[data2] = data1;
335 numsendobjs[data2] = data3;
336 numreceiveobjs[data2] = data4;
339 INLINE void processmsg_terminate_I() {
342 #ifdef GC_CACHE_ADAPT
343 bamboo_mask_timer_intr(); // disable the TILE_TIMER interrupt
349 INLINE void processmsg_memrequest_I() {
350 int data1 = msgdata[msgdataindex];
352 int data2 = msgdata[msgdataindex];
354 // receive a shared memory request msg
355 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
359 if(!gc_status_info.gcprocessing || !gcflag) {
360 // either not doing GC or the master core has decided to stop GC but
361 // // still sending msgs to other cores to inform them to stop the GC
363 mem = smemalloc_I(data2, data1, &allocsize);
365 // send the start_va to request core, cache the msg first
366 if(BAMBOO_CHECK_SEND_MODE()) {
367 cache_msg_3_I(data2,MEMRESPONSE,mem,allocsize);
369 send_msg_3_I(data2,MEMRESPONSE,mem,allocsize);
371 } //else if mem == NULL, the gcflag of the startup core has been set
372 // and all the other cores have been informed to start gc
378 INLINE void processmsg_memresponse_I() {
379 void * memptr = msgdata[msgdataindex];
381 unsigned int numbytes = msgdata[msgdataindex];
383 // receive a shared memory response msg
385 // if is currently doing gc, dump this msg
386 if(!gc_status_info.gcprocessing) {
390 bamboo_smem_zero_top = NULL;
392 bamboo_smem_size = 0;
393 bamboo_cur_msp = NULL;
396 bamboo_smem_size = numbytes;
397 bamboo_cur_msp = memptr;
398 bamboo_smem_zero_top = bamboo_cur_msp;
400 bamboo_smem_size = numbytes;
401 bamboo_cur_msp =memptr;
411 INLINE void processmsg_gcstartpre_I() {
412 // the first time to be informed to start gc
415 // Zero out the remaining memory here because for the GC_CACHE_ADAPT
416 // version, we need to make sure during the gcinit phase the shared heap
417 // is not touched. Otherwise, there would be problem when adapt the cache
419 bamboo_smem_size = 0;
420 bamboo_cur_msp = NULL;
422 bamboo_smem_zero_top = NULL;
426 INLINE void processmsg_gcstartinit_I() {
427 gc_status_info.gcphase = INITPHASE;
430 INLINE void processmsg_gcstart_I() {
432 gc_status_info.gcphase = MARKPHASE;
435 INLINE void processmsg_gcstartcompact_I() {
436 gcblock2fill = msgdata[msgdataindex];
438 gc_status_info.gcphase = COMPACTPHASE;
441 INLINE void processmsg_gcstartupdate_I() {
442 gc_status_info.gcphase = UPDATEPHASE;
445 INLINE void processmsg_gcfinishpre_I() {
446 int data1 = msgdata[msgdataindex];
448 int data2 = msgdata[msgdataindex];
450 int data3 = msgdata[msgdataindex];
452 // received a init phase finish msg
453 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
455 // All cores should do init GC
457 gccorestatus[data1] = 0;
458 gcnumsendobjs[0][data1] = data2;
459 gcnumreceiveobjs[0][data1] = data3;
462 INLINE void processmsg_gcfinishinit_I() {
463 int data1 = msgdata[msgdataindex];
465 // received a init phase finish msg
466 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
468 // All cores should do init GC
469 if(data1 < NUMCORESACTIVE) {
470 gccorestatus[data1] = 0;
474 INLINE void processmsg_gcfinishmark_I() {
475 int data1 = msgdata[msgdataindex];
477 int data2 = msgdata[msgdataindex];
479 int data3 = msgdata[msgdataindex];
481 // received a mark phase finish msg
482 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
484 // all cores should do mark
485 if(data1 < NUMCORESACTIVE) {
486 gccorestatus[data1] = 0;
490 entry_index = (gcnumsrobjs_index == 0) ? 1 : 0;
493 entry_index = gcnumsrobjs_index;
495 gcnumsendobjs[entry_index][data1] = data2;
496 gcnumreceiveobjs[entry_index][data1] = data3;
500 void processmsg_returnmem_I() {
501 unsigned int cnum = msgdata[msgdataindex];
503 void * heaptop = (void *) msgdata[msgdataindex];
505 unsigned int blockindex;
506 BLOCKINDEX(blockindex, heaptop);
507 unsigned INTPTR localblocknum=GLOBALBLOCK2LOCAL(blockindex);
509 struct blockrecord * blockrecord=&allocationinfo.blocktable[blockindex];
511 blockrecord->status=BS_FREE;
512 blockrecord->usedspace=(unsigned INTPTR)(heaptop-OFFSET2BASEVA(blockindex));
513 blockrecord->freespace=BLOCKSIZE(localblocknum)-blockrecord->usedspace;
514 /* Update the lowest free block */
515 if (blockindex < allocationinfo.lowestfreeblock) {
516 blockindex=allocationinfo.lowestfreeblock;
519 /* This is our own block...means we should mark other blocks above us as free*/
520 if (cnum==blockrecord->corenum) {
521 unsigned INTPTR nextlocalblocknum=localblocknum+1;
522 for(;nextlocalblocknum<numblockspercore;nextlocalblocknum++) {
523 unsigned INTPTR blocknum=BLOCKINDEX2(cnum, nextlocalblocknum);
524 struct blockrecord * nextblockrecord=&allocationinfo.blocktable[blockindex];
525 nextblockrecord->status=BS_FREE;
526 nextblockrecord->usedspace=0;
527 //this is true because this cannot be the lowest block
528 nextblockrecord->freespace=BLOCKSIZE(1);
533 INLINE void processmsg_gcfinishcompact_I() {
534 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
536 int cnum = msgdata[msgdataindex];
538 unsigned int bytesneeded = msgdata[msgdataindex];
541 if(bytesneeded > 0) {
543 void * startaddr = gcfindSpareMem_I(bytesneeded, cnum);
545 // cache the msg first
546 if(BAMBOO_CHECK_SEND_MODE()) {
547 cache_msg_2_I(cnum,GCMOVESTART,startaddr);
549 send_msg_2_I(cnum,GCMOVESTART,startaddr);
553 //done with compacting
554 gccorestatus[cnum] = 0;
558 INLINE void processmsg_gcfinishupdate_I() {
559 int data1 = msgdata[msgdataindex];
561 // received a update phase finish msg
562 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
564 // all cores should do update
565 if(data1 < NUMCORESACTIVE) {
566 gccorestatus[data1] = 0;
570 INLINE void processmsg_gcfinish_I() {
571 // received a GC finish msg
572 gc_status_info.gcphase = FINISHPHASE;
573 gc_status_info.gcprocessing = false;
576 INLINE void processmsg_gcmarkconfirm_I() {
577 BAMBOO_ASSERT(((BAMBOO_NUM_OF_CORE!=STARTUPCORE)&&(BAMBOO_NUM_OF_CORE<=NUMCORESACTIVE-1)));
578 gc_status_info.gcbusystatus = gc_moreItems_I();
579 // send response msg, cahce the msg first
580 if(BAMBOO_CHECK_SEND_MODE()) {
581 cache_msg_5_I(STARTUPCORE,GCMARKREPORT,BAMBOO_NUM_OF_CORE,gc_status_info.gcbusystatus,gcself_numsendobjs,gcself_numreceiveobjs);
583 send_msg_5_I(STARTUPCORE,GCMARKREPORT,BAMBOO_NUM_OF_CORE,gc_status_info.gcbusystatus,gcself_numsendobjs,gcself_numreceiveobjs);
587 INLINE void processmsg_gcmarkreport_I() {
588 int data1 = msgdata[msgdataindex];
590 int data2 = msgdata[msgdataindex];
592 int data3 = msgdata[msgdataindex];
594 int data4 = msgdata[msgdataindex];
596 // received a marked phase finish confirm response msg
597 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
599 BAMBOO_ASSERT(waitconfirm);
603 entry_index = (gcnumsrobjs_index == 0) ? 1 : 0;
604 gccorestatus[data1] = data2;
605 gcnumsendobjs[entry_index][data1] = data3;
606 gcnumreceiveobjs[entry_index][data1] = data4;
610 INLINE void processmsg_gcmarkedobj_I() {
611 void * objptr = (void *) msgdata[msgdataindex];
614 // received a markedObj msg
615 if(!checkMark(objptr)) {
616 // this is the first time that this object is discovered,
617 // set the flag as DISCOVERED
619 gc_enqueue_I(objptr);
621 gcself_numreceiveobjs++;
622 gc_status_info.gcbusystatus = true;
625 INLINE void processmsg_gcmovestart_I() {
627 gcmovestartaddr = msgdata[msgdataindex];
631 INLINE void processmsg_gclobjinfo_I(unsigned int msglength) {
633 int cnum = msgdata[msgdataindex];
635 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORES4GC - 1);
637 // store the mark result info
638 gcloads[cnum] = msgdata[msgdataindex];
641 // large obj info here
642 for(int k = 3; k < msglength; k+=2) {
643 int lobj = msgdata[msgdataindex];
645 int length = msgdata[msgdataindex];
647 gc_lobjenqueue_I(lobj, length, cnum);
652 INLINE void processmsg_gcprofiles_I() {
653 int data1 = msgdata[msgdataindex];
655 int data2 = msgdata[msgdataindex];
657 int data3 = msgdata[msgdataindex];
660 if(gc_profile_flag) {
663 gc_num_liveobj += data2;
664 gc_num_forwardobj += data3;
672 #ifdef GC_CACHE_ADAPT
673 INLINE void processmsg_gcstartcachepolicy_I() {
674 gc_status_info.gcphase = CACHEPOLICYPHASE;
677 INLINE void processmsg_gcfinishcachepolicy_I() {
678 int data1 = msgdata[msgdataindex];
680 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
682 // all cores should do update
683 if(data1 < NUMCORESACTIVE) {
684 gccorestatus[data1] = 0;
688 INLINE void processmsg_gcstartpref_I() {
689 gc_status_info.gcphase = PREFINISHPHASE;
692 INLINE void processmsg_gcfinishpref_I() {
693 int data1 = msgdata[msgdataindex];
695 // received a update phase finish msg
696 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
698 // all cores should do update
699 if(data1 < NUMCORESACTIVE) {
700 gccorestatus[data1] = 0;
703 #endif // GC_CACHE_ADAPT
704 #endif // #ifdef MULTICORE_GC
706 // receive object transferred from other cores
707 // or the terminate message from other cores
708 // Should be invoked in critical sections!!
709 // NOTICE: following format is for threadsimulate version only
710 // RAW version please see previous description
711 // format: type + object
712 // type: -1--stall msg
714 // return value: 0--received an object
715 // 1--received nothing
716 // 2--received a Stall Msg
717 // 3--received a lock Msg
718 // RAW version: -1 -- received nothing
719 // otherwise -- received msg type
720 int receiveObject_I() {
721 PROFILE_INTERRUPT_START();
723 // get the incoming msgs
725 if((msgdataindex == msgdatalast) && (!msgdatafull)) {
728 if(BAMBOO_CHECK_SEND_MODE()) {
729 // during send, don't process the msg now
733 // processing received msgs
735 MSG_REMAINSIZE_I(size);
738 // have new coming msg
739 if((BAMBOO_MSG_AVAIL() != 0) && !msgdatafull) {
746 //we only ever read the first word
747 unsigned int realtype = msgdata[msgdataindex];
748 unsigned int msglength = checkMsgLength_I(realtype);
750 #if (defined(TASK)||defined(MULTICORE_GC))
751 unsigned int type = realtype & 0xff;
753 unsigned int type = realtype;
756 if(msglength <= size) {
757 // have some whole msg
763 // receive a object transfer msg
764 processmsg_transobj_I(msglength);
769 // receive a stall msg
770 processmsg_transtall_I();
775 // GC version have no lock msgs
778 // receive lock request msg, handle it right now
779 processmsg_lockrequest_I();
783 // receive lock grount msg
784 processmsg_lockgrount_I();
788 // receive lock deny msg
789 processmsg_lockdeny_I();
793 processmsg_lockrelease_I();
799 case PROFILEOUTPUT: {
800 // receive an output profile data request msg
801 processmsg_profileoutput_I();
804 case PROFILEFINISH: {
805 // receive a profile output finish msg
806 processmsg_profilefinish_I();
811 // GC version has no lock msgs
814 // receive a redirect lock request msg, handle it right now
815 processmsg_redirectlock_I();
819 case REDIRECTGROUNT: {
820 // receive a lock grant msg with redirect info
821 processmsg_redirectgrount_I();
826 // receive a lock deny msg with redirect info
827 processmsg_redirectdeny_I();
831 case REDIRECTRELEASE: {
832 // receive a lock release msg with redirect info
833 processmsg_redirectrelease_I();
835 } // case REDIRECTRELEASE
839 case STATUSCONFIRM: {
840 // receive a status confirm info
841 processmsg_statusconfirm_I();
846 processmsg_statusreport_I();
851 // receive a terminate msg
852 processmsg_terminate_I();
857 processmsg_memrequest_I();
862 processmsg_memresponse_I();
869 processmsg_gcstartpre_I();
874 processmsg_gcstartinit_I();
879 // receive a start GC msg
880 processmsg_gcstart_I();
884 case GCSTARTCOMPACT: {
885 // a compact phase start msg
886 processmsg_gcstartcompact_I();
890 case GCSTARTUPDATE: {
891 // received a update phase start msg
892 processmsg_gcstartupdate_I();
897 processmsg_gcfinishpre_I();
902 processmsg_gcfinishinit_I();
907 processmsg_gcfinishmark_I();
912 processmsg_returnmem_I();
916 case GCFINISHCOMPACT: {
917 // received a compact phase finish msg
918 processmsg_gcfinishcompact_I();
922 case GCFINISHUPDATE: {
923 processmsg_gcfinishupdate_I();
928 processmsg_gcfinish_I();
932 case GCMARKCONFIRM: {
933 // received a marked phase finish confirm request msg
934 // all cores should do mark
935 processmsg_gcmarkconfirm_I();
940 processmsg_gcmarkreport_I();
945 processmsg_gcmarkedobj_I();
950 // received a start moving objs msg
951 processmsg_gcmovestart_I();
955 case GCLOBJREQUEST: {
956 // received a large objs info request msg
957 transferMarkResults_I();
962 // received a large objs info response msg
963 processmsg_gclobjinfo_I(msglength);
969 // received a gcprofiles msg
970 processmsg_gcprofiles_I();
975 #ifdef GC_CACHE_ADAPT
976 case GCSTARTCACHEPOLICY: {
977 // received a gcstartcachepolicy msg
978 processmsg_gcstartcachepolicy_I();
982 case GCFINISHCACHEPOLICY: {
983 // received a gcfinishcachepolicy msg
984 processmsg_gcfinishcachepolicy_I();
989 // received a gcstartpref msg
990 processmsg_gcstartpref_I();
995 // received a gcfinishpref msg
996 processmsg_gcfinishpref_I();
1006 if((msgdataindex != msgdatalast) || (msgdatafull)) {
1007 // still have available msg
1011 // have new coming msg
1012 if(BAMBOO_MSG_AVAIL() != 0) {
1016 PROFILE_INTERRUPT_END();