2 #include "multicoremsg.h"
4 #include "multicoreruntime.h"
5 #include "multicoregarbage.h"
6 #include "multicoretaskprofile.h"
11 -1, //TRANSOBJ, // 0xD1
12 4, //TRANSTALL, // 0xD2
13 5, //LOCKREQUEST, // 0xD3
14 4, //LOCKGROUNT, // 0xD4
15 4, //LOCKDENY, // 0xD5
16 4, //LOCKRELEASE, // 0xD6
17 2, //PROFILEOUTPUT, // 0xD7
18 1, //PROFILEFINISH, // 0xD8
19 6, //REDIRECTLOCK, // 0xD9
20 4, //REDIRECTGROUNT, // 0xDa
21 4, //REDIRECTDENY, // 0xDb
22 4, //REDIRECTRELEASE, // 0xDc
23 1, //STATUSCONFIRM, // 0xDd
24 5, //STATUSREPORT, // 0xDe
25 1, //TERMINATE, // 0xDf
26 3, //MEMREQUEST, // 0xE0
27 3, //MEMRESPONSE, // 0xE1
29 1, //GCSTARTPRE, // 0xE2
30 1, //GCSTARTINIT, // 0xE3
32 2, //GCSTARTCOMPACT, // 0xE5
33 1, //GCSTARTFLUSH, // 0xE6
34 4, //GCFINISHPRE, // 0xE7
35 2, //GCFINISHINIT, // 0xE8
36 4, //GCFINISHMARK, // 0xE9
37 5, //GCFINISHCOMPACT, // 0xEa
38 2, //GCFINISHFLUSH, // 0xEb
39 1, //GCFINISH, // 0xEc
40 1, //GCMARKCONFIRM, // 0xEd
41 5, //GCMARKREPORT, // 0xEe
42 2, //GCMARKEDOBJ, // 0xEf
43 4, //GCMOVESTART, // 0xF0
44 1, //GCLOBJREQUEST, // 0xF1
45 -1, //GCLOBJINFO, // 0xF2
47 4, //GCPROFILES, // 0xF3
50 1, //GCSTARTPREF, // 0xF5
51 2, //GCFINISHPREF, // 0xF7
52 #endif // GC_CACHE_ADAPT
53 #endif // MULTICORE_GC
57 INLINE unsigned int checkMsgLength_I(unsigned int realtype) {
58 #if (defined(TASK)||defined(MULTICORE_GC))
59 unsigned int type = realtype & 0xff;
61 unsigned int type = realtype;
63 BAMBOO_ASSERT(type<=MSGEND);
66 if(type==TRANSOBJ||type==GCLOBJINFO) {
71 if (type==GCLOBJINFO) {
73 #if (defined(TASK)||defined(MULTICORE_GC))
77 return msgsizearray[type];
81 INLINE void processmsg_transobj_I(int msglength) {
82 struct transObjInfo * transObj=RUNMALLOC_I(sizeof(struct transObjInfo));
83 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
85 // store the object and its corresponding queue info, enqueue it later
86 transObj->objptr = (void *)msgdata[msgdataindex];
88 transObj->length = (msglength - 2) / 2;
89 transObj->queues = RUNMALLOC_I(sizeof(int)*(msglength - 3));
90 for(int k = 0; k < transObj->length; k++) {
91 transObj->queues[2*k] = msgdata[msgdataindex];
93 transObj->queues[2*k+1] = msgdata[msgdataindex];
96 // check if there is an existing duplicate item
97 struct QueueItem * prev = NULL;
98 for(struct QueueItem * qitem = getHead(&objqueue);qitem != NULL;qitem=(prev==NULL)?getHead(&objqueue):getNextQueueItem(prev)) {
99 struct transObjInfo * tmpinfo = (struct transObjInfo *)(qitem->objectptr);
100 if(tmpinfo->objptr == transObj->objptr) {
101 // the same object, remove outdate one
102 RUNFREE_I(tmpinfo->queues);
104 removeItem(&objqueue, qitem);
110 addNewItem_I(&objqueue, (void *)transObj);
112 self_numreceiveobjs++;
114 if(gc_status_info.gcprocessing) {
115 if(STARTUPCORE == BAMBOO_NUM_OF_CORE) {
116 // set the gcprecheck to enable checking again
119 // send a update pregc information msg to the master core
120 if(BAMBOO_CHECK_SEND_MODE()) {
121 cache_msg_4_I(STARTUPCORE,GCFINISHPRE,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
123 send_msg_4_I(STARTUPCORE,GCFINISHPRE,BAMBOO_NUM_OF_CORE,self_numsendobjs, self_numreceiveobjs);
131 INLINE void processmsg_transtall_I() {
132 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
134 int num_core = msgdata[msgdataindex];
136 int data2 = msgdata[msgdataindex];
138 int data3 = msgdata[msgdataindex];
140 if(num_core < NUMCORESACTIVE) {
141 corestatus[num_core] = 0;
142 numsendobjs[num_core] = data2;
143 numreceiveobjs[num_core] = data3;
148 INLINE void processmsg_lockrequest_I() {
149 // check to see if there is a lock exist for the required obj
150 // msgdata[1] -> lock type
151 int locktype = msgdata[msgdataindex];
153 int data2 = msgdata[msgdataindex]; // obj pointer
155 int data3 = msgdata[msgdataindex]; // lock
157 int data4 = msgdata[msgdataindex]; // request core
159 // -1: redirected, 0: approved, 1: denied
160 int deny=processlockrequest(locktype, data3, data2, data4, data4, true);
163 // for 32 bit machine, the size is always 4 words, cache the msg first
164 int tmp = deny==1 ? LOCKDENY : LOCKGROUNT;
165 if(BAMBOO_CHECK_SEND_MODE()) {
166 cache_msg_4_I(data4,tmp,locktype,data2,data3);
168 send_msg_4_I(data4,tmp,locktype,data2,data3);
173 INLINE void processmsg_lockgrount_I() {
175 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
176 int data2 = msgdata[msgdataindex];
178 int data3 = msgdata[msgdataindex];
180 BAMBOO_ASSERT((lockobj == data2) && (lock2require == data3));
188 INLINE void processmsg_lockdeny_I() {
190 int data2 = msgdata[msgdataindex];
192 int data3 = msgdata[msgdataindex];
194 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
195 BAMBOO_ASSERT((lockobj == data2) && (lock2require == data3));
203 INLINE void processmsg_lockrelease_I() {
204 int data1 = msgdata[msgdataindex];
206 int data2 = msgdata[msgdataindex];
208 int data3 = msgdata[msgdataindex];
210 // receive lock release msg
211 processlockrelease(data1, data2, 0, false);
214 INLINE void processmsg_redirectlock_I() {
215 // check to see if there is a lock exist for the required obj
216 int data1 = msgdata[msgdataindex];
217 MSG_INDEXINC_I(); // lock type
218 int data2 = msgdata[msgdataindex];
219 MSG_INDEXINC_I(); // obj pointer
220 int data3 = msgdata[msgdataindex];
221 MSG_INDEXINC_I(); // redirect lock
222 int data4 = msgdata[msgdataindex];
223 MSG_INDEXINC_I(); // root request core
224 int data5 = msgdata[msgdataindex];
225 MSG_INDEXINC_I(); // request core
226 int deny = processlockrequest_I(data1, data3, data2, data5, data4, true);
229 // for 32 bit machine, the size is always 4 words, cache the msg first
230 if(BAMBOO_CHECK_SEND_MODE()) {
231 cache_msg_4_I(data4,deny==1?REDIRECTDENY:REDIRECTGROUNT,data1,data2,data3);
233 send_msg_4_I(data4,deny==1?REDIRECTDENY:REDIRECTGROUNT,data1,data2,data3);
238 INLINE void processmsg_redirectgrount_I() {
240 int data2 = msgdata[msgdataindex];
242 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
243 BAMBOO_ASSERT(lockobj == data2, 0xe207);
244 int data3 = msgdata[msgdataindex];
248 RuntimeHashadd_I(objRedirectLockTbl, lockobj, data3);
254 INLINE void processmsg_redirectdeny_I() {
256 int data2 = msgdata[msgdataindex];
258 int data3 = msgdata[msgdataindex];
260 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
261 BAMBOO_ASSERT(lockobj == data2);
269 INLINE void processmsg_redirectrelease_I() {
270 int data1 = msgdata[msgdataindex];
272 int data2 = msgdata[msgdataindex];
274 int data3 = msgdata[msgdataindex];
276 processlockrelease_I(data1, data2, data3, true);
278 #endif // #ifndef MULTICORE_GC
281 INLINE void processmsg_profileoutput_I() {
282 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE != STARTUPCORE);
284 totalexetime = msgdata[msgdataindex];
290 // cache the msg first
291 if(BAMBOO_CHECK_SEND_MODE()) {
292 cache_msg_1_I(STARTUPCORE,PROFILEFINISH);
294 send_msg_1_I(STARTUPCORE,PROFILEFINISH);
298 INLINE void processmsg_profilefinish_I() {
299 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
304 INLINE void processmsg_statusconfirm_I() {
305 BAMBOO_ASSERT(((BAMBOO_NUM_OF_CORE != STARTUPCORE) && (BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1)));
307 // cache the msg first
308 if(BAMBOO_CHECK_SEND_MODE()) {
309 cache_msg_5_I(STARTUPCORE,STATUSREPORT,busystatus?1:0,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
311 send_msg_5_I(STARTUPCORE,STATUSREPORT,busystatus?1:0,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
315 INLINE void processmsg_statusreport_I() {
316 int data1 = msgdata[msgdataindex];
318 int data2 = msgdata[msgdataindex];
320 int data3 = msgdata[msgdataindex];
322 int data4 = msgdata[msgdataindex];
324 // receive a status confirm info
325 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
329 corestatus[data2] = data1;
330 numsendobjs[data2] = data3;
331 numreceiveobjs[data2] = data4;
334 INLINE void processmsg_terminate_I() {
337 #ifdef GC_CACHE_ADAPT
338 bamboo_mask_timer_intr(); // disable the TILE_TIMER interrupt
344 INLINE void processmsg_memrequest_I() {
345 int data1 = msgdata[msgdataindex];
347 int data2 = msgdata[msgdataindex];
349 // receive a shared memory request msg
350 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
354 if(!gc_status_info.gcprocessing || !gcflag) {
355 // either not doing GC or the master core has decided to stop GC but
356 // // still sending msgs to other cores to inform them to stop the GC
358 mem = smemalloc_I(data2, data1, &allocsize);
360 // send the start_va to request core, cache the msg first
361 if(BAMBOO_CHECK_SEND_MODE()) {
362 cache_msg_3_I(data2,MEMRESPONSE,mem,allocsize);
364 send_msg_3_I(data2,MEMRESPONSE,mem,allocsize);
366 } //else if mem == NULL, the gcflag of the startup core has been set
367 // and all the other cores have been informed to start gc
373 INLINE void processmsg_memresponse_I() {
374 int data1 = msgdata[msgdataindex];
376 int data2 = msgdata[msgdataindex];
378 // receive a shared memory response msg
380 // if is currently doing gc, dump this msg
381 if(!gc_status_info.gcprocessing) {
385 // Zero out the remaining memory here because for the GC_CACHE_ADAPT
386 // version, we need to make sure during the gcinit phase the shared heap
387 // is not touched. Otherwise, there would be problem when adapt the cache
389 BAMBOO_CLOSE_CUR_MSP();
390 bamboo_smem_zero_top = NULL;
392 bamboo_smem_size = 0;
396 CLOSEBLOCK(data1, data2);
397 bamboo_smem_size = data2 - BAMBOO_CACHE_LINE_SIZE;
398 bamboo_cur_msp = data1 + BAMBOO_CACHE_LINE_SIZE;
399 bamboo_smem_zero_top = bamboo_cur_msp;
401 bamboo_smem_size = data2;
402 bamboo_cur_msp =(void*)(data1);
412 INLINE void processmsg_gcstartpre_I() {
413 // the first time to be informed to start gc
416 // Zero out the remaining memory here because for the GC_CACHE_ADAPT
417 // version, we need to make sure during the gcinit phase the shared heap
418 // is not touched. Otherwise, there would be problem when adapt the cache
420 BAMBOO_CLOSE_CUR_MSP();
421 bamboo_smem_size = 0;
422 bamboo_cur_msp = NULL;
424 bamboo_smem_zero_top = NULL;
428 INLINE void processmsg_gcstartinit_I() {
429 gc_status_info.gcphase = INITPHASE;
432 INLINE void processmsg_gcstart_I() {
434 gc_status_info.gcphase = MARKPHASE;
437 INLINE void processmsg_gcstartcompact_I() {
438 gcblock2fill = msgdata[msgdataindex];
440 gc_status_info.gcphase = COMPACTPHASE;
443 INLINE void processmsg_gcstartflush_I() {
444 gc_status_info.gcphase = FLUSHPHASE;
447 INLINE void processmsg_gcfinishpre_I() {
448 int data1 = msgdata[msgdataindex];
450 int data2 = msgdata[msgdataindex];
452 int data3 = msgdata[msgdataindex];
454 // received a init phase finish msg
455 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
457 // All cores should do init GC
459 gccorestatus[data1] = 0;
460 gcnumsendobjs[0][data1] = data2;
461 gcnumreceiveobjs[0][data1] = data3;
464 INLINE void processmsg_gcfinishinit_I() {
465 int data1 = msgdata[msgdataindex];
467 // received a init phase finish msg
468 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
470 // All cores should do init GC
471 if(data1 < NUMCORESACTIVE) {
472 gccorestatus[data1] = 0;
476 INLINE void processmsg_gcfinishmark_I() {
477 int data1 = msgdata[msgdataindex];
479 int data2 = msgdata[msgdataindex];
481 int data3 = msgdata[msgdataindex];
483 // received a mark phase finish msg
484 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
486 // all cores should do mark
487 if(data1 < NUMCORESACTIVE) {
488 gccorestatus[data1] = 0;
492 entry_index = (gcnumsrobjs_index == 0) ? 1 : 0;
495 entry_index = gcnumsrobjs_index;
497 gcnumsendobjs[entry_index][data1] = data2;
498 gcnumreceiveobjs[entry_index][data1] = data3;
502 INLINE void processmsg_gcfinishcompact_I() {
503 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
505 int cnum = msgdata[msgdataindex];
507 int filledblocks = msgdata[msgdataindex];
509 int heaptop = msgdata[msgdataindex];
511 int data4 = msgdata[msgdataindex];
513 // only gc cores need to do compact
514 if(cnum < NUMCORES4GC) {
515 if(COMPACTPHASE == gc_status_info.gcphase) {
516 gcfilledblocks[cnum] = filledblocks;
517 gcloads[cnum] = heaptop;
524 if(gcfindSpareMem_I(&startaddr, &tomove, &dstcore, data4, cnum)) {
525 // cache the msg first
526 if(BAMBOO_CHECK_SEND_MODE()) {
527 cache_msg_4_I(cnum,GCMOVESTART,dstcore,startaddr,tomove);
529 send_msg_4_I(cnum,GCMOVESTART,dstcore,startaddr,tomove);
533 gccorestatus[cnum] = 0;
538 INLINE void processmsg_gcfinishflush_I() {
539 int data1 = msgdata[msgdataindex];
541 // received a flush phase finish msg
542 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
544 // all cores should do flush
545 if(data1 < NUMCORESACTIVE) {
546 gccorestatus[data1] = 0;
550 INLINE void processmsg_gcfinish_I() {
551 // received a GC finish msg
552 gc_status_info.gcphase = FINISHPHASE;
553 gc_status_info.gcprocessing = false;
556 INLINE void processmsg_gcmarkconfirm_I() {
557 BAMBOO_ASSERT(((BAMBOO_NUM_OF_CORE!=STARTUPCORE)&&(BAMBOO_NUM_OF_CORE<=NUMCORESACTIVE-1)));
558 gc_status_info.gcbusystatus = gc_moreItems2_I();
559 // send response msg, cahce the msg first
560 if(BAMBOO_CHECK_SEND_MODE()) {
561 cache_msg_5_I(STARTUPCORE,GCMARKREPORT,BAMBOO_NUM_OF_CORE,gc_status_info.gcbusystatus,gcself_numsendobjs,gcself_numreceiveobjs);
563 send_msg_5_I(STARTUPCORE,GCMARKREPORT,BAMBOO_NUM_OF_CORE,gc_status_info.gcbusystatus,gcself_numsendobjs,gcself_numreceiveobjs);
567 INLINE void processmsg_gcmarkreport_I() {
568 int data1 = msgdata[msgdataindex];
570 int data2 = msgdata[msgdataindex];
572 int data3 = msgdata[msgdataindex];
574 int data4 = msgdata[msgdataindex];
576 // received a marked phase finish confirm response msg
577 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
579 BAMBOO_ASSERT(waitconfirm);
583 entry_index = (gcnumsrobjs_index == 0) ? 1 : 0;
584 gccorestatus[data1] = data2;
585 gcnumsendobjs[entry_index][data1] = data3;
586 gcnumreceiveobjs[entry_index][data1] = data4;
590 INLINE void processmsg_gcmarkedobj_I() {
591 int data1 = msgdata[msgdataindex];
593 BAMBOO_ASSERT(ISSHAREDOBJ(data1));
595 // received a markedObj msg
596 if(((struct ___Object___ *)data1)->marked == INIT) {
597 // this is the first time that this object is discovered,
598 // set the flag as DISCOVERED
599 ((struct ___Object___ *)data1)->marked = DISCOVERED;
602 gcself_numreceiveobjs++;
603 gc_status_info.gcbusystatus = true;
606 INLINE void processmsg_gcmovestart_I() {
608 gcdstcore = msgdata[msgdataindex];
610 gcmovestartaddr = msgdata[msgdataindex];
612 gcblock2fill = msgdata[msgdataindex];
616 INLINE void processmsg_gclobjinfo_I(unsigned int data1) {
618 int data2 = msgdata[msgdataindex];
620 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORES4GC - 1);
622 // store the mark result info
624 gcloads[cnum] = msgdata[msgdataindex];
626 int data4 = msgdata[msgdataindex];
628 if(gcheaptop < data4) {
631 // large obj info here
632 for(int k = 4; k < data1; k+=2) {
633 int lobj = msgdata[msgdataindex];
635 int length = msgdata[msgdataindex];
637 gc_lobjenqueue_I(lobj, length, cnum);
643 INLINE void processmsg_gcprofiles_I() {
644 int data1 = msgdata[msgdataindex];
646 int data2 = msgdata[msgdataindex];
648 int data3 = msgdata[msgdataindex];
651 if(gc_profile_flag) {
654 gc_num_liveobj += data2;
655 gc_num_forwardobj += data3;
663 #ifdef GC_CACHE_ADAPT
664 INLINE void processmsg_gcstartpref_I() {
665 gc_status_info.gcphase = PREFINISHPHASE;
668 INLINE void processmsg_gcfinishpref_I() {
669 int data1 = msgdata[msgdataindex];
671 // received a flush phase finish msg
672 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
674 // all cores should do flush
675 if(data1 < NUMCORESACTIVE) {
676 gccorestatus[data1] = 0;
679 #endif // GC_CACHE_ADAPT
680 #endif // #ifdef MULTICORE_GC
682 // receive object transferred from other cores
683 // or the terminate message from other cores
684 // Should be invoked in critical sections!!
685 // NOTICE: following format is for threadsimulate version only
686 // RAW version please see previous description
687 // format: type + object
688 // type: -1--stall msg
690 // return value: 0--received an object
691 // 1--received nothing
692 // 2--received a Stall Msg
693 // 3--received a lock Msg
694 // RAW version: -1 -- received nothing
695 // otherwise -- received msg type
696 int receiveObject_I() {
697 PROFILE_INTERRUPT_START();
699 // get the incoming msgs
701 if((msgdataindex == msgdatalast) && (!msgdatafull)) {
704 if(BAMBOO_CHECK_SEND_MODE()) {
705 // during send, don't process the msg now
709 // processing received msgs
711 MSG_REMAINSIZE_I(&size);
714 // have new coming msg
715 if((BAMBOO_MSG_AVAIL() != 0) && !msgdatafull) {
722 //we only ever read the first word
723 unsigned int realtype = msgdata[msgdataindex];
724 unsigned int msglength = checkMsgLength_I(realtype);
726 #if (defined(TASK)||defined(MULTICORE_GC))
727 unsigned int type = realtype & 0xff;
729 unsigned int type = realtype;
732 if(msglength <= size) {
733 // have some whole msg
739 // receive a object transfer msg
740 processmsg_transobj_I(msglength);
745 // receive a stall msg
746 processmsg_transtall_I();
751 // GC version have no lock msgs
754 // receive lock request msg, handle it right now
755 processmsg_lockrequest_I();
759 // receive lock grount msg
760 processmsg_lockgrount_I();
764 // receive lock deny msg
765 processmsg_lockdeny_I();
769 processmsg_lockrelease_I();
775 case PROFILEOUTPUT: {
776 // receive an output profile data request msg
777 processmsg_profileoutput_I();
780 case PROFILEFINISH: {
781 // receive a profile output finish msg
782 processmsg_profilefinish_I();
787 // GC version has no lock msgs
790 // receive a redirect lock request msg, handle it right now
791 processmsg_redirectlock_I();
795 case REDIRECTGROUNT: {
796 // receive a lock grant msg with redirect info
797 processmsg_redirectgrount_I();
802 // receive a lock deny msg with redirect info
803 processmsg_redirectdeny_I();
807 case REDIRECTRELEASE: {
808 // receive a lock release msg with redirect info
809 processmsg_redirectrelease_I();
811 } // case REDIRECTRELEASE
815 case STATUSCONFIRM: {
816 // receive a status confirm info
817 processmsg_statusconfirm_I();
822 processmsg_statusreport_I();
827 // receive a terminate msg
828 processmsg_terminate_I();
833 processmsg_memrequest_I();
838 processmsg_memresponse_I();
845 processmsg_gcstartpre_I();
850 processmsg_gcstartinit_I();
855 // receive a start GC msg
856 processmsg_gcstart_I();
860 case GCSTARTCOMPACT: {
861 // a compact phase start msg
862 processmsg_gcstartcompact_I();
867 // received a flush phase start msg
868 processmsg_gcstartflush_I();
873 processmsg_gcfinishpre_I();
878 processmsg_gcfinishinit_I();
883 processmsg_gcfinishmark_I();
887 case GCFINISHCOMPACT: {
888 // received a compact phase finish msg
889 processmsg_gcfinishcompact_I();
893 case GCFINISHFLUSH: {
894 processmsg_gcfinishflush_I();
899 processmsg_gcfinish_I();
903 case GCMARKCONFIRM: {
904 // received a marked phase finish confirm request msg
905 // all cores should do mark
906 processmsg_gcmarkconfirm_I();
911 processmsg_gcmarkreport_I();
916 processmsg_gcmarkedobj_I();
921 // received a start moving objs msg
922 processmsg_gcmovestart_I();
926 case GCLOBJREQUEST: {
927 // received a large objs info request msg
928 transferMarkResults_I();
933 // received a large objs info response msg
934 processmsg_gclobjinfo_I(msglength);
940 // received a gcprofiles msg
941 processmsg_gcprofiles_I();
946 #ifdef GC_CACHE_ADAPT
948 // received a gcstartpref msg
949 processmsg_gcstartpref_I();
954 // received a gcfinishpref msg
955 processmsg_gcfinishpref_I();
965 if((msgdataindex != msgdatalast) || (msgdatafull)) {
966 // still have available msg
970 // have new coming msg
971 if(BAMBOO_MSG_AVAIL() != 0) {
975 PROFILE_INTERRUPT_END();