2 #include "multicoremsg.h"
4 #include "multicoreruntime.h"
5 #include "multicoregarbage.h"
6 #include "multicoretaskprofile.h"
8 #include "runtime_arch.h"
11 int msgsizearray[] = {
15 -1, //TRANSOBJ, // 0xD1
16 4, //TRANSTALL, // 0xD2
17 5, //LOCKREQUEST, // 0xD3
18 4, //LOCKGROUNT, // 0xD4
19 4, //LOCKDENY, // 0xD5
20 4, //LOCKRELEASE, // 0xD6
21 2, //PROFILEOUTPUT, // 0xD7
22 1, //PROFILEFINISH, // 0xD8
23 6, //REDIRECTLOCK, // 0xD9
24 4, //REDIRECTGROUNT, // 0xDa
25 4, //REDIRECTDENY, // 0xDb
26 4, //REDIRECTRELEASE, // 0xDc
27 1, //STATUSCONFIRM, // 0xDd
28 5, //STATUSREPORT, // 0xDe
29 1, //TERMINATE, // 0xDf
30 3, //MEMREQUEST, // 0xE0
31 3, //MEMRESPONSE, // 0xE1
33 1, //GCSTARTPRE, // 0xE2
34 1, //GCSTARTINIT, // 0xE3
36 2, //GCSTARTCOMPACT, // 0xE5
37 1, //GCSTARTUPDATE, // 0xE6
38 4, //GCFINISHPRE, // 0xE7
39 2, //GCFINISHINIT, // 0xE8
40 4, //GCFINISHMARK, // 0xE9
41 4, //GCFINISHCOMPACT, // 0xEa
43 2, //GCFINISHUPDATE, // 0xEb
44 1, //GCFINISH, // 0xEc
45 1, //GCMARKCONFIRM, // 0xEd
46 5, //GCMARKREPORT, // 0xEe
47 2, //GCMARKEDOBJ, // 0xEf
48 2, //GCMOVESTART, // 0xF0
49 1, //GCLOBJREQUEST, // 0xF1
52 -1, //GCLOBJINFO, // 0xF2
54 4, //GCPROFILES, // 0xF3
57 1, //GCSTARTCACHEPOLICY // 0xF4
58 2, //GCFINISHCACHEPOLICY // 0xF5
59 1, //GCSTARTPREF, // 0xF6
60 2, //GCFINISHPREF, // 0xF7
61 #endif // GC_CACHE_ADAPT
62 #endif // MULTICORE_GC
66 INLINE unsigned int checkMsgLength_I(unsigned int realtype) {
67 #if (defined(TASK)||defined(MULTICORE_GC))
68 unsigned int type = realtype & 0xff;
70 unsigned int type = realtype;
72 BAMBOO_ASSERT(type<=MSGEND);
75 if(type==TRANSOBJ||type==GCLOBJINFO) {
80 if (type==GCLOBJINFO) {
82 #if (defined(TASK)||defined(MULTICORE_GC))
86 return msgsizearray[type];
90 void processmsg_transobj_I(int msglength) {
91 struct transObjInfo * transObj=RUNMALLOC_I(sizeof(struct transObjInfo));
92 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
94 // store the object and its corresponding queue info, enqueue it later
95 transObj->objptr = (void *)msgdata[msgdataindex];
97 transObj->length = (msglength - 2) / 2;
98 transObj->queues = RUNMALLOC_I(sizeof(int)*(msglength - 3));
99 for(int k = 0; k < transObj->length; k++) {
100 transObj->queues[2*k] = msgdata[msgdataindex];
102 transObj->queues[2*k+1] = msgdata[msgdataindex];
105 // check if there is an existing duplicate item
106 struct QueueItem * prev = NULL;
107 for(struct QueueItem * qitem = getHead(&objqueue);qitem != NULL;qitem=(prev==NULL)?getHead(&objqueue):getNextQueueItem(prev)) {
108 struct transObjInfo * tmpinfo = (struct transObjInfo *)(qitem->objectptr);
109 if(tmpinfo->objptr == transObj->objptr) {
110 // the same object, remove outdate one
111 RUNFREE_I(tmpinfo->queues);
113 removeItem(&objqueue, qitem);
119 addNewItem_I(&objqueue, (void *)transObj);
121 self_numreceiveobjs++;
123 if(gc_status_info.gcprocessing) {
124 if(STARTUPCORE == BAMBOO_NUM_OF_CORE) {
125 // set the gcprecheck to enable checking again
128 // send a update pregc information msg to the master core
129 if(BAMBOO_CHECK_SEND_MODE()) {
130 cache_msg_4_I(STARTUPCORE,GCFINISHPRE,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
132 send_msg_4_I(STARTUPCORE,GCFINISHPRE,BAMBOO_NUM_OF_CORE,self_numsendobjs, self_numreceiveobjs);
140 void processmsg_transtall_I() {
141 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
143 int num_core = msgdata[msgdataindex];
145 int data2 = msgdata[msgdataindex];
147 int data3 = msgdata[msgdataindex];
149 if(num_core < NUMCORESACTIVE) {
150 corestatus[num_core] = 0;
151 numsendobjs[num_core] = data2;
152 numreceiveobjs[num_core] = data3;
157 void processmsg_lockrequest_I() {
158 // check to see if there is a lock exist for the required obj
159 // msgdata[1] -> lock type
160 int locktype = msgdata[msgdataindex];
162 int data2 = msgdata[msgdataindex]; // obj pointer
164 int data3 = msgdata[msgdataindex]; // lock
166 int data4 = msgdata[msgdataindex]; // request core
168 // -1: redirected, 0: approved, 1: denied
169 int deny=processlockrequest(locktype, data3, data2, data4, data4, true);
172 // for 32 bit machine, the size is always 4 words, cache the msg first
173 int tmp = deny==1 ? LOCKDENY : LOCKGROUNT;
174 if(BAMBOO_CHECK_SEND_MODE()) {
175 cache_msg_4_I(data4,tmp,locktype,data2,data3);
177 send_msg_4_I(data4,tmp,locktype,data2,data3);
182 void processmsg_lockgrount_I() {
184 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
185 int data2 = msgdata[msgdataindex];
187 int data3 = msgdata[msgdataindex];
189 BAMBOO_ASSERT((lockobj == data2) && (lock2require == data3));
197 void processmsg_lockdeny_I() {
199 int data2 = msgdata[msgdataindex];
201 int data3 = msgdata[msgdataindex];
203 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
204 BAMBOO_ASSERT((lockobj == data2) && (lock2require == data3));
212 void processmsg_lockrelease_I() {
213 int data1 = msgdata[msgdataindex];
215 int data2 = msgdata[msgdataindex];
217 int data3 = msgdata[msgdataindex];
219 // receive lock release msg
220 processlockrelease(data1, data2, 0, false);
223 void processmsg_redirectlock_I() {
224 // check to see if there is a lock exist for the required obj
225 int data1 = msgdata[msgdataindex];
226 MSG_INDEXINC_I(); // lock type
227 int data2 = msgdata[msgdataindex];
228 MSG_INDEXINC_I(); // obj pointer
229 int data3 = msgdata[msgdataindex];
230 MSG_INDEXINC_I(); // redirect lock
231 int data4 = msgdata[msgdataindex];
232 MSG_INDEXINC_I(); // root request core
233 int data5 = msgdata[msgdataindex];
234 MSG_INDEXINC_I(); // request core
235 int deny = processlockrequest_I(data1, data3, data2, data5, data4, true);
238 // for 32 bit machine, the size is always 4 words, cache the msg first
239 if(BAMBOO_CHECK_SEND_MODE()) {
240 cache_msg_4_I(data4,deny==1?REDIRECTDENY:REDIRECTGROUNT,data1,data2,data3);
242 send_msg_4_I(data4,deny==1?REDIRECTDENY:REDIRECTGROUNT,data1,data2,data3);
247 void processmsg_redirectgrount_I() {
249 int data2 = msgdata[msgdataindex];
251 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
252 BAMBOO_ASSERT(lockobj == data2, 0xe207);
253 int data3 = msgdata[msgdataindex];
257 RuntimeHashadd_I(objRedirectLockTbl, lockobj, data3);
263 void processmsg_redirectdeny_I() {
265 int data2 = msgdata[msgdataindex];
267 int data3 = msgdata[msgdataindex];
269 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
270 BAMBOO_ASSERT(lockobj == data2);
278 void processmsg_redirectrelease_I() {
279 int data1 = msgdata[msgdataindex];
281 int data2 = msgdata[msgdataindex];
283 int data3 = msgdata[msgdataindex];
285 processlockrelease_I(data1, data2, data3, true);
287 #endif // #ifndef MULTICORE_GC
290 void processmsg_profileoutput_I() {
291 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE != STARTUPCORE);
293 totalexetime = msgdata[msgdataindex];
299 // cache the msg first
300 if(BAMBOO_CHECK_SEND_MODE()) {
301 cache_msg_1_I(STARTUPCORE,PROFILEFINISH);
303 send_msg_1_I(STARTUPCORE,PROFILEFINISH);
307 void processmsg_profilefinish_I() {
308 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
313 void processmsg_statusconfirm_I() {
314 BAMBOO_ASSERT(((BAMBOO_NUM_OF_CORE != STARTUPCORE) && (BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1)));
316 // cache the msg first
317 if(BAMBOO_CHECK_SEND_MODE()) {
318 cache_msg_5_I(STARTUPCORE,STATUSREPORT,busystatus?1:0,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
320 send_msg_5_I(STARTUPCORE,STATUSREPORT,busystatus?1:0,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
324 void processmsg_statusreport_I() {
325 int data1 = msgdata[msgdataindex];
327 int data2 = msgdata[msgdataindex];
329 int data3 = msgdata[msgdataindex];
331 int data4 = msgdata[msgdataindex];
333 // receive a status confirm info
334 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
338 corestatus[data2] = data1;
339 numsendobjs[data2] = data3;
340 numreceiveobjs[data2] = data4;
343 void processmsg_terminate_I() {
346 #ifdef GC_CACHE_ADAPT
347 bamboo_mask_timer_intr(); // disable the TILE_TIMER interrupt
353 void processmsg_memrequest_I() {
354 int data1 = msgdata[msgdataindex];
356 int data2 = msgdata[msgdataindex];
358 // receive a shared memory request msg
359 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
361 if(!gc_status_info.gcprocessing || !gcflag) {
362 // either not doing GC or the master core has decided to stop GC but
363 // // still sending msgs to other cores to inform them to stop the GC
366 void * mem = smemalloc_I(data2, data1, &allocsize);
368 // send the start_va to request core, cache the msg first
369 if(BAMBOO_CHECK_SEND_MODE()) {
370 cache_msg_3_I(data2,MEMRESPONSE,mem,allocsize);
372 send_msg_3_I(data2,MEMRESPONSE,mem,allocsize);
374 } //else if mem == NULL, the gcflag of the startup core has been set
375 // and all the other cores have been informed to start gc
381 void processmsg_memresponse_I() {
382 void * memptr = msgdata[msgdataindex];
384 unsigned int numbytes = msgdata[msgdataindex];
386 // receive a shared memory response msg
388 // if is currently doing gc, dump this msg
389 if(!gc_status_info.gcprocessing) {
393 bamboo_smem_zero_top = NULL;
395 bamboo_smem_size = 0;
396 bamboo_cur_msp = NULL;
399 bamboo_smem_size = numbytes;
400 bamboo_cur_msp = memptr;
402 bamboo_smem_size = numbytes;
403 bamboo_cur_msp =memptr;
413 void processmsg_gcstartpre_I() {
414 // the first time to be informed to start gc
418 void processmsg_gcstartinit_I() {
419 gc_status_info.gcphase = INITPHASE;
422 void processmsg_gcstart_I() {
424 gc_status_info.gcphase = MARKPHASE;
427 void processmsg_gcstartcompact_I() {
428 gcblock2fill = msgdata[msgdataindex];
430 BAMBOO_ASSERT(!gc_status_info.gcbusystatus);
431 gc_status_info.gcphase = COMPACTPHASE;
434 void processmsg_gcstartupdate_I() {
435 gc_status_info.gcphase = UPDATEPHASE;
438 void processmsg_gcfinishpre_I() {
439 int data1 = msgdata[msgdataindex];
441 int data2 = msgdata[msgdataindex];
443 int data3 = msgdata[msgdataindex];
445 // received a init phase finish msg
446 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
448 // All cores should do init GC
450 gccorestatus[data1] = 0;
451 gcnumsendobjs[0][data1] = data2;
452 gcnumreceiveobjs[0][data1] = data3;
455 void processmsg_gcfinishinit_I() {
456 int data1 = msgdata[msgdataindex];
458 // received a init phase finish msg
459 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
461 // All cores should do init GC
462 if(data1 < NUMCORESACTIVE) {
463 gccorestatus[data1] = 0;
467 void processmsg_reqblock_I() {
468 int cnum=msgdata[msgdataindex];
470 void * topptr=msgdata[msgdataindex];
472 if (topptr<=update_origblockptr) {
474 if(BAMBOO_CHECK_SEND_MODE()) {
475 cache_msg_1_I(cnum,GCGRANTBLOCK);
477 send_msg_1_I(cnum,GCGRANTBLOCK);
481 origblockarray[cnum]=topptr;
486 void processmsg_grantblock_I() {
491 void processmsg_gcfinishmark_I() {
492 int data1 = msgdata[msgdataindex];
494 int data2 = msgdata[msgdataindex];
496 int data3 = msgdata[msgdataindex];
498 // received a mark phase finish msg
499 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
500 BAMBOO_ASSERT(gc_status_info.gcphase = MARKPHASE);
502 // all cores should do mark
503 if(data1 < NUMCORESACTIVE) {
504 gccorestatus[data1] = 0;
508 entry_index = (gcnumsrobjs_index == 0) ? 1 : 0;
511 entry_index = gcnumsrobjs_index;
513 gcnumsendobjs[entry_index][data1] = data2;
514 gcnumreceiveobjs[entry_index][data1] = data3;
518 void processmsg_returnmem_I() {
519 unsigned int cnum = msgdata[msgdataindex];
521 void * heaptop = (void *) msgdata[msgdataindex];
524 handleReturnMem_I(cnum, heaptop);
527 void * handlegcfinishcompact_I(int cnum, unsigned int bytesneeded, unsigned int maxbytesneeded) {
528 if(bytesneeded > 0) {
530 return gcfindSpareMem_I(bytesneeded, maxbytesneeded, cnum);
532 //done with compacting
533 gccorestatus[cnum] = 0;
538 void processmsg_gcfinishcompact_I() {
539 int cnum = msgdata[msgdataindex];
541 unsigned int bytesneeded = msgdata[msgdataindex];
543 unsigned int maxbytesneeded = msgdata[msgdataindex];
546 void * startaddr=handlegcfinishcompact_I(cnum, bytesneeded, maxbytesneeded);
548 if(BAMBOO_CHECK_SEND_MODE()) {
549 cache_msg_2_I(cnum,GCMOVESTART,startaddr);
551 send_msg_2_I(cnum,GCMOVESTART,startaddr);
556 void processmsg_gcfinishupdate_I() {
557 int data1 = msgdata[msgdataindex];
559 // received a update phase finish msg
560 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
562 // all cores should do update
563 if(data1 < NUMCORESACTIVE) {
564 gccorestatus[data1] = 0;
568 void processmsg_gcfinish_I() {
569 // received a GC finish msg
570 gc_status_info.gcphase = FINISHPHASE;
571 gc_status_info.gcprocessing = false;
574 void processmsg_gcmarkconfirm_I() {
575 BAMBOO_ASSERT(((BAMBOO_NUM_OF_CORE!=STARTUPCORE)&&(BAMBOO_NUM_OF_CORE<=NUMCORESACTIVE-1)));
576 // send response msg, cahce the msg first
577 if(BAMBOO_CHECK_SEND_MODE()) {
578 cache_msg_5_I(STARTUPCORE,GCMARKREPORT,BAMBOO_NUM_OF_CORE,gc_status_info.gcbusystatus,gcself_numsendobjs,gcself_numreceiveobjs);
580 send_msg_5_I(STARTUPCORE,GCMARKREPORT,BAMBOO_NUM_OF_CORE,gc_status_info.gcbusystatus,gcself_numsendobjs,gcself_numreceiveobjs);
584 void processmsg_gcmarkreport_I() {
585 int data1 = msgdata[msgdataindex];
587 int data2 = msgdata[msgdataindex];
589 int data3 = msgdata[msgdataindex];
591 int data4 = msgdata[msgdataindex];
593 // received a marked phase finish confirm response msg
594 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
596 BAMBOO_ASSERT(waitconfirm);
600 entry_index = (gcnumsrobjs_index == 0) ? 1 : 0;
601 gccorestatus[data1] = data2;
602 gcnumsendobjs[entry_index][data1] = data3;
603 gcnumreceiveobjs[entry_index][data1] = data4;
607 void processmsg_gcmarkedobj_I() {
608 void * objptr = (void *) msgdata[msgdataindex];
611 // received a markedObj msg
612 if(!checkMark(objptr)) {
613 // this is the first time that this object is discovered,
614 // set the flag as DISCOVERED
617 gc_enqueue_I(objptr);
619 gcself_numreceiveobjs++;
620 gc_status_info.gcbusystatus = true;
623 void processmsg_gcmovestart_I() {
625 gcmovestartaddr = msgdata[msgdataindex];
629 void processmsg_gclobjinfo_I(unsigned int msglength) {
631 int cnum = msgdata[msgdataindex];
633 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORES4GC - 1);
635 // store the mark result info
636 gcloads[cnum] = msgdata[msgdataindex];
639 // large obj info here
640 for(int k = 3; k < msglength; k+=2) {
641 int lobj = msgdata[msgdataindex];
643 int length = msgdata[msgdataindex];
645 gc_lobjenqueue_I(lobj, length, cnum);
650 void processmsg_gcprofiles_I() {
651 int data1 = msgdata[msgdataindex];
653 int data2 = msgdata[msgdataindex];
655 int data3 = msgdata[msgdataindex];
658 if(gc_profile_flag) {
661 gc_num_liveobj += data2;
662 gc_num_forwardobj += data3;
670 #ifdef GC_CACHE_ADAPT
671 void processmsg_gcstartcachepolicy_I() {
672 gc_status_info.gcphase = CACHEPOLICYPHASE;
675 void processmsg_gcfinishcachepolicy_I() {
676 int data1 = msgdata[msgdataindex];
678 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
680 // all cores should do update
681 if(data1 < NUMCORESACTIVE) {
682 gccorestatus[data1] = 0;
686 void processmsg_gcstartpref_I() {
687 gc_status_info.gcphase = PREFINISHPHASE;
690 void processmsg_gcfinishpref_I() {
691 int data1 = msgdata[msgdataindex];
693 // received a update phase finish msg
694 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
696 // all cores should do update
697 if(data1 < NUMCORESACTIVE) {
698 gccorestatus[data1] = 0;
701 #endif // GC_CACHE_ADAPT
702 #endif // #ifdef MULTICORE_GC
704 void processmsg_req_notify_start() {
706 if(BAMBOO_CHECK_SEND_MODE()) {
707 cache_msg_1_I(STARTUPCORE,NOTIFYSTART);
709 send_msg_1_I(STARTUPCORE,NOTIFYSTART);
713 void processmsg_notify_start() {
717 // receive object transferred from other cores
718 // or the terminate message from other cores
719 // Should be invoked in critical sections!!
720 // NOTICE: following format is for threadsimulate version only
721 // RAW version please see previous description
722 // format: type + object
723 // type: -1--stall msg
725 // return value: 0--received an object
726 // 1--received nothing
727 // 2--received a Stall Msg
728 // 3--received a lock Msg
729 // RAW version: -1 -- received nothing
730 // otherwise -- received msg type
731 int receiveObject_I() {
732 PROFILE_INTERRUPT_START();
734 // get the incoming msgs
736 if((msgdataindex == msgdatalast) && (!msgdatafull)) {
739 if(BAMBOO_CHECK_SEND_MODE()) {
740 // during send, don't process the msg now
744 // processing received msgs
746 MSG_REMAINSIZE_I(size);
749 // have new coming msg
750 if((BAMBOO_MSG_AVAIL() != 0) && !msgdatafull) {
757 //we only ever read the first word
758 unsigned int realtype = msgdata[msgdataindex];
759 unsigned int msglength = checkMsgLength_I(realtype);
761 #if (defined(TASK)||defined(MULTICORE_GC))
762 unsigned int type = realtype & 0xff;
764 unsigned int type = realtype;
767 if(msglength <= size) {
768 // have some whole msg
773 case REQNOTIFYSTART: {
774 processmsg_req_notify_start();
779 processmsg_notify_start();
785 // receive a object transfer msg
786 processmsg_transobj_I(msglength);
791 // receive a stall msg
792 processmsg_transtall_I();
797 // GC version have no lock msgs
800 // receive lock request msg, handle it right now
801 processmsg_lockrequest_I();
805 // receive lock grount msg
806 processmsg_lockgrount_I();
810 // receive lock deny msg
811 processmsg_lockdeny_I();
815 processmsg_lockrelease_I();
821 case PROFILEOUTPUT: {
822 // receive an output profile data request msg
823 processmsg_profileoutput_I();
826 case PROFILEFINISH: {
827 // receive a profile output finish msg
828 processmsg_profilefinish_I();
833 // GC version has no lock msgs
836 // receive a redirect lock request msg, handle it right now
837 processmsg_redirectlock_I();
841 case REDIRECTGROUNT: {
842 // receive a lock grant msg with redirect info
843 processmsg_redirectgrount_I();
848 // receive a lock deny msg with redirect info
849 processmsg_redirectdeny_I();
853 case REDIRECTRELEASE: {
854 // receive a lock release msg with redirect info
855 processmsg_redirectrelease_I();
857 } // case REDIRECTRELEASE
861 case STATUSCONFIRM: {
862 // receive a status confirm info
863 processmsg_statusconfirm_I();
868 processmsg_statusreport_I();
873 // receive a terminate msg
874 processmsg_terminate_I();
879 processmsg_memrequest_I();
884 processmsg_memresponse_I();
891 processmsg_gcstartpre_I();
896 processmsg_gcstartinit_I();
901 // receive a start GC msg
902 processmsg_gcstart_I();
906 case GCSTARTCOMPACT: {
907 // a compact phase start msg
908 processmsg_gcstartcompact_I();
912 case GCSTARTUPDATE: {
913 // received a update phase start msg
914 processmsg_gcstartupdate_I();
919 processmsg_gcfinishpre_I();
924 processmsg_gcfinishinit_I();
929 processmsg_gcfinishmark_I();
934 processmsg_returnmem_I();
938 case GCFINISHCOMPACT: {
939 // received a compact phase finish msg
940 processmsg_gcfinishcompact_I();
944 case GCFINISHUPDATE: {
945 processmsg_gcfinishupdate_I();
950 processmsg_gcfinish_I();
954 case GCMARKCONFIRM: {
955 // received a marked phase finish confirm request msg
956 // all cores should do mark
957 processmsg_gcmarkconfirm_I();
962 processmsg_gcmarkreport_I();
967 processmsg_gcmarkedobj_I();
972 // received a start moving objs msg
973 processmsg_gcmovestart_I();
977 case GCLOBJREQUEST: {
978 // received a large objs info request msg
979 transferMarkResults_I();
984 processmsg_reqblock_I();
989 processmsg_grantblock_I();
994 // received a large objs info response msg
995 processmsg_gclobjinfo_I(msglength);
1001 // received a gcprofiles msg
1002 processmsg_gcprofiles_I();
1005 #endif // GC_PROFILE
1007 #ifdef GC_CACHE_ADAPT
1008 case GCSTARTCACHEPOLICY: {
1009 // received a gcstartcachepolicy msg
1010 processmsg_gcstartcachepolicy_I();
1014 case GCFINISHCACHEPOLICY: {
1015 // received a gcfinishcachepolicy msg
1016 processmsg_gcfinishcachepolicy_I();
1021 // received a gcstartpref msg
1022 processmsg_gcstartpref_I();
1026 case GCFINISHPREF: {
1027 // received a gcfinishpref msg
1028 processmsg_gcfinishpref_I();
1038 if((msgdataindex != msgdatalast) || (msgdatafull)) {
1039 // still have available msg
1043 // have new coming msg
1044 if(BAMBOO_MSG_AVAIL() != 0) {
1048 PROFILE_INTERRUPT_END();