2 #include "multicoremsg.h"
4 #include "multicoreruntime.h"
5 #include "multicoregarbage.h"
6 #include "multicoretaskprofile.h"
8 #include "runtime_arch.h"
10 int msgsizearray[] = {
12 -1, //TRANSOBJ, // 0xD1
13 4, //TRANSTALL, // 0xD2
14 5, //LOCKREQUEST, // 0xD3
15 4, //LOCKGROUNT, // 0xD4
16 4, //LOCKDENY, // 0xD5
17 4, //LOCKRELEASE, // 0xD6
18 2, //PROFILEOUTPUT, // 0xD7
19 1, //PROFILEFINISH, // 0xD8
20 6, //REDIRECTLOCK, // 0xD9
21 4, //REDIRECTGROUNT, // 0xDa
22 4, //REDIRECTDENY, // 0xDb
23 4, //REDIRECTRELEASE, // 0xDc
24 1, //STATUSCONFIRM, // 0xDd
25 5, //STATUSREPORT, // 0xDe
26 1, //TERMINATE, // 0xDf
27 3, //MEMREQUEST, // 0xE0
28 3, //MEMRESPONSE, // 0xE1
30 1, //GCSTARTPRE, // 0xE2
31 1, //GCSTARTINIT, // 0xE3
33 2, //GCSTARTCOMPACT, // 0xE5
34 1, //GCSTARTUPDATE, // 0xE6
35 4, //GCFINISHPRE, // 0xE7
36 2, //GCFINISHINIT, // 0xE8
37 4, //GCFINISHMARK, // 0xE9
38 4, //GCFINISHCOMPACT, // 0xEa
39 2, //GCFINISHUPDATE, // 0xEb
40 1, //GCFINISH, // 0xEc
41 1, //GCMARKCONFIRM, // 0xEd
42 5, //GCMARKREPORT, // 0xEe
43 2, //GCMARKEDOBJ, // 0xEf
44 2, //GCMOVESTART, // 0xF0
45 1, //GCLOBJREQUEST, // 0xF1
46 -1, //GCLOBJINFO, // 0xF2
48 4, //GCPROFILES, // 0xF3
51 1, //GCSTARTCACHEPOLICY // 0xF4
52 2, //GCFINISHCACHEPOLICY // 0xF5
53 1, //GCSTARTPREF, // 0xF6
54 2, //GCFINISHPREF, // 0xF7
55 #endif // GC_CACHE_ADAPT
56 #endif // MULTICORE_GC
60 INLINE unsigned int checkMsgLength_I(unsigned int realtype) {
61 #if (defined(TASK)||defined(MULTICORE_GC))
62 unsigned int type = realtype & 0xff;
64 unsigned int type = realtype;
66 BAMBOO_ASSERT(type<=MSGEND);
69 if(type==TRANSOBJ||type==GCLOBJINFO) {
74 if (type==GCLOBJINFO) {
76 #if (defined(TASK)||defined(MULTICORE_GC))
80 return msgsizearray[type];
84 INLINE void processmsg_transobj_I(int msglength) {
85 struct transObjInfo * transObj=RUNMALLOC_I(sizeof(struct transObjInfo));
86 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
88 // store the object and its corresponding queue info, enqueue it later
89 transObj->objptr = (void *)msgdata[msgdataindex];
91 transObj->length = (msglength - 2) / 2;
92 transObj->queues = RUNMALLOC_I(sizeof(int)*(msglength - 3));
93 for(int k = 0; k < transObj->length; k++) {
94 transObj->queues[2*k] = msgdata[msgdataindex];
96 transObj->queues[2*k+1] = msgdata[msgdataindex];
99 // check if there is an existing duplicate item
100 struct QueueItem * prev = NULL;
101 for(struct QueueItem * qitem = getHead(&objqueue);qitem != NULL;qitem=(prev==NULL)?getHead(&objqueue):getNextQueueItem(prev)) {
102 struct transObjInfo * tmpinfo = (struct transObjInfo *)(qitem->objectptr);
103 if(tmpinfo->objptr == transObj->objptr) {
104 // the same object, remove outdate one
105 RUNFREE_I(tmpinfo->queues);
107 removeItem(&objqueue, qitem);
113 addNewItem_I(&objqueue, (void *)transObj);
115 self_numreceiveobjs++;
117 if(gc_status_info.gcprocessing) {
118 if(STARTUPCORE == BAMBOO_NUM_OF_CORE) {
119 // set the gcprecheck to enable checking again
122 // send a update pregc information msg to the master core
123 if(BAMBOO_CHECK_SEND_MODE()) {
124 cache_msg_4_I(STARTUPCORE,GCFINISHPRE,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
126 send_msg_4_I(STARTUPCORE,GCFINISHPRE,BAMBOO_NUM_OF_CORE,self_numsendobjs, self_numreceiveobjs);
134 INLINE void processmsg_transtall_I() {
135 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
137 int num_core = msgdata[msgdataindex];
139 int data2 = msgdata[msgdataindex];
141 int data3 = msgdata[msgdataindex];
143 if(num_core < NUMCORESACTIVE) {
144 corestatus[num_core] = 0;
145 numsendobjs[num_core] = data2;
146 numreceiveobjs[num_core] = data3;
151 INLINE void processmsg_lockrequest_I() {
152 // check to see if there is a lock exist for the required obj
153 // msgdata[1] -> lock type
154 int locktype = msgdata[msgdataindex];
156 int data2 = msgdata[msgdataindex]; // obj pointer
158 int data3 = msgdata[msgdataindex]; // lock
160 int data4 = msgdata[msgdataindex]; // request core
162 // -1: redirected, 0: approved, 1: denied
163 int deny=processlockrequest(locktype, data3, data2, data4, data4, true);
166 // for 32 bit machine, the size is always 4 words, cache the msg first
167 int tmp = deny==1 ? LOCKDENY : LOCKGROUNT;
168 if(BAMBOO_CHECK_SEND_MODE()) {
169 cache_msg_4_I(data4,tmp,locktype,data2,data3);
171 send_msg_4_I(data4,tmp,locktype,data2,data3);
176 INLINE void processmsg_lockgrount_I() {
178 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
179 int data2 = msgdata[msgdataindex];
181 int data3 = msgdata[msgdataindex];
183 BAMBOO_ASSERT((lockobj == data2) && (lock2require == data3));
191 INLINE void processmsg_lockdeny_I() {
193 int data2 = msgdata[msgdataindex];
195 int data3 = msgdata[msgdataindex];
197 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
198 BAMBOO_ASSERT((lockobj == data2) && (lock2require == data3));
206 INLINE void processmsg_lockrelease_I() {
207 int data1 = msgdata[msgdataindex];
209 int data2 = msgdata[msgdataindex];
211 int data3 = msgdata[msgdataindex];
213 // receive lock release msg
214 processlockrelease(data1, data2, 0, false);
217 INLINE void processmsg_redirectlock_I() {
218 // check to see if there is a lock exist for the required obj
219 int data1 = msgdata[msgdataindex];
220 MSG_INDEXINC_I(); // lock type
221 int data2 = msgdata[msgdataindex];
222 MSG_INDEXINC_I(); // obj pointer
223 int data3 = msgdata[msgdataindex];
224 MSG_INDEXINC_I(); // redirect lock
225 int data4 = msgdata[msgdataindex];
226 MSG_INDEXINC_I(); // root request core
227 int data5 = msgdata[msgdataindex];
228 MSG_INDEXINC_I(); // request core
229 int deny = processlockrequest_I(data1, data3, data2, data5, data4, true);
232 // for 32 bit machine, the size is always 4 words, cache the msg first
233 if(BAMBOO_CHECK_SEND_MODE()) {
234 cache_msg_4_I(data4,deny==1?REDIRECTDENY:REDIRECTGROUNT,data1,data2,data3);
236 send_msg_4_I(data4,deny==1?REDIRECTDENY:REDIRECTGROUNT,data1,data2,data3);
241 INLINE void processmsg_redirectgrount_I() {
243 int data2 = msgdata[msgdataindex];
245 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
246 BAMBOO_ASSERT(lockobj == data2, 0xe207);
247 int data3 = msgdata[msgdataindex];
251 RuntimeHashadd_I(objRedirectLockTbl, lockobj, data3);
257 INLINE void processmsg_redirectdeny_I() {
259 int data2 = msgdata[msgdataindex];
261 int data3 = msgdata[msgdataindex];
263 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
264 BAMBOO_ASSERT(lockobj == data2);
272 INLINE void processmsg_redirectrelease_I() {
273 int data1 = msgdata[msgdataindex];
275 int data2 = msgdata[msgdataindex];
277 int data3 = msgdata[msgdataindex];
279 processlockrelease_I(data1, data2, data3, true);
281 #endif // #ifndef MULTICORE_GC
284 INLINE void processmsg_profileoutput_I() {
285 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE != STARTUPCORE);
287 totalexetime = msgdata[msgdataindex];
293 // cache the msg first
294 if(BAMBOO_CHECK_SEND_MODE()) {
295 cache_msg_1_I(STARTUPCORE,PROFILEFINISH);
297 send_msg_1_I(STARTUPCORE,PROFILEFINISH);
301 INLINE void processmsg_profilefinish_I() {
302 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
307 INLINE void processmsg_statusconfirm_I() {
308 BAMBOO_ASSERT(((BAMBOO_NUM_OF_CORE != STARTUPCORE) && (BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1)));
310 // cache the msg first
311 if(BAMBOO_CHECK_SEND_MODE()) {
312 cache_msg_5_I(STARTUPCORE,STATUSREPORT,busystatus?1:0,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
314 send_msg_5_I(STARTUPCORE,STATUSREPORT,busystatus?1:0,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
318 INLINE void processmsg_statusreport_I() {
319 int data1 = msgdata[msgdataindex];
321 int data2 = msgdata[msgdataindex];
323 int data3 = msgdata[msgdataindex];
325 int data4 = msgdata[msgdataindex];
327 // receive a status confirm info
328 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
332 corestatus[data2] = data1;
333 numsendobjs[data2] = data3;
334 numreceiveobjs[data2] = data4;
337 INLINE void processmsg_terminate_I() {
340 #ifdef GC_CACHE_ADAPT
341 bamboo_mask_timer_intr(); // disable the TILE_TIMER interrupt
347 INLINE void processmsg_memrequest_I() {
348 int data1 = msgdata[msgdataindex];
350 int data2 = msgdata[msgdataindex];
352 // receive a shared memory request msg
353 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
357 if(!gc_status_info.gcprocessing || !gcflag) {
358 // either not doing GC or the master core has decided to stop GC but
359 // // still sending msgs to other cores to inform them to stop the GC
361 mem = smemalloc_I(data2, data1, &allocsize);
363 // send the start_va to request core, cache the msg first
364 if(BAMBOO_CHECK_SEND_MODE()) {
365 cache_msg_3_I(data2,MEMRESPONSE,mem,allocsize);
367 send_msg_3_I(data2,MEMRESPONSE,mem,allocsize);
369 } //else if mem == NULL, the gcflag of the startup core has been set
370 // and all the other cores have been informed to start gc
376 INLINE void processmsg_memresponse_I() {
377 int data1 = msgdata[msgdataindex];
379 int data2 = msgdata[msgdataindex];
381 // receive a shared memory response msg
383 // if is currently doing gc, dump this msg
384 if(!gc_status_info.gcprocessing) {
388 // Zero out the remaining memory here because for the GC_CACHE_ADAPT
389 // version, we need to make sure during the gcinit phase the shared heap
390 // is not touched. Otherwise, there would be problem when adapt the cache
392 BAMBOO_CLOSE_CUR_MSP();
393 bamboo_smem_zero_top = NULL;
395 bamboo_smem_size = 0;
399 CLOSEBLOCK(data1, data2);
400 bamboo_smem_size = data2 - BAMBOO_CACHE_LINE_SIZE;
401 bamboo_cur_msp = data1 + BAMBOO_CACHE_LINE_SIZE;
402 bamboo_smem_zero_top = bamboo_cur_msp;
404 bamboo_smem_size = data2;
405 bamboo_cur_msp =(void*)(data1);
415 INLINE void processmsg_gcstartpre_I() {
416 // the first time to be informed to start gc
419 // Zero out the remaining memory here because for the GC_CACHE_ADAPT
420 // version, we need to make sure during the gcinit phase the shared heap
421 // is not touched. Otherwise, there would be problem when adapt the cache
423 BAMBOO_CLOSE_CUR_MSP();
424 bamboo_smem_size = 0;
425 bamboo_cur_msp = NULL;
427 bamboo_smem_zero_top = NULL;
431 INLINE void processmsg_gcstartinit_I() {
432 gc_status_info.gcphase = INITPHASE;
435 INLINE void processmsg_gcstart_I() {
437 gc_status_info.gcphase = MARKPHASE;
440 INLINE void processmsg_gcstartcompact_I() {
441 gcblock2fill = msgdata[msgdataindex];
443 gc_status_info.gcphase = COMPACTPHASE;
446 INLINE void processmsg_gcstartupdate_I() {
447 gc_status_info.gcphase = UPDATEPHASE;
450 INLINE void processmsg_gcfinishpre_I() {
451 int data1 = msgdata[msgdataindex];
453 int data2 = msgdata[msgdataindex];
455 int data3 = msgdata[msgdataindex];
457 // received a init phase finish msg
458 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
460 // All cores should do init GC
462 gccorestatus[data1] = 0;
463 gcnumsendobjs[0][data1] = data2;
464 gcnumreceiveobjs[0][data1] = data3;
467 INLINE void processmsg_gcfinishinit_I() {
468 int data1 = msgdata[msgdataindex];
470 // received a init phase finish msg
471 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
473 // All cores should do init GC
474 if(data1 < NUMCORESACTIVE) {
475 gccorestatus[data1] = 0;
479 INLINE void processmsg_gcfinishmark_I() {
480 int data1 = msgdata[msgdataindex];
482 int data2 = msgdata[msgdataindex];
484 int data3 = msgdata[msgdataindex];
486 // received a mark phase finish msg
487 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
489 // all cores should do mark
490 if(data1 < NUMCORESACTIVE) {
491 gccorestatus[data1] = 0;
495 entry_index = (gcnumsrobjs_index == 0) ? 1 : 0;
498 entry_index = gcnumsrobjs_index;
500 gcnumsendobjs[entry_index][data1] = data2;
501 gcnumreceiveobjs[entry_index][data1] = data3;
505 INLINE void processmsg_gcfinishcompact_I() {
506 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
508 int cnum = msgdata[msgdataindex];
510 void * heaptop = (void *) msgdata[msgdataindex];
512 unsigned int bytesneeded = msgdata[msgdataindex];
515 if(bytesneeded > 0) {
517 void * startaddr = gcfindSpareMem_I(bytesneeded, cnum);
519 // cache the msg first
520 if(BAMBOO_CHECK_SEND_MODE()) {
521 cache_msg_4_I(cnum,GCMOVESTART,startaddr);
523 send_msg_4_I(cnum,GCMOVESTART,startaddr);
527 //done with compacting
528 gccorestatus[cnum] = 0;
532 INLINE void processmsg_gcfinishupdate_I() {
533 int data1 = msgdata[msgdataindex];
535 // received a update phase finish msg
536 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
538 // all cores should do update
539 if(data1 < NUMCORESACTIVE) {
540 gccorestatus[data1] = 0;
544 INLINE void processmsg_gcfinish_I() {
545 // received a GC finish msg
546 gc_status_info.gcphase = FINISHPHASE;
547 gc_status_info.gcprocessing = false;
550 INLINE void processmsg_gcmarkconfirm_I() {
551 BAMBOO_ASSERT(((BAMBOO_NUM_OF_CORE!=STARTUPCORE)&&(BAMBOO_NUM_OF_CORE<=NUMCORESACTIVE-1)));
552 gc_status_info.gcbusystatus = gc_moreItems2_I();
553 // send response msg, cahce the msg first
554 if(BAMBOO_CHECK_SEND_MODE()) {
555 cache_msg_5_I(STARTUPCORE,GCMARKREPORT,BAMBOO_NUM_OF_CORE,gc_status_info.gcbusystatus,gcself_numsendobjs,gcself_numreceiveobjs);
557 send_msg_5_I(STARTUPCORE,GCMARKREPORT,BAMBOO_NUM_OF_CORE,gc_status_info.gcbusystatus,gcself_numsendobjs,gcself_numreceiveobjs);
561 INLINE void processmsg_gcmarkreport_I() {
562 int data1 = msgdata[msgdataindex];
564 int data2 = msgdata[msgdataindex];
566 int data3 = msgdata[msgdataindex];
568 int data4 = msgdata[msgdataindex];
570 // received a marked phase finish confirm response msg
571 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
573 BAMBOO_ASSERT(waitconfirm);
577 entry_index = (gcnumsrobjs_index == 0) ? 1 : 0;
578 gccorestatus[data1] = data2;
579 gcnumsendobjs[entry_index][data1] = data3;
580 gcnumreceiveobjs[entry_index][data1] = data4;
584 INLINE void processmsg_gcmarkedobj_I() {
585 void * data1 = (void *) msgdata[msgdataindex];
587 BAMBOO_ASSERT(ISSHAREDOBJ(data1));
589 // received a markedObj msg
590 if(!checkMark(objptr)) {
591 // this is the first time that this object is discovered,
592 // set the flag as DISCOVERED
596 gcself_numreceiveobjs++;
597 gc_status_info.gcbusystatus = true;
600 INLINE void processmsg_gcmovestart_I() {
602 gcmovestartaddr = msgdata[msgdataindex];
606 INLINE void processmsg_gclobjinfo_I(unsigned int data1) {
608 int data2 = msgdata[msgdataindex];
610 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORES4GC - 1);
612 // store the mark result info
614 gcloads[cnum] = msgdata[msgdataindex];
616 int data4 = msgdata[msgdataindex];
618 if(gcheaptop < data4) {
621 // large obj info here
622 for(int k = 4; k < data1; k+=2) {
623 int lobj = msgdata[msgdataindex];
625 int length = msgdata[msgdataindex];
627 gc_lobjenqueue_I(lobj, length, cnum);
633 INLINE void processmsg_gcprofiles_I() {
634 int data1 = msgdata[msgdataindex];
636 int data2 = msgdata[msgdataindex];
638 int data3 = msgdata[msgdataindex];
641 if(gc_profile_flag) {
644 gc_num_liveobj += data2;
645 gc_num_forwardobj += data3;
653 #ifdef GC_CACHE_ADAPT
654 INLINE void processmsg_gcstartcachepolicy_I() {
655 gc_status_info.gcphase = CACHEPOLICYPHASE;
658 INLINE void processmsg_gcfinishcachepolicy_I() {
659 int data1 = msgdata[msgdataindex];
661 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
663 // all cores should do update
664 if(data1 < NUMCORESACTIVE) {
665 gccorestatus[data1] = 0;
669 INLINE void processmsg_gcstartpref_I() {
670 gc_status_info.gcphase = PREFINISHPHASE;
673 INLINE void processmsg_gcfinishpref_I() {
674 int data1 = msgdata[msgdataindex];
676 // received a update phase finish msg
677 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
679 // all cores should do update
680 if(data1 < NUMCORESACTIVE) {
681 gccorestatus[data1] = 0;
684 #endif // GC_CACHE_ADAPT
685 #endif // #ifdef MULTICORE_GC
687 // receive object transferred from other cores
688 // or the terminate message from other cores
689 // Should be invoked in critical sections!!
690 // NOTICE: following format is for threadsimulate version only
691 // RAW version please see previous description
692 // format: type + object
693 // type: -1--stall msg
695 // return value: 0--received an object
696 // 1--received nothing
697 // 2--received a Stall Msg
698 // 3--received a lock Msg
699 // RAW version: -1 -- received nothing
700 // otherwise -- received msg type
701 int receiveObject_I() {
702 PROFILE_INTERRUPT_START();
704 // get the incoming msgs
706 if((msgdataindex == msgdatalast) && (!msgdatafull)) {
709 if(BAMBOO_CHECK_SEND_MODE()) {
710 // during send, don't process the msg now
714 // processing received msgs
716 MSG_REMAINSIZE_I(&size);
719 // have new coming msg
720 if((BAMBOO_MSG_AVAIL() != 0) && !msgdatafull) {
727 //we only ever read the first word
728 unsigned int realtype = msgdata[msgdataindex];
729 unsigned int msglength = checkMsgLength_I(realtype);
731 #if (defined(TASK)||defined(MULTICORE_GC))
732 unsigned int type = realtype & 0xff;
734 unsigned int type = realtype;
737 if(msglength <= size) {
738 // have some whole msg
744 // receive a object transfer msg
745 processmsg_transobj_I(msglength);
750 // receive a stall msg
751 processmsg_transtall_I();
756 // GC version have no lock msgs
759 // receive lock request msg, handle it right now
760 processmsg_lockrequest_I();
764 // receive lock grount msg
765 processmsg_lockgrount_I();
769 // receive lock deny msg
770 processmsg_lockdeny_I();
774 processmsg_lockrelease_I();
780 case PROFILEOUTPUT: {
781 // receive an output profile data request msg
782 processmsg_profileoutput_I();
785 case PROFILEFINISH: {
786 // receive a profile output finish msg
787 processmsg_profilefinish_I();
792 // GC version has no lock msgs
795 // receive a redirect lock request msg, handle it right now
796 processmsg_redirectlock_I();
800 case REDIRECTGROUNT: {
801 // receive a lock grant msg with redirect info
802 processmsg_redirectgrount_I();
807 // receive a lock deny msg with redirect info
808 processmsg_redirectdeny_I();
812 case REDIRECTRELEASE: {
813 // receive a lock release msg with redirect info
814 processmsg_redirectrelease_I();
816 } // case REDIRECTRELEASE
820 case STATUSCONFIRM: {
821 // receive a status confirm info
822 processmsg_statusconfirm_I();
827 processmsg_statusreport_I();
832 // receive a terminate msg
833 processmsg_terminate_I();
838 processmsg_memrequest_I();
843 processmsg_memresponse_I();
850 processmsg_gcstartpre_I();
855 processmsg_gcstartinit_I();
860 // receive a start GC msg
861 processmsg_gcstart_I();
865 case GCSTARTCOMPACT: {
866 // a compact phase start msg
867 processmsg_gcstartcompact_I();
871 case GCSTARTUPDATE: {
872 // received a update phase start msg
873 processmsg_gcstartupdate_I();
878 processmsg_gcfinishpre_I();
883 processmsg_gcfinishinit_I();
888 processmsg_gcfinishmark_I();
892 case GCFINISHCOMPACT: {
893 // received a compact phase finish msg
894 processmsg_gcfinishcompact_I();
898 case GCFINISHUPDATE: {
899 processmsg_gcfinishupdate_I();
904 processmsg_gcfinish_I();
908 case GCMARKCONFIRM: {
909 // received a marked phase finish confirm request msg
910 // all cores should do mark
911 processmsg_gcmarkconfirm_I();
916 processmsg_gcmarkreport_I();
921 processmsg_gcmarkedobj_I();
926 // received a start moving objs msg
927 processmsg_gcmovestart_I();
931 case GCLOBJREQUEST: {
932 // received a large objs info request msg
933 transferMarkResults_I();
938 // received a large objs info response msg
939 processmsg_gclobjinfo_I(msglength);
945 // received a gcprofiles msg
946 processmsg_gcprofiles_I();
951 #ifdef GC_CACHE_ADAPT
952 case GCSTARTCACHEPOLICY: {
953 // received a gcstartcachepolicy msg
954 processmsg_gcstartcachepolicy_I();
958 case GCFINISHCACHEPOLICY: {
959 // received a gcfinishcachepolicy msg
960 processmsg_gcfinishcachepolicy_I();
965 // received a gcstartpref msg
966 processmsg_gcstartpref_I();
971 // received a gcfinishpref msg
972 processmsg_gcfinishpref_I();
982 if((msgdataindex != msgdatalast) || (msgdatafull)) {
983 // still have available msg
987 // have new coming msg
988 if(BAMBOO_MSG_AVAIL() != 0) {
992 PROFILE_INTERRUPT_END();