2 #include "multicoremsg.h"
4 #include "multicoreruntime.h"
5 #include "multicoregarbage.h"
6 #include "multicoretaskprofile.h"
11 -1, //TRANSOBJ, // 0xD1
12 4, //TRANSTALL, // 0xD2
13 5, //LOCKREQUEST, // 0xD3
14 4, //LOCKGROUNT, // 0xD4
15 4, //LOCKDENY, // 0xD5
16 4, //LOCKRELEASE, // 0xD6
17 2, //PROFILEOUTPUT, // 0xD7
18 1, //PROFILEFINISH, // 0xD8
19 6, //REDIRECTLOCK, // 0xD9
20 4, //REDIRECTGROUNT, // 0xDa
21 4, //REDIRECTDENY, // 0xDb
22 4, //REDIRECTRELEASE, // 0xDc
23 1, //STATUSCONFIRM, // 0xDd
24 5, //STATUSREPORT, // 0xDe
25 1, //TERMINATE, // 0xDf
26 3, //MEMREQUEST, // 0xE0
27 3, //MEMRESPONSE, // 0xE1
29 1, //GCSTARTPRE, // 0xE2
30 1, //GCSTARTINIT, // 0xE3
32 2, //GCSTARTCOMPACT, // 0xE5
33 1, //GCSTARTFLUSH, // 0xE6
34 4, //GCFINISHPRE, // 0xE7
35 2, //GCFINISHINIT, // 0xE8
36 4, //GCFINISHMARK, // 0xE9
37 6, //GCFINISHCOMPACT, // 0xEa
38 2, //GCFINISHFLUSH, // 0xEb
39 1, //GCFINISH, // 0xEc
40 1, //GCMARKCONFIRM, // 0xEd
41 5, //GCMARKREPORT, // 0xEe
42 2, //GCMARKEDOBJ, // 0xEf
43 4, //GCMOVESTART, // 0xF0
44 1, //GCLOBJREQUEST, // 0xF1
45 -1, //GCLOBJINFO, // 0xF2
47 4, //GCPROFILES, // 0xF3
50 1, //GCSTARTCACHEPOLICY // 0xF4
51 2, //GCFINISHCACHEPOLICY // 0xF5
52 1, //GCSTARTPREF, // 0xF6
53 2, //GCFINISHPREF, // 0xF7
54 #endif // GC_CACHE_ADAPT
55 #endif // MULTICORE_GC
59 INLINE unsigned int checkMsgLength_I(unsigned int realtype) {
60 #if (defined(TASK)||defined(MULTICORE_GC))
61 unsigned int type = realtype & 0xff;
63 unsigned int type = realtype;
65 BAMBOO_ASSERT(type<=MSGEND);
68 if(type==TRANSOBJ||type==GCLOBJINFO) {
73 if (type==GCLOBJINFO) {
75 #if (defined(TASK)||defined(MULTICORE_GC))
79 return msgsizearray[type];
83 INLINE void processmsg_transobj_I(int msglength) {
84 struct transObjInfo * transObj=RUNMALLOC_I(sizeof(struct transObjInfo));
85 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
87 // store the object and its corresponding queue info, enqueue it later
88 transObj->objptr = (void *)msgdata[msgdataindex];
90 transObj->length = (msglength - 2) / 2;
91 transObj->queues = RUNMALLOC_I(sizeof(int)*(msglength - 3));
92 for(int k = 0; k < transObj->length; k++) {
93 transObj->queues[2*k] = msgdata[msgdataindex];
95 transObj->queues[2*k+1] = msgdata[msgdataindex];
98 // check if there is an existing duplicate item
99 struct QueueItem * prev = NULL;
100 for(struct QueueItem * qitem = getHead(&objqueue);qitem != NULL;qitem=(prev==NULL)?getHead(&objqueue):getNextQueueItem(prev)) {
101 struct transObjInfo * tmpinfo = (struct transObjInfo *)(qitem->objectptr);
102 if(tmpinfo->objptr == transObj->objptr) {
103 // the same object, remove outdate one
104 RUNFREE_I(tmpinfo->queues);
106 removeItem(&objqueue, qitem);
112 addNewItem_I(&objqueue, (void *)transObj);
114 self_numreceiveobjs++;
116 if(gc_status_info.gcprocessing) {
117 if(STARTUPCORE == BAMBOO_NUM_OF_CORE) {
118 // set the gcprecheck to enable checking again
121 // send a update pregc information msg to the master core
122 if(BAMBOO_CHECK_SEND_MODE()) {
123 cache_msg_4_I(STARTUPCORE,GCFINISHPRE,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
125 send_msg_4_I(STARTUPCORE,GCFINISHPRE,BAMBOO_NUM_OF_CORE,self_numsendobjs, self_numreceiveobjs);
133 INLINE void processmsg_transtall_I() {
134 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
136 int num_core = msgdata[msgdataindex];
138 int data2 = msgdata[msgdataindex];
140 int data3 = msgdata[msgdataindex];
142 if(num_core < NUMCORESACTIVE) {
143 corestatus[num_core] = 0;
144 numsendobjs[num_core] = data2;
145 numreceiveobjs[num_core] = data3;
150 INLINE void processmsg_lockrequest_I() {
151 // check to see if there is a lock exist for the required obj
152 // msgdata[1] -> lock type
153 int locktype = msgdata[msgdataindex];
155 int data2 = msgdata[msgdataindex]; // obj pointer
157 int data3 = msgdata[msgdataindex]; // lock
159 int data4 = msgdata[msgdataindex]; // request core
161 // -1: redirected, 0: approved, 1: denied
162 int deny=processlockrequest(locktype, data3, data2, data4, data4, true);
165 // for 32 bit machine, the size is always 4 words, cache the msg first
166 int tmp = deny==1 ? LOCKDENY : LOCKGROUNT;
167 if(BAMBOO_CHECK_SEND_MODE()) {
168 cache_msg_4_I(data4,tmp,locktype,data2,data3);
170 send_msg_4_I(data4,tmp,locktype,data2,data3);
175 INLINE void processmsg_lockgrount_I() {
177 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
178 int data2 = msgdata[msgdataindex];
180 int data3 = msgdata[msgdataindex];
182 BAMBOO_ASSERT((lockobj == data2) && (lock2require == data3));
190 INLINE void processmsg_lockdeny_I() {
192 int data2 = msgdata[msgdataindex];
194 int data3 = msgdata[msgdataindex];
196 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
197 BAMBOO_ASSERT((lockobj == data2) && (lock2require == data3));
205 INLINE void processmsg_lockrelease_I() {
206 int data1 = msgdata[msgdataindex];
208 int data2 = msgdata[msgdataindex];
210 int data3 = msgdata[msgdataindex];
212 // receive lock release msg
213 processlockrelease(data1, data2, 0, false);
216 INLINE void processmsg_redirectlock_I() {
217 // check to see if there is a lock exist for the required obj
218 int data1 = msgdata[msgdataindex];
219 MSG_INDEXINC_I(); // lock type
220 int data2 = msgdata[msgdataindex];
221 MSG_INDEXINC_I(); // obj pointer
222 int data3 = msgdata[msgdataindex];
223 MSG_INDEXINC_I(); // redirect lock
224 int data4 = msgdata[msgdataindex];
225 MSG_INDEXINC_I(); // root request core
226 int data5 = msgdata[msgdataindex];
227 MSG_INDEXINC_I(); // request core
228 int deny = processlockrequest_I(data1, data3, data2, data5, data4, true);
231 // for 32 bit machine, the size is always 4 words, cache the msg first
232 if(BAMBOO_CHECK_SEND_MODE()) {
233 cache_msg_4_I(data4,deny==1?REDIRECTDENY:REDIRECTGROUNT,data1,data2,data3);
235 send_msg_4_I(data4,deny==1?REDIRECTDENY:REDIRECTGROUNT,data1,data2,data3);
240 INLINE void processmsg_redirectgrount_I() {
242 int data2 = msgdata[msgdataindex];
244 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
245 BAMBOO_ASSERT(lockobj == data2, 0xe207);
246 int data3 = msgdata[msgdataindex];
250 RuntimeHashadd_I(objRedirectLockTbl, lockobj, data3);
256 INLINE void processmsg_redirectdeny_I() {
258 int data2 = msgdata[msgdataindex];
260 int data3 = msgdata[msgdataindex];
262 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
263 BAMBOO_ASSERT(lockobj == data2);
271 INLINE void processmsg_redirectrelease_I() {
272 int data1 = msgdata[msgdataindex];
274 int data2 = msgdata[msgdataindex];
276 int data3 = msgdata[msgdataindex];
278 processlockrelease_I(data1, data2, data3, true);
280 #endif // #ifndef MULTICORE_GC
283 INLINE void processmsg_profileoutput_I() {
284 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE != STARTUPCORE);
286 totalexetime = msgdata[msgdataindex];
292 // cache the msg first
293 if(BAMBOO_CHECK_SEND_MODE()) {
294 cache_msg_1_I(STARTUPCORE,PROFILEFINISH);
296 send_msg_1_I(STARTUPCORE,PROFILEFINISH);
300 INLINE void processmsg_profilefinish_I() {
301 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
306 INLINE void processmsg_statusconfirm_I() {
307 BAMBOO_ASSERT(((BAMBOO_NUM_OF_CORE != STARTUPCORE) && (BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1)));
309 // cache the msg first
310 if(BAMBOO_CHECK_SEND_MODE()) {
311 cache_msg_5_I(STARTUPCORE,STATUSREPORT,busystatus?1:0,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
313 send_msg_5_I(STARTUPCORE,STATUSREPORT,busystatus?1:0,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
317 INLINE void processmsg_statusreport_I() {
318 int data1 = msgdata[msgdataindex];
320 int data2 = msgdata[msgdataindex];
322 int data3 = msgdata[msgdataindex];
324 int data4 = msgdata[msgdataindex];
326 // receive a status confirm info
327 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
331 corestatus[data2] = data1;
332 numsendobjs[data2] = data3;
333 numreceiveobjs[data2] = data4;
336 INLINE void processmsg_terminate_I() {
339 #ifdef GC_CACHE_ADAPT
340 bamboo_mask_timer_intr(); // disable the TILE_TIMER interrupt
346 INLINE void processmsg_memrequest_I() {
347 int data1 = msgdata[msgdataindex];
349 int data2 = msgdata[msgdataindex];
351 // receive a shared memory request msg
352 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
356 if(!gc_status_info.gcprocessing || !gcflag) {
357 // either not doing GC or the master core has decided to stop GC but
358 // // still sending msgs to other cores to inform them to stop the GC
360 mem = smemalloc_I(data2, data1, &allocsize);
362 // send the start_va to request core, cache the msg first
363 if(BAMBOO_CHECK_SEND_MODE()) {
364 cache_msg_3_I(data2,MEMRESPONSE,mem,allocsize);
366 send_msg_3_I(data2,MEMRESPONSE,mem,allocsize);
368 } //else if mem == NULL, the gcflag of the startup core has been set
369 // and all the other cores have been informed to start gc
375 INLINE void processmsg_memresponse_I() {
376 int data1 = msgdata[msgdataindex];
378 int data2 = msgdata[msgdataindex];
380 // receive a shared memory response msg
382 // if is currently doing gc, dump this msg
383 if(!gc_status_info.gcprocessing) {
387 // Zero out the remaining memory here because for the GC_CACHE_ADAPT
388 // version, we need to make sure during the gcinit phase the shared heap
389 // is not touched. Otherwise, there would be problem when adapt the cache
391 BAMBOO_CLOSE_CUR_MSP();
392 bamboo_smem_zero_top = NULL;
394 bamboo_smem_size = 0;
398 CLOSEBLOCK(data1, data2);
399 bamboo_smem_size = data2 - BAMBOO_CACHE_LINE_SIZE;
400 bamboo_cur_msp = data1 + BAMBOO_CACHE_LINE_SIZE;
401 bamboo_smem_zero_top = bamboo_cur_msp;
403 bamboo_smem_size = data2;
404 bamboo_cur_msp =(void*)(data1);
414 INLINE void processmsg_gcstartpre_I() {
415 // the first time to be informed to start gc
418 // Zero out the remaining memory here because for the GC_CACHE_ADAPT
419 // version, we need to make sure during the gcinit phase the shared heap
420 // is not touched. Otherwise, there would be problem when adapt the cache
422 BAMBOO_CLOSE_CUR_MSP();
423 bamboo_smem_size = 0;
424 bamboo_cur_msp = NULL;
426 bamboo_smem_zero_top = NULL;
430 INLINE void processmsg_gcstartinit_I() {
431 gc_status_info.gcphase = INITPHASE;
434 INLINE void processmsg_gcstart_I() {
436 gc_status_info.gcphase = MARKPHASE;
439 INLINE void processmsg_gcstartcompact_I() {
440 gcblock2fill = msgdata[msgdataindex];
442 gc_status_info.gcphase = COMPACTPHASE;
445 INLINE void processmsg_gcstartflush_I() {
446 gc_status_info.gcphase = FLUSHPHASE;
449 INLINE void processmsg_gcfinishpre_I() {
450 int data1 = msgdata[msgdataindex];
452 int data2 = msgdata[msgdataindex];
454 int data3 = msgdata[msgdataindex];
456 // received a init phase finish msg
457 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
459 // All cores should do init GC
461 gccorestatus[data1] = 0;
462 gcnumsendobjs[0][data1] = data2;
463 gcnumreceiveobjs[0][data1] = data3;
466 INLINE void processmsg_gcfinishinit_I() {
467 int data1 = msgdata[msgdataindex];
469 // received a init phase finish msg
470 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
472 // All cores should do init GC
473 if(data1 < NUMCORESACTIVE) {
474 gccorestatus[data1] = 0;
478 INLINE void processmsg_gcfinishmark_I() {
479 int data1 = msgdata[msgdataindex];
481 int data2 = msgdata[msgdataindex];
483 int data3 = msgdata[msgdataindex];
485 // received a mark phase finish msg
486 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
488 // all cores should do mark
489 if(data1 < NUMCORESACTIVE) {
490 gccorestatus[data1] = 0;
494 entry_index = (gcnumsrobjs_index == 0) ? 1 : 0;
497 entry_index = gcnumsrobjs_index;
499 gcnumsendobjs[entry_index][data1] = data2;
500 gcnumreceiveobjs[entry_index][data1] = data3;
504 INLINE void processmsg_gcfinishcompact_I() {
505 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
507 int cnum = msgdata[msgdataindex];
509 bool loadbalancemove = msgdata[msgdataindex];
511 int filledblocks = msgdata[msgdataindex];
513 int heaptop = msgdata[msgdataindex];
515 int data4 = msgdata[msgdataindex];
517 // only gc cores need to do compact
518 if(cnum < NUMCORES4GC) {
519 if(!loadbalancemove && (COMPACTPHASE == gc_status_info.gcphase)) {
520 gcfilledblocks[cnum] = filledblocks;
521 gcloads[cnum] = heaptop;
528 if(gcfindSpareMem_I(&startaddr, &tomove, &dstcore, data4, cnum)) {
529 // cache the msg first
530 if(BAMBOO_CHECK_SEND_MODE()) {
531 cache_msg_4_I(cnum,GCMOVESTART,dstcore,startaddr,tomove);
533 send_msg_4_I(cnum,GCMOVESTART,dstcore,startaddr,tomove);
537 gccorestatus[cnum] = 0;
542 INLINE void processmsg_gcfinishflush_I() {
543 int data1 = msgdata[msgdataindex];
545 // received a flush phase finish msg
546 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
548 // all cores should do flush
549 if(data1 < NUMCORESACTIVE) {
550 gccorestatus[data1] = 0;
554 INLINE void processmsg_gcfinish_I() {
555 // received a GC finish msg
556 gc_status_info.gcphase = FINISHPHASE;
557 gc_status_info.gcprocessing = false;
560 INLINE void processmsg_gcmarkconfirm_I() {
561 BAMBOO_ASSERT(((BAMBOO_NUM_OF_CORE!=STARTUPCORE)&&(BAMBOO_NUM_OF_CORE<=NUMCORESACTIVE-1)));
562 gc_status_info.gcbusystatus = gc_moreItems2_I();
563 // send response msg, cahce the msg first
564 if(BAMBOO_CHECK_SEND_MODE()) {
565 cache_msg_5_I(STARTUPCORE,GCMARKREPORT,BAMBOO_NUM_OF_CORE,gc_status_info.gcbusystatus,gcself_numsendobjs,gcself_numreceiveobjs);
567 send_msg_5_I(STARTUPCORE,GCMARKREPORT,BAMBOO_NUM_OF_CORE,gc_status_info.gcbusystatus,gcself_numsendobjs,gcself_numreceiveobjs);
571 INLINE void processmsg_gcmarkreport_I() {
572 int data1 = msgdata[msgdataindex];
574 int data2 = msgdata[msgdataindex];
576 int data3 = msgdata[msgdataindex];
578 int data4 = msgdata[msgdataindex];
580 // received a marked phase finish confirm response msg
581 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
583 BAMBOO_ASSERT(waitconfirm);
587 entry_index = (gcnumsrobjs_index == 0) ? 1 : 0;
588 gccorestatus[data1] = data2;
589 gcnumsendobjs[entry_index][data1] = data3;
590 gcnumreceiveobjs[entry_index][data1] = data4;
594 INLINE void processmsg_gcmarkedobj_I() {
595 int data1 = msgdata[msgdataindex];
597 BAMBOO_ASSERT(ISSHAREDOBJ(data1));
599 // received a markedObj msg
600 if(((struct ___Object___ *)data1)->marked == INIT) {
601 // this is the first time that this object is discovered,
602 // set the flag as DISCOVERED
603 ((struct ___Object___ *)data1)->marked = DISCOVERED;
606 gcself_numreceiveobjs++;
607 gc_status_info.gcbusystatus = true;
610 INLINE void processmsg_gcmovestart_I() {
612 gcdstcore = msgdata[msgdataindex];
614 gcmovestartaddr = msgdata[msgdataindex];
616 gcblock2fill = msgdata[msgdataindex];
620 INLINE void processmsg_gclobjinfo_I(unsigned int data1) {
622 int data2 = msgdata[msgdataindex];
624 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORES4GC - 1);
626 // store the mark result info
628 gcloads[cnum] = msgdata[msgdataindex];
630 int data4 = msgdata[msgdataindex];
632 if(gcheaptop < data4) {
635 // large obj info here
636 for(int k = 4; k < data1; k+=2) {
637 int lobj = msgdata[msgdataindex];
639 int length = msgdata[msgdataindex];
641 gc_lobjenqueue_I(lobj, length, cnum);
647 INLINE void processmsg_gcprofiles_I() {
648 int data1 = msgdata[msgdataindex];
650 int data2 = msgdata[msgdataindex];
652 int data3 = msgdata[msgdataindex];
655 if(gc_profile_flag) {
658 gc_num_liveobj += data2;
659 gc_num_forwardobj += data3;
667 #ifdef GC_CACHE_ADAPT
668 INLINE void processmsg_gcstartcachepolicy_I() {
669 gc_status_info.gcphase = CACHEPOLICYPHASE;
672 INLINE void processmsg_gcfinishcachepolicy_I() {
673 int data1 = msgdata[msgdataindex];
675 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
677 // all cores should do flush
678 if(data1 < NUMCORESACTIVE) {
679 gccorestatus[data1] = 0;
683 INLINE void processmsg_gcstartpref_I() {
684 gc_status_info.gcphase = PREFINISHPHASE;
687 INLINE void processmsg_gcfinishpref_I() {
688 int data1 = msgdata[msgdataindex];
690 // received a flush phase finish msg
691 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
693 // all cores should do flush
694 if(data1 < NUMCORESACTIVE) {
695 gccorestatus[data1] = 0;
698 #endif // GC_CACHE_ADAPT
699 #endif // #ifdef MULTICORE_GC
701 // receive object transferred from other cores
702 // or the terminate message from other cores
703 // Should be invoked in critical sections!!
704 // NOTICE: following format is for threadsimulate version only
705 // RAW version please see previous description
706 // format: type + object
707 // type: -1--stall msg
709 // return value: 0--received an object
710 // 1--received nothing
711 // 2--received a Stall Msg
712 // 3--received a lock Msg
713 // RAW version: -1 -- received nothing
714 // otherwise -- received msg type
715 int receiveObject_I() {
716 PROFILE_INTERRUPT_START();
718 // get the incoming msgs
720 if((msgdataindex == msgdatalast) && (!msgdatafull)) {
723 if(BAMBOO_CHECK_SEND_MODE()) {
724 // during send, don't process the msg now
728 // processing received msgs
730 MSG_REMAINSIZE_I(&size);
733 // have new coming msg
734 if((BAMBOO_MSG_AVAIL() != 0) && !msgdatafull) {
741 //we only ever read the first word
742 unsigned int realtype = msgdata[msgdataindex];
743 unsigned int msglength = checkMsgLength_I(realtype);
745 #if (defined(TASK)||defined(MULTICORE_GC))
746 unsigned int type = realtype & 0xff;
748 unsigned int type = realtype;
751 if(msglength <= size) {
752 // have some whole msg
758 // receive a object transfer msg
759 processmsg_transobj_I(msglength);
764 // receive a stall msg
765 processmsg_transtall_I();
770 // GC version have no lock msgs
773 // receive lock request msg, handle it right now
774 processmsg_lockrequest_I();
778 // receive lock grount msg
779 processmsg_lockgrount_I();
783 // receive lock deny msg
784 processmsg_lockdeny_I();
788 processmsg_lockrelease_I();
794 case PROFILEOUTPUT: {
795 // receive an output profile data request msg
796 processmsg_profileoutput_I();
799 case PROFILEFINISH: {
800 // receive a profile output finish msg
801 processmsg_profilefinish_I();
806 // GC version has no lock msgs
809 // receive a redirect lock request msg, handle it right now
810 processmsg_redirectlock_I();
814 case REDIRECTGROUNT: {
815 // receive a lock grant msg with redirect info
816 processmsg_redirectgrount_I();
821 // receive a lock deny msg with redirect info
822 processmsg_redirectdeny_I();
826 case REDIRECTRELEASE: {
827 // receive a lock release msg with redirect info
828 processmsg_redirectrelease_I();
830 } // case REDIRECTRELEASE
834 case STATUSCONFIRM: {
835 // receive a status confirm info
836 processmsg_statusconfirm_I();
841 processmsg_statusreport_I();
846 // receive a terminate msg
847 processmsg_terminate_I();
852 processmsg_memrequest_I();
857 processmsg_memresponse_I();
864 processmsg_gcstartpre_I();
869 processmsg_gcstartinit_I();
874 // receive a start GC msg
875 processmsg_gcstart_I();
879 case GCSTARTCOMPACT: {
880 // a compact phase start msg
881 processmsg_gcstartcompact_I();
886 // received a flush phase start msg
887 processmsg_gcstartflush_I();
892 processmsg_gcfinishpre_I();
897 processmsg_gcfinishinit_I();
902 processmsg_gcfinishmark_I();
906 case GCFINISHCOMPACT: {
907 // received a compact phase finish msg
908 processmsg_gcfinishcompact_I();
912 case GCFINISHFLUSH: {
913 processmsg_gcfinishflush_I();
918 processmsg_gcfinish_I();
922 case GCMARKCONFIRM: {
923 // received a marked phase finish confirm request msg
924 // all cores should do mark
925 processmsg_gcmarkconfirm_I();
930 processmsg_gcmarkreport_I();
935 processmsg_gcmarkedobj_I();
940 // received a start moving objs msg
941 processmsg_gcmovestart_I();
945 case GCLOBJREQUEST: {
946 // received a large objs info request msg
947 transferMarkResults_I();
952 // received a large objs info response msg
953 processmsg_gclobjinfo_I(msglength);
959 // received a gcprofiles msg
960 processmsg_gcprofiles_I();
965 #ifdef GC_CACHE_ADAPT
966 case GCSTARTCACHEPOLICY: {
967 // received a gcstartcachepolicy msg
968 processmsg_gcstartcachepolicy_I();
972 case GCFINISHCACHEPOLICY: {
973 // received a gcfinishcachepolicy msg
974 processmsg_gcfinishcachepolicy_I();
979 // received a gcstartpref msg
980 processmsg_gcstartpref_I();
985 // received a gcfinishpref msg
986 processmsg_gcfinishpref_I();
996 if((msgdataindex != msgdatalast) || (msgdatafull)) {
997 // still have available msg
1001 // have new coming msg
1002 if(BAMBOO_MSG_AVAIL() != 0) {
1006 PROFILE_INTERRUPT_END();