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 4, //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
50 -1, //GCLOBJINFO, // 0xF2
52 4, //GCPROFILES, // 0xF3
55 1, //GCSTARTCACHEPOLICY // 0xF4
56 2, //GCFINISHCACHEPOLICY // 0xF5
57 1, //GCSTARTPREF, // 0xF6
58 2, //GCFINISHPREF, // 0xF7
59 #endif // GC_CACHE_ADAPT
60 #endif // MULTICORE_GC
64 INLINE unsigned int checkMsgLength_I(unsigned int realtype) {
65 #if (defined(TASK)||defined(MULTICORE_GC))
66 unsigned int type = realtype & 0xff;
68 unsigned int type = realtype;
70 BAMBOO_ASSERT(type<=MSGEND);
73 if(type==TRANSOBJ||type==GCLOBJINFO) {
78 if (type==GCLOBJINFO) {
80 #if (defined(TASK)||defined(MULTICORE_GC))
84 return msgsizearray[type];
88 INLINE void processmsg_transobj_I(int msglength) {
89 struct transObjInfo * transObj=RUNMALLOC_I(sizeof(struct transObjInfo));
90 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
92 // store the object and its corresponding queue info, enqueue it later
93 transObj->objptr = (void *)msgdata[msgdataindex];
95 transObj->length = (msglength - 2) / 2;
96 transObj->queues = RUNMALLOC_I(sizeof(int)*(msglength - 3));
97 for(int k = 0; k < transObj->length; k++) {
98 transObj->queues[2*k] = msgdata[msgdataindex];
100 transObj->queues[2*k+1] = msgdata[msgdataindex];
103 // check if there is an existing duplicate item
104 struct QueueItem * prev = NULL;
105 for(struct QueueItem * qitem = getHead(&objqueue);qitem != NULL;qitem=(prev==NULL)?getHead(&objqueue):getNextQueueItem(prev)) {
106 struct transObjInfo * tmpinfo = (struct transObjInfo *)(qitem->objectptr);
107 if(tmpinfo->objptr == transObj->objptr) {
108 // the same object, remove outdate one
109 RUNFREE_I(tmpinfo->queues);
111 removeItem(&objqueue, qitem);
117 addNewItem_I(&objqueue, (void *)transObj);
119 self_numreceiveobjs++;
121 if(gc_status_info.gcprocessing) {
122 if(STARTUPCORE == BAMBOO_NUM_OF_CORE) {
123 // set the gcprecheck to enable checking again
126 // send a update pregc information msg to the master core
127 if(BAMBOO_CHECK_SEND_MODE()) {
128 cache_msg_4_I(STARTUPCORE,GCFINISHPRE,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
130 send_msg_4_I(STARTUPCORE,GCFINISHPRE,BAMBOO_NUM_OF_CORE,self_numsendobjs, self_numreceiveobjs);
138 INLINE void processmsg_transtall_I() {
139 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
141 int num_core = msgdata[msgdataindex];
143 int data2 = msgdata[msgdataindex];
145 int data3 = msgdata[msgdataindex];
147 if(num_core < NUMCORESACTIVE) {
148 corestatus[num_core] = 0;
149 numsendobjs[num_core] = data2;
150 numreceiveobjs[num_core] = data3;
155 INLINE void processmsg_lockrequest_I() {
156 // check to see if there is a lock exist for the required obj
157 // msgdata[1] -> lock type
158 int locktype = msgdata[msgdataindex];
160 int data2 = msgdata[msgdataindex]; // obj pointer
162 int data3 = msgdata[msgdataindex]; // lock
164 int data4 = msgdata[msgdataindex]; // request core
166 // -1: redirected, 0: approved, 1: denied
167 int deny=processlockrequest(locktype, data3, data2, data4, data4, true);
170 // for 32 bit machine, the size is always 4 words, cache the msg first
171 int tmp = deny==1 ? LOCKDENY : LOCKGROUNT;
172 if(BAMBOO_CHECK_SEND_MODE()) {
173 cache_msg_4_I(data4,tmp,locktype,data2,data3);
175 send_msg_4_I(data4,tmp,locktype,data2,data3);
180 INLINE void processmsg_lockgrount_I() {
182 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
183 int data2 = msgdata[msgdataindex];
185 int data3 = msgdata[msgdataindex];
187 BAMBOO_ASSERT((lockobj == data2) && (lock2require == data3));
195 INLINE void processmsg_lockdeny_I() {
197 int data2 = msgdata[msgdataindex];
199 int data3 = msgdata[msgdataindex];
201 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
202 BAMBOO_ASSERT((lockobj == data2) && (lock2require == data3));
210 INLINE void processmsg_lockrelease_I() {
211 int data1 = msgdata[msgdataindex];
213 int data2 = msgdata[msgdataindex];
215 int data3 = msgdata[msgdataindex];
217 // receive lock release msg
218 processlockrelease(data1, data2, 0, false);
221 INLINE void processmsg_redirectlock_I() {
222 // check to see if there is a lock exist for the required obj
223 int data1 = msgdata[msgdataindex];
224 MSG_INDEXINC_I(); // lock type
225 int data2 = msgdata[msgdataindex];
226 MSG_INDEXINC_I(); // obj pointer
227 int data3 = msgdata[msgdataindex];
228 MSG_INDEXINC_I(); // redirect lock
229 int data4 = msgdata[msgdataindex];
230 MSG_INDEXINC_I(); // root request core
231 int data5 = msgdata[msgdataindex];
232 MSG_INDEXINC_I(); // request core
233 int deny = processlockrequest_I(data1, data3, data2, data5, data4, true);
236 // for 32 bit machine, the size is always 4 words, cache the msg first
237 if(BAMBOO_CHECK_SEND_MODE()) {
238 cache_msg_4_I(data4,deny==1?REDIRECTDENY:REDIRECTGROUNT,data1,data2,data3);
240 send_msg_4_I(data4,deny==1?REDIRECTDENY:REDIRECTGROUNT,data1,data2,data3);
245 INLINE void processmsg_redirectgrount_I() {
247 int data2 = msgdata[msgdataindex];
249 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
250 BAMBOO_ASSERT(lockobj == data2, 0xe207);
251 int data3 = msgdata[msgdataindex];
255 RuntimeHashadd_I(objRedirectLockTbl, lockobj, data3);
261 INLINE void processmsg_redirectdeny_I() {
263 int data2 = msgdata[msgdataindex];
265 int data3 = msgdata[msgdataindex];
267 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
268 BAMBOO_ASSERT(lockobj == data2);
276 INLINE void processmsg_redirectrelease_I() {
277 int data1 = msgdata[msgdataindex];
279 int data2 = msgdata[msgdataindex];
281 int data3 = msgdata[msgdataindex];
283 processlockrelease_I(data1, data2, data3, true);
285 #endif // #ifndef MULTICORE_GC
288 INLINE void processmsg_profileoutput_I() {
289 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE != STARTUPCORE);
291 totalexetime = msgdata[msgdataindex];
297 // cache the msg first
298 if(BAMBOO_CHECK_SEND_MODE()) {
299 cache_msg_1_I(STARTUPCORE,PROFILEFINISH);
301 send_msg_1_I(STARTUPCORE,PROFILEFINISH);
305 INLINE void processmsg_profilefinish_I() {
306 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
311 INLINE void processmsg_statusconfirm_I() {
312 BAMBOO_ASSERT(((BAMBOO_NUM_OF_CORE != STARTUPCORE) && (BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1)));
314 // cache the msg first
315 if(BAMBOO_CHECK_SEND_MODE()) {
316 cache_msg_5_I(STARTUPCORE,STATUSREPORT,busystatus?1:0,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
318 send_msg_5_I(STARTUPCORE,STATUSREPORT,busystatus?1:0,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
322 INLINE void processmsg_statusreport_I() {
323 int data1 = msgdata[msgdataindex];
325 int data2 = msgdata[msgdataindex];
327 int data3 = msgdata[msgdataindex];
329 int data4 = msgdata[msgdataindex];
331 // receive a status confirm info
332 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
336 corestatus[data2] = data1;
337 numsendobjs[data2] = data3;
338 numreceiveobjs[data2] = data4;
341 INLINE void processmsg_terminate_I() {
344 #ifdef GC_CACHE_ADAPT
345 bamboo_mask_timer_intr(); // disable the TILE_TIMER interrupt
351 INLINE void processmsg_memrequest_I() {
352 int data1 = msgdata[msgdataindex];
354 int data2 = msgdata[msgdataindex];
356 // receive a shared memory request msg
357 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
364 void * mem = smemalloc_I(data2, data1, &allocsize);
366 // send the start_va to request core, cache the msg first
367 if(BAMBOO_CHECK_SEND_MODE()) {
368 cache_msg_3_I(data2,MEMRESPONSE,mem,allocsize);
370 send_msg_3_I(data2,MEMRESPONSE,mem,allocsize);
372 } //else if mem == NULL, the gcflag of the startup core has been set
373 // and all the other cores have been informed to start gc
379 INLINE void processmsg_memresponse_I() {
380 void * memptr = msgdata[msgdataindex];
382 unsigned int numbytes = msgdata[msgdataindex];
384 // receive a shared memory response msg
386 // if is currently doing gc, dump this msg
387 if(!gc_status_info.gcprocessing) {
391 bamboo_smem_zero_top = NULL;
393 bamboo_smem_size = 0;
394 bamboo_cur_msp = NULL;
397 bamboo_smem_size = numbytes;
398 bamboo_cur_msp = memptr;
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
414 // Zero out the remaining memory here because for the GC_CACHE_ADAPT
415 // version, we need to make sure during the gcinit phase the shared heap
416 // is not touched. Otherwise, there would be problem when adapt the cache
418 bamboo_smem_size = 0;
419 bamboo_cur_msp = NULL;
423 INLINE void processmsg_gcstartinit_I() {
424 gc_status_info.gcphase = INITPHASE;
427 INLINE void processmsg_gcstart_I() {
429 gc_status_info.gcphase = MARKPHASE;
432 INLINE void processmsg_gcstartcompact_I() {
433 gcblock2fill = msgdata[msgdataindex];
435 BAMBOO_ASSERT(!gc_status_info.gcbusystatus);
436 gc_status_info.gcphase = COMPACTPHASE;
439 INLINE void processmsg_gcstartupdate_I() {
440 gc_status_info.gcphase = UPDATEPHASE;
443 INLINE void processmsg_gcfinishpre_I() {
444 int data1 = msgdata[msgdataindex];
446 int data2 = msgdata[msgdataindex];
448 int data3 = msgdata[msgdataindex];
450 // received a init phase finish msg
451 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
453 // All cores should do init GC
455 gccorestatus[data1] = 0;
456 gcnumsendobjs[0][data1] = data2;
457 gcnumreceiveobjs[0][data1] = data3;
460 INLINE void processmsg_gcfinishinit_I() {
461 int data1 = msgdata[msgdataindex];
463 // received a init phase finish msg
464 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
466 // All cores should do init GC
467 if(data1 < NUMCORESACTIVE) {
468 gccorestatus[data1] = 0;
472 INLINE void processmsg_reqblock_I() {
473 int cnum=msgdata[msgdataindex];
475 void * topptr=msgdata[msgdataindex];
477 if (topptr<=update_origblockptr) {
479 if(BAMBOO_CHECK_SEND_MODE()) {
480 cache_msg_1_I(cnum,GCGRANTBLOCK);
482 send_msg_1_I(cnum,GCGRANTBLOCK);
486 origblockarray[cnum]=topptr;
491 INLINE void processmsg_grantblock_I() {
496 INLINE void processmsg_gcfinishmark_I() {
497 int data1 = msgdata[msgdataindex];
499 int data2 = msgdata[msgdataindex];
501 int data3 = msgdata[msgdataindex];
503 // received a mark phase finish msg
504 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
505 BAMBOO_ASSERT(gc_status_info.gcphase = MARKPHASE);
507 // all cores should do mark
508 if(data1 < NUMCORESACTIVE) {
509 gccorestatus[data1] = 0;
513 entry_index = (gcnumsrobjs_index == 0) ? 1 : 0;
516 entry_index = gcnumsrobjs_index;
518 gcnumsendobjs[entry_index][data1] = data2;
519 gcnumreceiveobjs[entry_index][data1] = data3;
523 void processmsg_returnmem_I() {
524 unsigned int cnum = msgdata[msgdataindex];
526 void * heaptop = (void *) msgdata[msgdataindex];
529 handleReturnMem_I(cnum, heaptop);
532 void * handlegcfinishcompact_I(int cnum, unsigned int bytesneeded, unsigned int maxbytesneeded) {
533 if(bytesneeded > 0) {
535 return gcfindSpareMem_I(bytesneeded, maxbytesneeded, cnum);
537 //done with compacting
538 gccorestatus[cnum] = 0;
543 void processmsg_gcfinishcompact_I() {
544 int cnum = msgdata[msgdataindex];
546 unsigned int bytesneeded = msgdata[msgdataindex];
548 unsigned int maxbytesneeded = msgdata[msgdataindex];
551 void * startaddr=handlegcfinishcompact_I(cnum, bytesneeded, maxbytesneeded);
553 if(BAMBOO_CHECK_SEND_MODE()) {
554 cache_msg_2_I(cnum,GCMOVESTART,startaddr);
556 send_msg_2_I(cnum,GCMOVESTART,startaddr);
561 INLINE void processmsg_gcfinishupdate_I() {
562 int data1 = msgdata[msgdataindex];
564 // received a update phase finish msg
565 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
567 // all cores should do update
568 if(data1 < NUMCORESACTIVE) {
569 gccorestatus[data1] = 0;
573 INLINE void processmsg_gcfinish_I() {
574 // received a GC finish msg
575 gc_status_info.gcphase = FINISHPHASE;
576 gc_status_info.gcprocessing = false;
579 INLINE void processmsg_gcmarkconfirm_I() {
580 BAMBOO_ASSERT(((BAMBOO_NUM_OF_CORE!=STARTUPCORE)&&(BAMBOO_NUM_OF_CORE<=NUMCORESACTIVE-1)));
581 // send response msg, cahce the msg first
582 if(BAMBOO_CHECK_SEND_MODE()) {
583 cache_msg_5_I(STARTUPCORE,GCMARKREPORT,BAMBOO_NUM_OF_CORE,gc_status_info.gcbusystatus,gcself_numsendobjs,gcself_numreceiveobjs);
585 send_msg_5_I(STARTUPCORE,GCMARKREPORT,BAMBOO_NUM_OF_CORE,gc_status_info.gcbusystatus,gcself_numsendobjs,gcself_numreceiveobjs);
589 INLINE void processmsg_gcmarkreport_I() {
590 int data1 = msgdata[msgdataindex];
592 int data2 = msgdata[msgdataindex];
594 int data3 = msgdata[msgdataindex];
596 int data4 = msgdata[msgdataindex];
598 // received a marked phase finish confirm response msg
599 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
601 BAMBOO_ASSERT(waitconfirm);
605 entry_index = (gcnumsrobjs_index == 0) ? 1 : 0;
606 gccorestatus[data1] = data2;
607 gcnumsendobjs[entry_index][data1] = data3;
608 gcnumreceiveobjs[entry_index][data1] = data4;
612 INLINE void processmsg_gcmarkedobj_I() {
613 void * objptr = (void *) msgdata[msgdataindex];
616 // received a markedObj msg
617 if(!checkMark(objptr)) {
618 // this is the first time that this object is discovered,
619 // set the flag as DISCOVERED
622 gc_enqueue_I(objptr);
624 gcself_numreceiveobjs++;
625 gc_status_info.gcbusystatus = true;
628 INLINE void processmsg_gcmovestart_I() {
630 gcmovestartaddr = msgdata[msgdataindex];
634 INLINE void processmsg_gclobjinfo_I(unsigned int msglength) {
636 int cnum = msgdata[msgdataindex];
638 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORES4GC - 1);
640 // store the mark result info
641 gcloads[cnum] = msgdata[msgdataindex];
644 // large obj info here
645 for(int k = 3; k < msglength; k+=2) {
646 int lobj = msgdata[msgdataindex];
648 int length = msgdata[msgdataindex];
650 gc_lobjenqueue_I(lobj, length, cnum);
655 INLINE void processmsg_gcprofiles_I() {
656 int data1 = msgdata[msgdataindex];
658 int data2 = msgdata[msgdataindex];
660 int data3 = msgdata[msgdataindex];
663 if(gc_profile_flag) {
666 gc_num_liveobj += data2;
667 gc_num_forwardobj += data3;
675 #ifdef GC_CACHE_ADAPT
676 INLINE void processmsg_gcstartcachepolicy_I() {
677 gc_status_info.gcphase = CACHEPOLICYPHASE;
680 INLINE void processmsg_gcfinishcachepolicy_I() {
681 int data1 = msgdata[msgdataindex];
683 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
685 // all cores should do update
686 if(data1 < NUMCORESACTIVE) {
687 gccorestatus[data1] = 0;
691 INLINE void processmsg_gcstartpref_I() {
692 gc_status_info.gcphase = PREFINISHPHASE;
695 INLINE void processmsg_gcfinishpref_I() {
696 int data1 = msgdata[msgdataindex];
698 // received a update phase finish msg
699 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
701 // all cores should do update
702 if(data1 < NUMCORESACTIVE) {
703 gccorestatus[data1] = 0;
706 #endif // GC_CACHE_ADAPT
707 #endif // #ifdef MULTICORE_GC
709 // receive object transferred from other cores
710 // or the terminate message from other cores
711 // Should be invoked in critical sections!!
712 // NOTICE: following format is for threadsimulate version only
713 // RAW version please see previous description
714 // format: type + object
715 // type: -1--stall msg
717 // return value: 0--received an object
718 // 1--received nothing
719 // 2--received a Stall Msg
720 // 3--received a lock Msg
721 // RAW version: -1 -- received nothing
722 // otherwise -- received msg type
723 int receiveObject_I() {
724 PROFILE_INTERRUPT_START();
726 // get the incoming msgs
728 if((msgdataindex == msgdatalast) && (!msgdatafull)) {
731 if(BAMBOO_CHECK_SEND_MODE()) {
732 // during send, don't process the msg now
736 // processing received msgs
738 MSG_REMAINSIZE_I(size);
741 // have new coming msg
742 if((BAMBOO_MSG_AVAIL() != 0) && !msgdatafull) {
749 //we only ever read the first word
750 unsigned int realtype = msgdata[msgdataindex];
751 unsigned int msglength = checkMsgLength_I(realtype);
753 #if (defined(TASK)||defined(MULTICORE_GC))
754 unsigned int type = realtype & 0xff;
756 unsigned int type = realtype;
759 if(msglength <= size) {
760 // have some whole msg
767 // receive a object transfer msg
768 processmsg_transobj_I(msglength);
773 // receive a stall msg
774 processmsg_transtall_I();
779 // GC version have no lock msgs
782 // receive lock request msg, handle it right now
783 processmsg_lockrequest_I();
787 // receive lock grount msg
788 processmsg_lockgrount_I();
792 // receive lock deny msg
793 processmsg_lockdeny_I();
797 processmsg_lockrelease_I();
803 case PROFILEOUTPUT: {
804 // receive an output profile data request msg
805 processmsg_profileoutput_I();
808 case PROFILEFINISH: {
809 // receive a profile output finish msg
810 processmsg_profilefinish_I();
815 // GC version has no lock msgs
818 // receive a redirect lock request msg, handle it right now
819 processmsg_redirectlock_I();
823 case REDIRECTGROUNT: {
824 // receive a lock grant msg with redirect info
825 processmsg_redirectgrount_I();
830 // receive a lock deny msg with redirect info
831 processmsg_redirectdeny_I();
835 case REDIRECTRELEASE: {
836 // receive a lock release msg with redirect info
837 processmsg_redirectrelease_I();
839 } // case REDIRECTRELEASE
843 case STATUSCONFIRM: {
844 // receive a status confirm info
845 processmsg_statusconfirm_I();
850 processmsg_statusreport_I();
855 // receive a terminate msg
856 processmsg_terminate_I();
861 processmsg_memrequest_I();
866 processmsg_memresponse_I();
873 processmsg_gcstartpre_I();
878 processmsg_gcstartinit_I();
883 // receive a start GC msg
884 processmsg_gcstart_I();
888 case GCSTARTCOMPACT: {
889 // a compact phase start msg
890 processmsg_gcstartcompact_I();
894 case GCSTARTUPDATE: {
895 // received a update phase start msg
896 processmsg_gcstartupdate_I();
901 processmsg_gcfinishpre_I();
906 processmsg_gcfinishinit_I();
911 processmsg_gcfinishmark_I();
916 processmsg_returnmem_I();
920 case GCFINISHCOMPACT: {
921 // received a compact phase finish msg
922 processmsg_gcfinishcompact_I();
926 case GCFINISHUPDATE: {
927 processmsg_gcfinishupdate_I();
932 processmsg_gcfinish_I();
936 case GCMARKCONFIRM: {
937 // received a marked phase finish confirm request msg
938 // all cores should do mark
939 processmsg_gcmarkconfirm_I();
944 processmsg_gcmarkreport_I();
949 processmsg_gcmarkedobj_I();
954 // received a start moving objs msg
955 processmsg_gcmovestart_I();
959 case GCLOBJREQUEST: {
960 // received a large objs info request msg
961 transferMarkResults_I();
966 processmsg_reqblock_I();
971 processmsg_grantblock_I();
976 // received a large objs info response msg
977 processmsg_gclobjinfo_I(msglength);
983 // received a gcprofiles msg
984 processmsg_gcprofiles_I();
989 #ifdef GC_CACHE_ADAPT
990 case GCSTARTCACHEPOLICY: {
991 // received a gcstartcachepolicy msg
992 processmsg_gcstartcachepolicy_I();
996 case GCFINISHCACHEPOLICY: {
997 // received a gcfinishcachepolicy msg
998 processmsg_gcfinishcachepolicy_I();
1003 // received a gcstartpref msg
1004 processmsg_gcstartpref_I();
1008 case GCFINISHPREF: {
1009 // received a gcfinishpref msg
1010 processmsg_gcfinishpref_I();
1020 if((msgdataindex != msgdatalast) || (msgdatafull)) {
1021 // still have available msg
1025 // have new coming msg
1026 if(BAMBOO_MSG_AVAIL() != 0) {
1030 PROFILE_INTERRUPT_END();