2 #include "multicoremsg.h"
4 #include "multicoreruntime.h"
5 #include "multicoregarbage.h"
6 #include "multicoretaskprofile.h"
7 #include "runtime_arch.h"
13 int msgsizearray[] = {
17 -1, //TRANSOBJ, // 0xD1
18 4, //TRANSTALL, // 0xD2
19 5, //LOCKREQUEST, // 0xD3
20 4, //LOCKGROUNT, // 0xD4
21 4, //LOCKDENY, // 0xD5
22 4, //LOCKRELEASE, // 0xD6
23 2, //PROFILEOUTPUT, // 0xD7
24 1, //PROFILEFINISH, // 0xD8
25 6, //REDIRECTLOCK, // 0xD9
26 4, //REDIRECTGROUNT, // 0xDa
27 4, //REDIRECTDENY, // 0xDb
28 4, //REDIRECTRELEASE, // 0xDc
29 1, //STATUSCONFIRM, // 0xDd
30 5, //STATUSREPORT, // 0xDe
31 1, //TERMINATE, // 0xDf
32 3, //MEMREQUEST, // 0xE0
33 3, //MEMRESPONSE, // 0xE1
36 1, //GCSTARTPRE, // 0xE2
37 1, //GCSTARTINIT, // 0xE3
39 2, //GCSTARTCOMPACT, // 0xE5
40 1, //GCSTARTUPDATE, // 0xE6
41 4, //GCFINISHPRE, // 0xE7
42 2, //GCFINISHINIT, // 0xE8
43 4, //GCFINISHMARK, // 0xE9
44 4, //GCFINISHCOMPACT, // 0xEa
46 2, //GCFINISHUPDATE, // 0xEb
47 1, //GCFINISH, // 0xEc
48 1, //GCMARKCONFIRM, // 0xEd
49 5, //GCMARKREPORT, // 0xEe
50 2, //GCMARKEDOBJ, // 0xEf
51 2, //GCMOVESTART, // 0xF0
52 1, //GCLOBJREQUEST, // 0xF1
55 -1, //GCLOBJINFO, // 0xF2
57 4, //GCPROFILES, // 0xF3
60 1, //GCSTARTCACHEPOLICY // 0xF4
61 2, //GCFINISHCACHEPOLICY // 0xF5
62 1, //GCSTARTPREF, // 0xF6
63 2, //GCFINISHPREF, // 0xF7
64 #endif // GC_CACHE_ADAPT
65 #endif // MULTICORE_GC
69 unsigned int checkMsgLength_I(unsigned int realtype) {
70 #if (defined(TASK)||defined(MULTICORE_GC))
71 unsigned int type = realtype & 0xff;
73 unsigned int type = realtype;
75 BAMBOO_ASSERT(type<=MSGEND);
77 #if defined(MULTICORE_GC)
78 if(type==TRANSOBJ||type==GCLOBJINFO) {
82 #elif defined(MULTICORE_GC)
83 if (type==GCLOBJINFO) {
85 #if (defined(TASK)||defined(MULTICORE_GC))
89 return msgsizearray[type];
93 void processmsg_transobj_I(int msglength) {
94 struct transObjInfo * transObj=RUNMALLOC_I(sizeof(struct transObjInfo));
95 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
97 // store the object and its corresponding queue info, enqueue it later
98 transObj->objptr = (void *)msgdata[msgdataindex];
100 transObj->length = (msglength - 2) / 2;
101 transObj->queues = RUNMALLOC_I(sizeof(int)*(msglength - 3));
102 for(int k = 0; k < transObj->length; k++) {
103 transObj->queues[2*k] = msgdata[msgdataindex];
105 transObj->queues[2*k+1] = msgdata[msgdataindex];
108 // check if there is an existing duplicate item
109 struct QueueItem * prev = NULL;
110 for(struct QueueItem * qitem = getHead(&objqueue);qitem != NULL;qitem=(prev==NULL)?getHead(&objqueue):getNextQueueItem(prev)) {
111 struct transObjInfo * tmpinfo = (struct transObjInfo *)(qitem->objectptr);
112 if(tmpinfo->objptr == transObj->objptr) {
113 // the same object, remove outdate one
114 RUNFREE_I(tmpinfo->queues);
116 removeItem(&objqueue, qitem);
122 addNewItem_I(&objqueue, (void *)transObj);
124 self_numreceiveobjs++;
126 if(gc_status_info.gcprocessing) {
127 if(STARTUPCORE == BAMBOO_NUM_OF_CORE) {
128 // set the gcprecheck to enable checking again
131 // send a update pregc information msg to the master core
132 if(BAMBOO_CHECK_SEND_MODE()) {
133 cache_msg_4_I(STARTUPCORE,GCFINISHPRE,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
135 send_msg_4_I(STARTUPCORE,GCFINISHPRE,BAMBOO_NUM_OF_CORE,self_numsendobjs, self_numreceiveobjs);
143 void processmsg_transtall_I() {
144 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
146 int num_core = msgdata[msgdataindex];
148 int data2 = msgdata[msgdataindex];
150 int data3 = msgdata[msgdataindex];
152 if(num_core < NUMCORESACTIVE) {
153 corestatus[num_core] = 0;
154 numsendobjs[num_core] = data2;
155 numreceiveobjs[num_core] = data3;
159 #if !defined(MULTICORE_GC)&&!defined(PMC_GC)
160 void processmsg_lockrequest_I() {
161 // check to see if there is a lock exist for the required obj
162 // msgdata[1] -> lock type
163 int locktype = msgdata[msgdataindex];
165 int data2 = msgdata[msgdataindex]; // obj pointer
167 int data3 = msgdata[msgdataindex]; // lock
169 int data4 = msgdata[msgdataindex]; // request core
171 // -1: redirected, 0: approved, 1: denied
172 int deny=processlockrequest(locktype, data3, data2, data4, data4, true);
175 // for 32 bit machine, the size is always 4 words, cache the msg first
176 int tmp = deny==1 ? LOCKDENY : LOCKGROUNT;
177 if(BAMBOO_CHECK_SEND_MODE()) {
178 cache_msg_4_I(data4,tmp,locktype,data2,data3);
180 send_msg_4_I(data4,tmp,locktype,data2,data3);
185 void processmsg_lockgrount_I() {
187 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
188 int data2 = msgdata[msgdataindex];
190 int data3 = msgdata[msgdataindex];
192 BAMBOO_ASSERT((lockobj == data2) && (lock2require == data3));
200 void processmsg_lockdeny_I() {
202 int data2 = msgdata[msgdataindex];
204 int data3 = msgdata[msgdataindex];
206 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
207 BAMBOO_ASSERT((lockobj == data2) && (lock2require == data3));
215 void processmsg_lockrelease_I() {
216 int data1 = msgdata[msgdataindex];
218 int data2 = msgdata[msgdataindex];
220 int data3 = msgdata[msgdataindex];
222 // receive lock release msg
223 processlockrelease(data1, data2, 0, false);
226 void processmsg_redirectlock_I() {
227 // check to see if there is a lock exist for the required obj
228 int data1 = msgdata[msgdataindex];
229 MSG_INDEXINC_I(); // lock type
230 int data2 = msgdata[msgdataindex];
231 MSG_INDEXINC_I(); // obj pointer
232 int data3 = msgdata[msgdataindex];
233 MSG_INDEXINC_I(); // redirect lock
234 int data4 = msgdata[msgdataindex];
235 MSG_INDEXINC_I(); // root request core
236 int data5 = msgdata[msgdataindex];
237 MSG_INDEXINC_I(); // request core
238 int deny = processlockrequest_I(data1, data3, data2, data5, data4, true);
241 // for 32 bit machine, the size is always 4 words, cache the msg first
242 if(BAMBOO_CHECK_SEND_MODE()) {
243 cache_msg_4_I(data4,deny==1?REDIRECTDENY:REDIRECTGROUNT,data1,data2,data3);
245 send_msg_4_I(data4,deny==1?REDIRECTDENY:REDIRECTGROUNT,data1,data2,data3);
250 void processmsg_redirectgrount_I() {
252 int data2 = msgdata[msgdataindex];
254 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
255 BAMBOO_ASSERT(lockobj == data2, 0xe207);
256 int data3 = msgdata[msgdataindex];
260 RuntimeHashadd_I(objRedirectLockTbl, lockobj, data3);
266 void processmsg_redirectdeny_I() {
268 int data2 = msgdata[msgdataindex];
270 int data3 = msgdata[msgdataindex];
272 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
273 BAMBOO_ASSERT(lockobj == data2);
281 void processmsg_redirectrelease_I() {
282 int data1 = msgdata[msgdataindex];
284 int data2 = msgdata[msgdataindex];
286 int data3 = msgdata[msgdataindex];
288 processlockrelease_I(data1, data2, data3, true);
290 #endif // #ifndef MULTICORE_GC
293 void processmsg_profileoutput_I() {
294 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE != STARTUPCORE);
296 totalexetime = msgdata[msgdataindex];
302 // cache the msg first
303 if(BAMBOO_CHECK_SEND_MODE()) {
304 cache_msg_1_I(STARTUPCORE,PROFILEFINISH);
306 send_msg_1_I(STARTUPCORE,PROFILEFINISH);
310 void processmsg_profilefinish_I() {
311 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
316 void processmsg_statusconfirm_I() {
317 BAMBOO_ASSERT(((BAMBOO_NUM_OF_CORE != STARTUPCORE) && (BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1)));
319 // cache the msg first
320 if(BAMBOO_CHECK_SEND_MODE()) {
321 cache_msg_5_I(STARTUPCORE,STATUSREPORT,busystatus?1:0,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
323 send_msg_5_I(STARTUPCORE,STATUSREPORT,busystatus?1:0,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
327 void processmsg_statusreport_I() {
328 int data1 = msgdata[msgdataindex];
330 int data2 = msgdata[msgdataindex];
332 int data3 = msgdata[msgdataindex];
334 int data4 = msgdata[msgdataindex];
336 // receive a status confirm info
337 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
341 corestatus[data2] = data1;
342 numsendobjs[data2] = data3;
343 numreceiveobjs[data2] = data4;
346 void processmsg_terminate_I() {
349 #ifdef GC_CACHE_ADAPT
350 bamboo_mask_timer_intr(); // disable the TILE_TIMER interrupt
357 void processmsg_memrequest_I() {
358 int data1 = msgdata[msgdataindex];
360 int data2 = msgdata[msgdataindex];
362 // receive a shared memory request msg
363 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
365 if(!gc_status_info.gcprocessing || !gcflag) {
366 // either not doing GC or the master core has decided to stop GC but
367 // // still sending msgs to other cores to inform them to stop the GC
369 unsigned INTPTR allocsize = 0;
370 void * mem = smemalloc_I(data2, data1, &allocsize);
372 // send the start_va to request core, cache the msg first
373 if(BAMBOO_CHECK_SEND_MODE()) {
374 cache_msg_3_I(data2,MEMRESPONSE,(unsigned INTPTR) mem,allocsize);
376 send_msg_3_I(data2,MEMRESPONSE,(unsigned INTPTR) mem,allocsize);
378 } //else if mem == NULL, the gcflag of the startup core has been set
379 // and all the other cores have been informed to start gc
385 void processmsg_memresponse_I() {
386 void * memptr =(void *) msgdata[msgdataindex];
388 unsigned int numbytes = msgdata[msgdataindex];
390 // receive a shared memory response msg
392 // if is currently doing gc, dump this msg
393 if(!gc_status_info.gcprocessing) {
397 bamboo_smem_zero_top = NULL;
399 bamboo_smem_size = 0;
400 bamboo_cur_msp = NULL;
403 bamboo_smem_size = numbytes;
404 bamboo_cur_msp = memptr;
406 bamboo_smem_size = numbytes;
407 bamboo_cur_msp =memptr;
415 #endif //ifndef PMCGC
419 void processmsg_gcinvoke_I() {
420 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE==STARTUPCORE);
421 if(!gc_status_info.gcprocessing && !gcflag) {
424 for(int i = 0; i < NUMCORESACTIVE; i++) {
425 // reuse the gcnumsendobjs & gcnumreceiveobjs
426 gcnumsendobjs[0][i] = 0;
427 gcnumreceiveobjs[0][i] = 0;
429 for(int i = 0; i < NUMCORES4GC; i++) {
430 if(i != STARTUPCORE) {
431 if(BAMBOO_CHECK_SEND_MODE()) {
432 cache_msg_1_I(i,GCSTARTPRE);
434 send_msg_1_I(i,GCSTARTPRE);
441 void processmsg_gcstartpre_I() {
442 // the first time to be informed to start gc
446 void processmsg_gcstartinit_I() {
447 gc_status_info.gcphase = INITPHASE;
450 void processmsg_gcstart_I() {
452 gc_status_info.gcphase = MARKPHASE;
455 void processmsg_gcstartcompact_I() {
456 gcblock2fill = msgdata[msgdataindex];
458 BAMBOO_ASSERT(!gc_status_info.gcbusystatus);
459 gc_status_info.gcphase = COMPACTPHASE;
462 void processmsg_gcstartupdate_I() {
463 gc_status_info.gcphase = UPDATEPHASE;
466 void processmsg_gcfinishpre_I() {
467 int data1 = msgdata[msgdataindex];
469 int data2 = msgdata[msgdataindex];
471 int data3 = msgdata[msgdataindex];
473 // received a init phase finish msg
474 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
476 // All cores should do init GC
478 gccorestatus[data1] = 0;
479 gcnumsendobjs[0][data1] = data2;
480 gcnumreceiveobjs[0][data1] = data3;
483 void processmsg_gcfinishinit_I() {
484 int data1 = msgdata[msgdataindex];
486 // received a init phase finish msg
487 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
489 // All cores should do init GC
490 if(data1 < NUMCORESACTIVE) {
491 gccorestatus[data1] = 0;
495 void processmsg_reqblock_I() {
496 int cnum=msgdata[msgdataindex];
498 void * topptr= (void *)msgdata[msgdataindex];
500 if (topptr<=update_origblockptr) {
502 if(BAMBOO_CHECK_SEND_MODE()) {
503 cache_msg_1_I(cnum,GCGRANTBLOCK);
505 send_msg_1_I(cnum,GCGRANTBLOCK);
509 origblockarray[cnum]=topptr;
514 void processmsg_grantblock_I() {
519 void processmsg_gcfinishmark_I() {
520 int cnum = msgdata[msgdataindex];
522 int nsend = msgdata[msgdataindex];
524 int nrecv = msgdata[msgdataindex];
526 // received a mark phase finish msg
527 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
528 BAMBOO_ASSERT(gc_status_info.gcphase == MARKPHASE);
530 // all cores should do mark
531 if(cnum < NUMCORESACTIVE) {
532 gccorestatus[cnum] = 0;
536 entry_index = (gcnumsrobjs_index == 0) ? 1 : 0;
539 entry_index = gcnumsrobjs_index;
541 gcnumsendobjs[entry_index][cnum] = nsend;
542 gcnumreceiveobjs[entry_index][cnum] = nrecv;
546 void processmsg_returnmem_I() {
547 unsigned int cnum = msgdata[msgdataindex];
549 void * heaptop = (void *) msgdata[msgdataindex];
552 handleReturnMem_I(cnum, heaptop);
555 void * handlegcfinishcompact_I(int cnum, unsigned int bytesneeded, unsigned int maxbytesneeded) {
556 if(bytesneeded > 0) {
558 return gcfindSpareMem_I(bytesneeded, maxbytesneeded, cnum);
560 //done with compacting
561 gccorestatus[cnum] = 0;
566 void processmsg_gcfinishcompact_I() {
567 int cnum = msgdata[msgdataindex];
569 unsigned int bytesneeded = msgdata[msgdataindex];
571 unsigned int maxbytesneeded = msgdata[msgdataindex];
574 void * startaddr=handlegcfinishcompact_I(cnum, bytesneeded, maxbytesneeded);
576 if(BAMBOO_CHECK_SEND_MODE()) {
577 cache_msg_2_I(cnum,GCMOVESTART,(unsigned INTPTR)startaddr);
579 send_msg_2_I(cnum,GCMOVESTART,(unsigned INTPTR)startaddr);
584 void processmsg_gcfinishupdate_I() {
585 int data1 = msgdata[msgdataindex];
587 // received a update phase finish msg
588 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
590 // all cores should do update
591 if(data1 < NUMCORESACTIVE) {
592 gccorestatus[data1] = 0;
596 void processmsg_gcfinish_I() {
597 // received a GC finish msg
598 gc_status_info.gcphase = FINISHPHASE;
599 gc_status_info.gcprocessing = false;
602 void processmsg_gcmarkconfirm_I() {
603 BAMBOO_ASSERT(((BAMBOO_NUM_OF_CORE!=STARTUPCORE)&&(BAMBOO_NUM_OF_CORE<=NUMCORESACTIVE-1)));
604 // send response msg, cahce the msg first
605 if(BAMBOO_CHECK_SEND_MODE()) {
606 cache_msg_5_I(STARTUPCORE,GCMARKREPORT,BAMBOO_NUM_OF_CORE,gc_status_info.gcbusystatus,gcself_numsendobjs,gcself_numreceiveobjs);
608 send_msg_5_I(STARTUPCORE,GCMARKREPORT,BAMBOO_NUM_OF_CORE,gc_status_info.gcbusystatus,gcself_numsendobjs,gcself_numreceiveobjs);
612 void processmsg_gcmarkreport_I() {
613 int data1 = msgdata[msgdataindex];
615 int data2 = msgdata[msgdataindex];
617 int data3 = msgdata[msgdataindex];
619 int data4 = msgdata[msgdataindex];
621 // received a marked phase finish confirm response msg
622 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
624 BAMBOO_ASSERT(waitconfirm);
628 entry_index = (gcnumsrobjs_index == 0) ? 1 : 0;
629 gccorestatus[data1] = data2;
630 gcnumsendobjs[entry_index][data1] = data3;
631 gcnumreceiveobjs[entry_index][data1] = data4;
635 void processmsg_gcmarkedobj_I() {
636 void * objptr = (void *) msgdata[msgdataindex];
639 // received a markedObj msg
640 if(!checkMark(objptr)) {
641 // this is the first time that this object is discovered,
642 // set the flag as DISCOVERED
645 gc_enqueue_I(objptr);
647 gcself_numreceiveobjs++;
648 gc_status_info.gcbusystatus = true;
651 void processmsg_gcmovestart_I() {
653 gcmovestartaddr = msgdata[msgdataindex];
657 void processmsg_gclobjinfo_I(unsigned int msglength) {
659 int cnum = msgdata[msgdataindex];
661 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORES4GC - 1);
663 // store the mark result info
664 gcloads[cnum] = msgdata[msgdataindex];
667 // large obj info here
668 for(int k = 3; k < msglength; k+=2) {
669 void * lobj = (void *) msgdata[msgdataindex];
671 int length = msgdata[msgdataindex];
673 gc_lobjenqueue_I(lobj, length, cnum);
678 void processmsg_gcprofiles_I() {
679 int data1 = msgdata[msgdataindex];
681 int data2 = msgdata[msgdataindex];
683 int data3 = msgdata[msgdataindex];
686 if(gc_profile_flag) {
689 gc_num_liveobj += data2;
690 gc_num_forwardobj += data3;
698 #ifdef GC_CACHE_ADAPT
699 void processmsg_gcstartcachepolicy_I() {
700 gc_status_info.gcphase = CACHEPOLICYPHASE;
703 void processmsg_gcfinishcachepolicy_I() {
704 int data1 = msgdata[msgdataindex];
706 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
708 // all cores should do update
709 if(data1 < NUMCORESACTIVE) {
710 gccorestatus[data1] = 0;
714 void processmsg_gcstartpref_I() {
715 gc_status_info.gcphase = PREFINISHPHASE;
718 void processmsg_gcfinishpref_I() {
719 int data1 = msgdata[msgdataindex];
721 // received a update phase finish msg
722 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
724 // all cores should do update
725 if(data1 < NUMCORESACTIVE) {
726 gccorestatus[data1] = 0;
729 #endif // GC_CACHE_ADAPT
730 #endif // #ifdef MULTICORE_GC
732 void processmsg_req_notify_start() {
734 if(BAMBOO_CHECK_SEND_MODE()) {
735 cache_msg_1_I(STARTUPCORE,NOTIFYSTART);
737 send_msg_1_I(STARTUPCORE,NOTIFYSTART);
741 void processmsg_notify_start() {
745 // receive object transferred from other cores
746 // or the terminate message from other cores
747 // Should be invoked in critical sections!!
748 // NOTICE: following format is for threadsimulate version only
749 // RAW version please see previous description
750 // format: type + object
751 // type: -1--stall msg
753 // return value: 0--received an object
754 // 1--received nothing
755 // 2--received a Stall Msg
756 // 3--received a lock Msg
757 // RAW version: -1 -- received nothing
758 // otherwise -- received msg type
759 int receiveObject_I() {
760 PROFILE_INTERRUPT_START();
762 // get the incoming msgs
764 if((msgdataindex == msgdatalast) && (!msgdatafull)) {
767 if(BAMBOO_CHECK_SEND_MODE()) {
768 // during send, don't process the msg now
772 // processing received msgs
774 MSG_REMAINSIZE_I(size);
777 // have new coming msg
778 if((BAMBOO_MSG_AVAIL() != 0) && !msgdatafull) {
785 //we only ever read the first word
786 unsigned int realtype = msgdata[msgdataindex];
787 unsigned int msglength = checkMsgLength_I(realtype);
789 #if (defined(TASK)||defined(MULTICORE_GC))
790 unsigned int type = realtype & 0xff;
792 unsigned int type = realtype;
795 if(msglength <= size) {
796 // have some whole msg
801 case REQNOTIFYSTART: {
802 processmsg_req_notify_start();
807 processmsg_notify_start();
813 // receive a object transfer msg
814 processmsg_transobj_I(msglength);
819 // receive a stall msg
820 processmsg_transtall_I();
825 // GC version have no lock msgs
828 // receive lock request msg, handle it right now
829 processmsg_lockrequest_I();
833 // receive lock grount msg
834 processmsg_lockgrount_I();
838 // receive lock deny msg
839 processmsg_lockdeny_I();
843 processmsg_lockrelease_I();
849 case PROFILEOUTPUT: {
850 // receive an output profile data request msg
851 processmsg_profileoutput_I();
854 case PROFILEFINISH: {
855 // receive a profile output finish msg
856 processmsg_profilefinish_I();
861 // GC version has no lock msgs
864 // receive a redirect lock request msg, handle it right now
865 processmsg_redirectlock_I();
869 case REDIRECTGROUNT: {
870 // receive a lock grant msg with redirect info
871 processmsg_redirectgrount_I();
876 // receive a lock deny msg with redirect info
877 processmsg_redirectdeny_I();
881 case REDIRECTRELEASE: {
882 // receive a lock release msg with redirect info
883 processmsg_redirectrelease_I();
885 } // case REDIRECTRELEASE
889 case STATUSCONFIRM: {
890 // receive a status confirm info
891 processmsg_statusconfirm_I();
896 processmsg_statusreport_I();
901 // receive a terminate msg
902 processmsg_terminate_I();
907 processmsg_memrequest_I();
912 processmsg_memresponse_I();
919 processmsg_gcinvoke_I();
924 processmsg_gcstartpre_I();
929 processmsg_gcstartinit_I();
934 // receive a start GC msg
935 processmsg_gcstart_I();
939 case GCSTARTCOMPACT: {
940 // a compact phase start msg
941 processmsg_gcstartcompact_I();
945 case GCSTARTUPDATE: {
946 // received a update phase start msg
947 processmsg_gcstartupdate_I();
952 processmsg_gcfinishpre_I();
957 processmsg_gcfinishinit_I();
962 processmsg_gcfinishmark_I();
967 processmsg_returnmem_I();
971 case GCFINISHCOMPACT: {
972 // received a compact phase finish msg
973 processmsg_gcfinishcompact_I();
977 case GCFINISHUPDATE: {
978 processmsg_gcfinishupdate_I();
983 processmsg_gcfinish_I();
987 case GCMARKCONFIRM: {
988 // received a marked phase finish confirm request msg
989 // all cores should do mark
990 processmsg_gcmarkconfirm_I();
995 processmsg_gcmarkreport_I();
1000 processmsg_gcmarkedobj_I();
1005 // received a start moving objs msg
1006 processmsg_gcmovestart_I();
1010 case GCLOBJREQUEST: {
1011 // received a large objs info request msg
1012 transferMarkResults_I();
1017 processmsg_reqblock_I();
1021 case GCGRANTBLOCK: {
1022 processmsg_grantblock_I();
1027 // received a large objs info response msg
1028 processmsg_gclobjinfo_I(msglength);
1034 // received a gcprofiles msg
1035 processmsg_gcprofiles_I();
1038 #endif // GC_PROFILE
1040 #ifdef GC_CACHE_ADAPT
1041 case GCSTARTCACHEPOLICY: {
1042 // received a gcstartcachepolicy msg
1043 processmsg_gcstartcachepolicy_I();
1047 case GCFINISHCACHEPOLICY: {
1048 // received a gcfinishcachepolicy msg
1049 processmsg_gcfinishcachepolicy_I();
1054 // received a gcstartpref msg
1055 processmsg_gcstartpref_I();
1059 case GCFINISHPREF: {
1060 // received a gcfinishpref msg
1061 processmsg_gcfinishpref_I();
1071 if((msgdataindex != msgdatalast) || (msgdatafull)) {
1072 // still have available msg
1076 // have new coming msg
1077 if(BAMBOO_MSG_AVAIL() != 0) {
1081 PROFILE_INTERRUPT_END();