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
34 #if defined(MULTICORE_GC)||defined(PMC_GC)
36 1, //GCSTARTPRE, // 0xE2
39 1, //GCSTARTINIT, // 0xE3
41 2, //GCSTARTCOMPACT, // 0xE5
42 1, //GCSTARTUPDATE, // 0xE6
43 4, //GCFINISHPRE, // 0xE7
44 2, //GCFINISHINIT, // 0xE8
45 4, //GCFINISHMARK, // 0xE9
46 4, //GCFINISHCOMPACT, // 0xEa
48 2, //GCFINISHUPDATE, // 0xEb
49 1, //GCFINISH, // 0xEc
50 1, //GCMARKCONFIRM, // 0xEd
51 5, //GCMARKREPORT, // 0xEe
52 2, //GCMARKEDOBJ, // 0xEf
53 2, //GCMOVESTART, // 0xF0
54 1, //GCLOBJREQUEST, // 0xF1
57 -1, //GCLOBJINFO, // 0xF2
59 4, //GCPROFILES, // 0xF3
62 1, //GCSTARTCACHEPOLICY // 0xF4
63 2, //GCFINISHCACHEPOLICY // 0xF5
64 1, //GCSTARTPREF, // 0xF6
65 2, //GCFINISHPREF, // 0xF7
66 #endif // GC_CACHE_ADAPT
67 #endif // MULTICORE_GC
71 unsigned int checkMsgLength_I(unsigned int realtype) {
72 #if (defined(TASK)||defined(MULTICORE_GC))
73 unsigned int type = realtype & 0xff;
75 unsigned int type = realtype;
77 BAMBOO_ASSERT(type<=MSGEND);
79 #if defined(MULTICORE_GC)
80 if(type==TRANSOBJ||type==GCLOBJINFO) {
84 #elif defined(MULTICORE_GC)
85 if (type==GCLOBJINFO) {
87 #if (defined(TASK)||defined(MULTICORE_GC))
91 return msgsizearray[type];
95 void processmsg_transobj_I(int msglength) {
96 struct transObjInfo * transObj=RUNMALLOC_I(sizeof(struct transObjInfo));
97 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
99 // store the object and its corresponding queue info, enqueue it later
100 transObj->objptr = (void *)msgdata[msgdataindex];
102 transObj->length = (msglength - 2) / 2;
103 transObj->queues = RUNMALLOC_I(sizeof(int)*(msglength - 3));
104 for(int k = 0; k < transObj->length; k++) {
105 transObj->queues[2*k] = msgdata[msgdataindex];
107 transObj->queues[2*k+1] = msgdata[msgdataindex];
110 // check if there is an existing duplicate item
111 struct QueueItem * prev = NULL;
112 for(struct QueueItem * qitem = getHead(&objqueue);qitem != NULL;qitem=(prev==NULL)?getHead(&objqueue):getNextQueueItem(prev)) {
113 struct transObjInfo * tmpinfo = (struct transObjInfo *)(qitem->objectptr);
114 if(tmpinfo->objptr == transObj->objptr) {
115 // the same object, remove outdate one
116 RUNFREE_I(tmpinfo->queues);
118 removeItem(&objqueue, qitem);
124 addNewItem_I(&objqueue, (void *)transObj);
126 self_numreceiveobjs++;
128 if(gc_status_info.gcprocessing) {
129 if(STARTUPCORE == BAMBOO_NUM_OF_CORE) {
130 // set the gcprecheck to enable checking again
133 // send a update pregc information msg to the master core
134 if(BAMBOO_CHECK_SEND_MODE()) {
135 cache_msg_4_I(STARTUPCORE,GCFINISHPRE,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
137 send_msg_4_I(STARTUPCORE,GCFINISHPRE,BAMBOO_NUM_OF_CORE,self_numsendobjs, self_numreceiveobjs);
145 void processmsg_transtall_I() {
146 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
148 int num_core = msgdata[msgdataindex];
150 int data2 = msgdata[msgdataindex];
152 int data3 = msgdata[msgdataindex];
154 if(num_core < NUMCORESACTIVE) {
155 corestatus[num_core] = 0;
156 numsendobjs[num_core] = data2;
157 numreceiveobjs[num_core] = data3;
161 #if !defined(MULTICORE_GC)&&!defined(PMC_GC)
162 void processmsg_lockrequest_I() {
163 // check to see if there is a lock exist for the required obj
164 // msgdata[1] -> lock type
165 int locktype = msgdata[msgdataindex];
167 int data2 = msgdata[msgdataindex]; // obj pointer
169 int data3 = msgdata[msgdataindex]; // lock
171 int data4 = msgdata[msgdataindex]; // request core
173 // -1: redirected, 0: approved, 1: denied
174 int deny=processlockrequest(locktype, data3, data2, data4, data4, true);
177 // for 32 bit machine, the size is always 4 words, cache the msg first
178 int tmp = deny==1 ? LOCKDENY : LOCKGROUNT;
179 if(BAMBOO_CHECK_SEND_MODE()) {
180 cache_msg_4_I(data4,tmp,locktype,data2,data3);
182 send_msg_4_I(data4,tmp,locktype,data2,data3);
187 void processmsg_lockgrount_I() {
189 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
190 int data2 = msgdata[msgdataindex];
192 int data3 = msgdata[msgdataindex];
194 BAMBOO_ASSERT((lockobj == data2) && (lock2require == data3));
202 void processmsg_lockdeny_I() {
204 int data2 = msgdata[msgdataindex];
206 int data3 = msgdata[msgdataindex];
208 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
209 BAMBOO_ASSERT((lockobj == data2) && (lock2require == data3));
217 void processmsg_lockrelease_I() {
218 int data1 = msgdata[msgdataindex];
220 int data2 = msgdata[msgdataindex];
222 int data3 = msgdata[msgdataindex];
224 // receive lock release msg
225 processlockrelease(data1, data2, 0, false);
228 void processmsg_redirectlock_I() {
229 // check to see if there is a lock exist for the required obj
230 int data1 = msgdata[msgdataindex];
231 MSG_INDEXINC_I(); // lock type
232 int data2 = msgdata[msgdataindex];
233 MSG_INDEXINC_I(); // obj pointer
234 int data3 = msgdata[msgdataindex];
235 MSG_INDEXINC_I(); // redirect lock
236 int data4 = msgdata[msgdataindex];
237 MSG_INDEXINC_I(); // root request core
238 int data5 = msgdata[msgdataindex];
239 MSG_INDEXINC_I(); // request core
240 int deny = processlockrequest_I(data1, data3, data2, data5, data4, true);
243 // for 32 bit machine, the size is always 4 words, cache the msg first
244 if(BAMBOO_CHECK_SEND_MODE()) {
245 cache_msg_4_I(data4,deny==1?REDIRECTDENY:REDIRECTGROUNT,data1,data2,data3);
247 send_msg_4_I(data4,deny==1?REDIRECTDENY:REDIRECTGROUNT,data1,data2,data3);
252 void processmsg_redirectgrount_I() {
254 int data2 = msgdata[msgdataindex];
256 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
257 BAMBOO_ASSERT(lockobj == data2, 0xe207);
258 int data3 = msgdata[msgdataindex];
262 RuntimeHashadd_I(objRedirectLockTbl, lockobj, data3);
268 void processmsg_redirectdeny_I() {
270 int data2 = msgdata[msgdataindex];
272 int data3 = msgdata[msgdataindex];
274 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
275 BAMBOO_ASSERT(lockobj == data2);
283 void processmsg_redirectrelease_I() {
284 int data1 = msgdata[msgdataindex];
286 int data2 = msgdata[msgdataindex];
288 int data3 = msgdata[msgdataindex];
290 processlockrelease_I(data1, data2, data3, true);
292 #endif // #ifndef MULTICORE_GC
295 void processmsg_profileoutput_I() {
296 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE != STARTUPCORE);
298 totalexetime = msgdata[msgdataindex];
300 #if !defined(RT_TEST)
303 // cache the msg first
304 if(BAMBOO_CHECK_SEND_MODE()) {
305 cache_msg_1_I(STARTUPCORE,PROFILEFINISH);
307 send_msg_1_I(STARTUPCORE,PROFILEFINISH);
311 void processmsg_profilefinish_I() {
312 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
317 void processmsg_statusconfirm_I() {
318 BAMBOO_ASSERT(((BAMBOO_NUM_OF_CORE != STARTUPCORE) && (BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1)));
320 // cache the msg first
321 if(BAMBOO_CHECK_SEND_MODE()) {
322 cache_msg_5_I(STARTUPCORE,STATUSREPORT,busystatus?1:0,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
324 send_msg_5_I(STARTUPCORE,STATUSREPORT,busystatus?1:0,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
328 void processmsg_statusreport_I() {
329 int data1 = msgdata[msgdataindex];
331 int data2 = msgdata[msgdataindex];
333 int data3 = msgdata[msgdataindex];
335 int data4 = msgdata[msgdataindex];
337 // receive a status confirm info
338 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
342 corestatus[data2] = data1;
343 numsendobjs[data2] = data3;
344 numreceiveobjs[data2] = data4;
347 void processmsg_terminate_I() {
350 #ifdef GC_CACHE_ADAPT
351 bamboo_mask_timer_intr(); // disable the TILE_TIMER interrupt
358 void processmsg_memrequest_I() {
359 int data1 = msgdata[msgdataindex];
361 int data2 = msgdata[msgdataindex];
363 // receive a shared memory request msg
364 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
366 if(!gc_status_info.gcprocessing || !gcflag) {
367 // either not doing GC or the master core has decided to stop GC but
368 // // still sending msgs to other cores to inform them to stop the GC
370 unsigned INTPTR allocsize = 0;
371 void * mem = smemalloc_I(data2, data1, &allocsize);
373 // send the start_va to request core, cache the msg first
374 if(BAMBOO_CHECK_SEND_MODE()) {
375 cache_msg_3_I(data2,MEMRESPONSE,(unsigned INTPTR) mem,allocsize);
377 send_msg_3_I(data2,MEMRESPONSE,(unsigned INTPTR) mem,allocsize);
379 } //else if mem == NULL, the gcflag of the startup core has been set
380 // and all the other cores have been informed to start gc
386 void processmsg_memresponse_I() {
387 void * memptr =(void *) msgdata[msgdataindex];
389 unsigned int numbytes = msgdata[msgdataindex];
391 // receive a shared memory response msg
393 // if is currently doing gc, dump this msg
394 if(!gc_status_info.gcprocessing) {
398 bamboo_smem_zero_top = NULL;
400 bamboo_smem_size = 0;
401 bamboo_cur_msp = NULL;
404 bamboo_smem_size = numbytes;
405 bamboo_cur_msp = memptr;
407 bamboo_smem_size = numbytes;
408 bamboo_cur_msp =memptr;
416 #endif //ifndef PMCGC
419 #if defined(MULTICORE_GC)||defined(PMC_GC)
420 void processmsg_gcinvoke_I() {
421 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE==STARTUPCORE);
423 if(!gc_status_info.gcprocessing && !gcflag) {
426 for(int i = 0; i < NUMCORESACTIVE; i++) {
427 // reuse the gcnumsendobjs & gcnumreceiveobjs
428 gcnumsendobjs[0][i] = 0;
429 gcnumreceiveobjs[0][i] = 0;
436 for(int i = 0; i < NUMCORES4GC; i++) {
437 if(i != STARTUPCORE) {
438 if(BAMBOO_CHECK_SEND_MODE()) {
439 cache_msg_1_I(i,GCSTARTPRE);
441 send_msg_1_I(i,GCSTARTPRE);
448 void processmsg_gcstartpre_I() {
449 // the first time to be informed to start gc
454 void processmsg_gcstartinit_I() {
455 gc_status_info.gcphase = INITPHASE;
458 void processmsg_gcstart_I() {
460 gc_status_info.gcphase = MARKPHASE;
463 void processmsg_gcstartcompact_I() {
464 gcblock2fill = msgdata[msgdataindex];
466 BAMBOO_ASSERT(!gc_status_info.gcbusystatus);
467 gc_status_info.gcphase = COMPACTPHASE;
470 void processmsg_gcstartupdate_I() {
471 gc_status_info.gcphase = UPDATEPHASE;
474 void processmsg_gcfinishpre_I() {
475 int data1 = msgdata[msgdataindex];
477 int data2 = msgdata[msgdataindex];
479 int data3 = msgdata[msgdataindex];
481 // received a init phase finish msg
482 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
484 // All cores should do init GC
486 gccorestatus[data1] = 0;
487 gcnumsendobjs[0][data1] = data2;
488 gcnumreceiveobjs[0][data1] = data3;
491 void processmsg_gcfinishinit_I() {
492 int data1 = msgdata[msgdataindex];
494 // received a init phase finish msg
495 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
497 // All cores should do init GC
498 if(data1 < NUMCORESACTIVE) {
499 gccorestatus[data1] = 0;
503 void processmsg_reqblock_I() {
504 int cnum=msgdata[msgdataindex];
506 void * topptr= (void *)msgdata[msgdataindex];
508 if (topptr<=update_origblockptr) {
510 if(BAMBOO_CHECK_SEND_MODE()) {
511 cache_msg_1_I(cnum,GCGRANTBLOCK);
513 send_msg_1_I(cnum,GCGRANTBLOCK);
517 origblockarray[cnum]=topptr;
522 void processmsg_grantblock_I() {
527 void processmsg_gcfinishmark_I() {
528 int cnum = msgdata[msgdataindex];
530 int nsend = msgdata[msgdataindex];
532 int nrecv = msgdata[msgdataindex];
534 // received a mark phase finish msg
535 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
536 BAMBOO_ASSERT(gc_status_info.gcphase == MARKPHASE);
538 // all cores should do mark
539 if(cnum < NUMCORESACTIVE) {
540 gccorestatus[cnum] = 0;
544 entry_index = (gcnumsrobjs_index == 0) ? 1 : 0;
547 entry_index = gcnumsrobjs_index;
549 gcnumsendobjs[entry_index][cnum] = nsend;
550 gcnumreceiveobjs[entry_index][cnum] = nrecv;
554 void processmsg_returnmem_I() {
555 unsigned int cnum = msgdata[msgdataindex];
557 void * heaptop = (void *) msgdata[msgdataindex];
560 handleReturnMem_I(cnum, heaptop);
563 void * handlegcfinishcompact_I(int cnum, unsigned int bytesneeded, unsigned int maxbytesneeded) {
564 if(bytesneeded > 0) {
566 return gcfindSpareMem_I(bytesneeded, maxbytesneeded, cnum);
568 //done with compacting
569 gccorestatus[cnum] = 0;
574 void processmsg_gcfinishcompact_I() {
575 int cnum = msgdata[msgdataindex];
577 unsigned int bytesneeded = msgdata[msgdataindex];
579 unsigned int maxbytesneeded = msgdata[msgdataindex];
582 void * startaddr=handlegcfinishcompact_I(cnum, bytesneeded, maxbytesneeded);
584 if(BAMBOO_CHECK_SEND_MODE()) {
585 cache_msg_2_I(cnum,GCMOVESTART,(unsigned INTPTR)startaddr);
587 send_msg_2_I(cnum,GCMOVESTART,(unsigned INTPTR)startaddr);
592 void processmsg_gcfinishupdate_I() {
593 int data1 = msgdata[msgdataindex];
595 // received a update phase finish msg
596 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
598 // all cores should do update
599 if(data1 < NUMCORESACTIVE) {
600 gccorestatus[data1] = 0;
604 void processmsg_gcfinish_I() {
605 // received a GC finish msg
606 gc_status_info.gcphase = FINISHPHASE;
607 gc_status_info.gcprocessing = false;
610 void processmsg_gcmarkconfirm_I() {
611 BAMBOO_ASSERT(((BAMBOO_NUM_OF_CORE!=STARTUPCORE)&&(BAMBOO_NUM_OF_CORE<=NUMCORESACTIVE-1)));
612 // send response msg, cahce the msg first
613 if(BAMBOO_CHECK_SEND_MODE()) {
614 cache_msg_5_I(STARTUPCORE,GCMARKREPORT,BAMBOO_NUM_OF_CORE,gc_status_info.gcbusystatus,gcself_numsendobjs,gcself_numreceiveobjs);
616 send_msg_5_I(STARTUPCORE,GCMARKREPORT,BAMBOO_NUM_OF_CORE,gc_status_info.gcbusystatus,gcself_numsendobjs,gcself_numreceiveobjs);
620 void processmsg_gcmarkreport_I() {
621 int data1 = msgdata[msgdataindex];
623 int data2 = msgdata[msgdataindex];
625 int data3 = msgdata[msgdataindex];
627 int data4 = msgdata[msgdataindex];
629 // received a marked phase finish confirm response msg
630 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
632 BAMBOO_ASSERT(waitconfirm);
636 entry_index = (gcnumsrobjs_index == 0) ? 1 : 0;
637 gccorestatus[data1] = data2;
638 gcnumsendobjs[entry_index][data1] = data3;
639 gcnumreceiveobjs[entry_index][data1] = data4;
643 void processmsg_gcmarkedobj_I() {
644 void * objptr = (void *) msgdata[msgdataindex];
647 // received a markedObj msg
648 if(!checkMark(objptr)) {
649 // this is the first time that this object is discovered,
650 // set the flag as DISCOVERED
653 gc_enqueue_I(objptr);
655 gcself_numreceiveobjs++;
656 gc_status_info.gcbusystatus = true;
659 void processmsg_gcmovestart_I() {
661 gcmovestartaddr = msgdata[msgdataindex];
665 void processmsg_gclobjinfo_I(unsigned int msglength) {
667 int cnum = msgdata[msgdataindex];
669 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORES4GC - 1);
671 // store the mark result info
672 gcloads[cnum] = msgdata[msgdataindex];
675 // large obj info here
676 for(int k = 3; k < msglength; k+=2) {
677 void * lobj = (void *) msgdata[msgdataindex];
679 int length = msgdata[msgdataindex];
681 gc_lobjenqueue_I(lobj, length, cnum);
686 void processmsg_gcprofiles_I() {
687 int data1 = msgdata[msgdataindex];
689 int data2 = msgdata[msgdataindex];
691 int data3 = msgdata[msgdataindex];
694 if(gc_profile_flag) {
697 gc_num_liveobj += data2;
698 gc_num_forwardobj += data3;
706 #ifdef GC_CACHE_ADAPT
707 void processmsg_gcstartcachepolicy_I() {
708 gc_status_info.gcphase = CACHEPOLICYPHASE;
711 void processmsg_gcfinishcachepolicy_I() {
712 int data1 = msgdata[msgdataindex];
714 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
716 // all cores should do update
717 if(data1 < NUMCORESACTIVE) {
718 gccorestatus[data1] = 0;
722 void processmsg_gcstartpref_I() {
723 gc_status_info.gcphase = PREFINISHPHASE;
726 void processmsg_gcfinishpref_I() {
727 int data1 = msgdata[msgdataindex];
729 // received a update phase finish msg
730 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
732 // all cores should do update
733 if(data1 < NUMCORESACTIVE) {
734 gccorestatus[data1] = 0;
737 #endif // GC_CACHE_ADAPT
738 #endif // #ifdef MULTICORE_GC
740 void processmsg_req_notify_start() {
742 if(BAMBOO_CHECK_SEND_MODE()) {
743 cache_msg_1_I(STARTUPCORE,NOTIFYSTART);
745 send_msg_1_I(STARTUPCORE,NOTIFYSTART);
749 void processmsg_notify_start() {
753 // receive object transferred from other cores
754 // or the terminate message from other cores
755 // Should be invoked in critical sections!!
756 // NOTICE: following format is for threadsimulate version only
757 // RAW version please see previous description
758 // format: type + object
759 // type: -1--stall msg
761 // return value: 0--received an object
762 // 1--received nothing
763 // 2--received a Stall Msg
764 // 3--received a lock Msg
765 // RAW version: -1 -- received nothing
766 // otherwise -- received msg type
767 int receiveObject_I() {
768 PROFILE_INTERRUPT_START();
770 // get the incoming msgs
772 if((msgdataindex == msgdatalast) && (!msgdatafull)) {
775 if(BAMBOO_CHECK_SEND_MODE()) {
776 // during send, don't process the msg now
780 // processing received msgs
782 MSG_REMAINSIZE_I(size);
785 // have new coming msg
786 if((BAMBOO_MSG_AVAIL() != 0) && !msgdatafull) {
793 //we only ever read the first word
794 unsigned int realtype = msgdata[msgdataindex];
795 unsigned int msglength = checkMsgLength_I(realtype);
797 #if (defined(TASK)||defined(MULTICORE_GC))
798 unsigned int type = realtype & 0xff;
800 unsigned int type = realtype;
803 if(msglength <= size) {
804 // have some whole msg
809 case REQNOTIFYSTART: {
810 processmsg_req_notify_start();
815 processmsg_notify_start();
821 // receive a object transfer msg
822 processmsg_transobj_I(msglength);
827 // receive a stall msg
828 processmsg_transtall_I();
833 // GC version have no lock msgs
836 // receive lock request msg, handle it right now
837 processmsg_lockrequest_I();
841 // receive lock grount msg
842 processmsg_lockgrount_I();
846 // receive lock deny msg
847 processmsg_lockdeny_I();
851 processmsg_lockrelease_I();
857 case PROFILEOUTPUT: {
858 // receive an output profile data request msg
859 processmsg_profileoutput_I();
862 case PROFILEFINISH: {
863 // receive a profile output finish msg
864 processmsg_profilefinish_I();
869 // GC version has no lock msgs
872 // receive a redirect lock request msg, handle it right now
873 processmsg_redirectlock_I();
877 case REDIRECTGROUNT: {
878 // receive a lock grant msg with redirect info
879 processmsg_redirectgrount_I();
884 // receive a lock deny msg with redirect info
885 processmsg_redirectdeny_I();
889 case REDIRECTRELEASE: {
890 // receive a lock release msg with redirect info
891 processmsg_redirectrelease_I();
893 } // case REDIRECTRELEASE
897 case STATUSCONFIRM: {
898 // receive a status confirm info
899 processmsg_statusconfirm_I();
904 processmsg_statusreport_I();
909 // receive a terminate msg
910 processmsg_terminate_I();
915 processmsg_memrequest_I();
920 processmsg_memresponse_I();
924 #if defined(MULTICORE_GC)||defined(PMC_GC)
927 processmsg_gcinvoke_I();
932 processmsg_gcstartpre_I();
938 processmsg_gcstartinit_I();
943 // receive a start GC msg
944 processmsg_gcstart_I();
948 case GCSTARTCOMPACT: {
949 // a compact phase start msg
950 processmsg_gcstartcompact_I();
954 case GCSTARTUPDATE: {
955 // received a update phase start msg
956 processmsg_gcstartupdate_I();
961 processmsg_gcfinishpre_I();
966 processmsg_gcfinishinit_I();
971 processmsg_gcfinishmark_I();
976 processmsg_returnmem_I();
980 case GCFINISHCOMPACT: {
981 // received a compact phase finish msg
982 processmsg_gcfinishcompact_I();
986 case GCFINISHUPDATE: {
987 processmsg_gcfinishupdate_I();
992 processmsg_gcfinish_I();
996 case GCMARKCONFIRM: {
997 // received a marked phase finish confirm request msg
998 // all cores should do mark
999 processmsg_gcmarkconfirm_I();
1003 case GCMARKREPORT: {
1004 processmsg_gcmarkreport_I();
1009 processmsg_gcmarkedobj_I();
1014 // received a start moving objs msg
1015 processmsg_gcmovestart_I();
1019 case GCLOBJREQUEST: {
1020 // received a large objs info request msg
1021 transferMarkResults_I();
1026 processmsg_reqblock_I();
1030 case GCGRANTBLOCK: {
1031 processmsg_grantblock_I();
1036 // received a large objs info response msg
1037 processmsg_gclobjinfo_I(msglength);
1043 // received a gcprofiles msg
1044 processmsg_gcprofiles_I();
1047 #endif // GC_PROFILE
1049 #ifdef GC_CACHE_ADAPT
1050 case GCSTARTCACHEPOLICY: {
1051 // received a gcstartcachepolicy msg
1052 processmsg_gcstartcachepolicy_I();
1056 case GCFINISHCACHEPOLICY: {
1057 // received a gcfinishcachepolicy msg
1058 processmsg_gcfinishcachepolicy_I();
1063 // received a gcstartpref msg
1064 processmsg_gcstartpref_I();
1068 case GCFINISHPREF: {
1069 // received a gcfinishpref msg
1070 processmsg_gcfinishpref_I();
1080 if((msgdataindex != msgdatalast) || (msgdatafull)) {
1081 // still have available msg
1085 // have new coming msg
1086 if(BAMBOO_MSG_AVAIL() != 0) {
1090 PROFILE_INTERRUPT_END();