2 #include "multicoremsg.h"
4 #include "multicoreruntime.h"
5 #include "multicoretaskprofile.h"
8 #include "structdefs.h"
9 #include "runtime_arch.h"
14 int msgsizearray[] = {
16 -1, //TRANSOBJ, // 0xD1
17 4, //TRANSTALL, // 0xD2
18 5, //LOCKREQUEST, // 0xD3
19 4, //LOCKGROUNT, // 0xD4
20 4, //LOCKDENY, // 0xD5
21 4, //LOCKRELEASE, // 0xD6
22 2, //PROFILEOUTPUT, // 0xD7
23 2, //PROFILEFINISH, // 0xD8
24 6, //REDIRECTLOCK, // 0xD9
25 4, //REDIRECTGROUNT, // 0xDa
26 4, //REDIRECTDENY, // 0xDb
27 4, //REDIRECTRELEASE, // 0xDc
28 1, //STATUSCONFIRM, // 0xDd
29 5, //STATUSREPORT, // 0xDe
30 1, //TERMINATE, // 0xDf
31 3, //MEMREQUEST, // 0xE0
32 3, //MEMRESPONSE, // 0xE1
34 1, //GCSTARTPRE, // 0xE2
35 1, //GCSTARTINIT, // 0xE3
37 2, //GCSTARTCOMPACT, // 0xE5
38 1, //GCSTARTFLUSH, // 0xE6
39 4, //GCFINISHPRE, // 0xE7
40 2, //GCFINISHINIT, // 0xE8
41 4, //GCFINISHMARK, // 0xE9
42 5, //GCFINISHCOMPACT, // 0xEa
43 2, //GCFINISHFLUSH, // 0xEb
44 1, //GCFINISH, // 0xEc
45 1, //GCMARKCONFIRM, // 0xEd
46 5, //GCMARKREPORT, // 0xEe
47 2, //GCMARKEDOBJ, // 0xEf
48 4, //GCMOVESTART, // 0xF0
49 1, //GCLOBJREQUEST, // 0xF1
50 -1, //GCLOBJINFO, // 0xF2
52 4, //GCPROFILES, // 0xF3
55 1, //GCSTARTPREF, // 0xF5
56 2, //GCFINISHPREF, // 0xF7
57 #endif // GC_CACHE_ADAPT
58 #endif // MULTICORE_GC
62 INLINE unsigned int checkMsgLength_I(unsigned int realtype) {
63 #if (defined(TASK)||defined(MULTICORE_GC))
64 unsigned int type = realtype & 0xff;
66 unsigned int type = realtype;
68 BAMBOO_ASSERT(type<=MSGEND);
71 if(type==TRANSOBJ||type==GCLOBJINFO) {
76 if (type==GCLOBJINFO) {
78 #if (defined(TASK)||defined(MULTICORE_GC))
82 return msgsizearray[type];
86 INLINE void processmsg_transobj_I(int msglength) {
87 struct transObjInfo * transObj=RUNMALLOC_I(sizeof(struct transObjInfo));
88 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
90 // store the object and its corresponding queue info, enqueue it later
91 transObj->objptr = (void *)msgdata[msgdataindex];
93 transObj->length = (msglength - 2) / 2;
94 transObj->queues = RUNMALLOC_I(sizeof(int)*(msglength - 3));
95 for(int k = 0; k < transObj->length; k++) {
96 transObj->queues[2*k] = msgdata[msgdataindex];
98 transObj->queues[2*k+1] = msgdata[msgdataindex];
101 // check if there is an existing duplicate item
102 struct QueueItem * prev = NULL;
103 for(struct QueueItem * qitem = getHead(&objqueue);qitem != NULL;qitem=(prev==NULL)?getHead(&objqueue):getNextQueueItem(prev)) {
104 struct transObjInfo * tmpinfo = (struct transObjInfo *)(qitem->objectptr);
105 if(tmpinfo->objptr == transObj->objptr) {
106 // the same object, remove outdate one
107 RUNFREE_I(tmpinfo->queues);
109 removeItem(&objqueue, qitem);
115 addNewItem_I(&objqueue, (void *)transObj);
117 self_numreceiveobjs++;
120 if(STARTUPCORE == BAMBOO_NUM_OF_CORE) {
121 // set the gcprecheck to enable checking again
124 // send a update pregc information msg to the master core
125 if(BAMBOO_CHECK_SEND_MODE()) {
126 cache_msg_4_I(STARTUPCORE,GCFINISHPRE,BAMBOO_NUM_OF_CORE,self_numsendobjs,self_numreceiveobjs);
128 send_msg_4_I(STARTUPCORE,GCFINISHPRE,BAMBOO_NUM_OF_CORE,self_numsendobjs, self_numreceiveobjs);
136 INLINE void processmsg_transtall_I() {
137 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
139 int num_core = msgdata[msgdataindex];
141 int data2 = msgdata[msgdataindex];
143 int data3 = msgdata[msgdataindex];
145 if(num_core < NUMCORESACTIVE) {
146 corestatus[num_core] = 0;
147 numsendobjs[num_core] = data2;
148 numreceiveobjs[num_core] = data3;
153 INLINE void processmsg_lockrequest_I() {
154 // check to see if there is a lock exist for the required obj
155 // msgdata[1] -> lock type
156 int locktype = msgdata[msgdataindex];
158 int data2 = msgdata[msgdataindex]; // obj pointer
160 int data3 = msgdata[msgdataindex]; // lock
162 int data4 = msgdata[msgdataindex]; // request core
164 // -1: redirected, 0: approved, 1: denied
165 int deny=processlockrequest(locktype, data3, data2, data4, data4, true);
168 // for 32 bit machine, the size is always 4 words, cache the msg first
169 int tmp = deny==1 ? LOCKDENY : LOCKGROUNT;
170 if(BAMBOO_CHECK_SEND_MODE()) {
171 cache_msg_4_I(data4,tmp,locktype,data2,data3);
173 send_msg_4_I(data4,tmp,locktype,data2,data3);
178 INLINE void processmsg_lockgrount_I() {
180 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
181 int data2 = msgdata[msgdataindex];
183 int data3 = msgdata[msgdataindex];
185 BAMBOO_ASSERT((lockobj == data2) && (lock2require == data3));
193 INLINE void processmsg_lockdeny_I() {
195 int data2 = msgdata[msgdataindex];
197 int data3 = msgdata[msgdataindex];
199 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
200 BAMBOO_ASSERT((lockobj == data2) && (lock2require == data3));
208 INLINE void processmsg_lockrelease_I() {
209 int data1 = msgdata[msgdataindex];
211 int data2 = msgdata[msgdataindex];
213 int data3 = msgdata[msgdataindex];
215 // receive lock release msg
216 processlockrelease(data1, data2, 0, false);
219 INLINE void processmsg_redirectlock_I() {
220 // check to see if there is a lock exist for the required obj
221 int data1 = msgdata[msgdataindex];
222 MSG_INDEXINC_I(); // lock type
223 int data2 = msgdata[msgdataindex];
224 MSG_INDEXINC_I(); // obj pointer
225 int data3 = msgdata[msgdataindex];
226 MSG_INDEXINC_I(); // redirect lock
227 int data4 = msgdata[msgdataindex];
228 MSG_INDEXINC_I(); // root request core
229 int data5 = msgdata[msgdataindex];
230 MSG_INDEXINC_I(); // request core
231 int deny = processlockrequest_I(data1, data3, data2, data5, data4, true);
234 // for 32 bit machine, the size is always 4 words, cache the msg first
235 if(BAMBOO_CHECK_SEND_MODE()) {
236 cache_msg_4_I(data4,deny==1?REDIRECTDENY:REDIRECTGROUNT,data1,data2,data3);
238 send_msg_4_I(data4,deny==1?REDIRECTDENY:REDIRECTGROUNT,data1,data2,data3);
243 INLINE void processmsg_redirectgrount_I() {
245 int data2 = msgdata[msgdataindex];
247 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
248 BAMBOO_ASSERT(lockobj == data2, 0xe207);
249 int data3 = msgdata[msgdataindex];
253 RuntimeHashadd_I(objRedirectLockTbl, lockobj, data3);
259 INLINE void processmsg_redirectdeny_I() {
261 int data2 = msgdata[msgdataindex];
263 int data3 = msgdata[msgdataindex];
265 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORESACTIVE - 1);
266 BAMBOO_ASSERT(lockobj == data2);
274 INLINE void processmsg_redirectrelease_I() {
275 int data1 = msgdata[msgdataindex];
277 int data2 = msgdata[msgdataindex];
279 int data3 = msgdata[msgdataindex];
281 processlockrelease_I(data1, data2, data3, true);
283 #endif // #ifndef MULTICORE_GC
286 INLINE void processmsg_profileoutput_I() {
287 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE != STARTUPCORE);
289 totalexetime = msgdata[msgdataindex];
295 // cache the msg first
296 if(BAMBOO_CHECK_SEND_MODE()) {
297 cache_msg_2_I(STARTUPCORE,PROFILEFINISH,BAMBOO_NUM_OF_CORE);
299 send_msg_2_I(STARTUPCORE,PROFILEFINISH,BAMBOO_NUM_OF_CORE);
303 INLINE void processmsg_profilefinish_I() {
304 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
305 int data1 = msgdata[msgdataindex];
307 profilestatus[data1] = 0;
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);
361 if(!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
365 mem = smemalloc_I(data2, data1, &allocsize);
367 // send the start_va to request core, cache the msg first
368 if(BAMBOO_CHECK_SEND_MODE()) {
369 cache_msg_3_I(data2,MEMRESPONSE,mem,allocsize);
371 send_msg_3_I(data2,MEMRESPONSE,mem,allocsize);
373 } //else if mem == NULL, the gcflag of the startup core has been set
374 // and all the other cores have been informed to start gc
380 INLINE void processmsg_memresponse_I() {
381 int data1 = msgdata[msgdataindex];
383 int data2 = msgdata[msgdataindex];
385 // receive a shared memory response msg
387 // if is currently doing gc, dump this msg
392 // Zero out the remaining memory here because for the GC_CACHE_ADAPT
393 // version, we need to make sure during the gcinit phase the shared heap
394 // is not touched. Otherwise, there would be problem when adapt the cache
396 BAMBOO_CLOSE_CUR_MSP();
397 bamboo_smem_zero_top = NULL;
399 bamboo_smem_size = 0;
403 CLOSEBLOCK(data1, data2);
404 bamboo_smem_size = data2 - BAMBOO_CACHE_LINE_SIZE;
405 bamboo_cur_msp = data1 + BAMBOO_CACHE_LINE_SIZE;
406 bamboo_smem_zero_top = bamboo_cur_msp;
408 bamboo_smem_size = data2;
409 bamboo_cur_msp =(void*)(data1);
419 INLINE void processmsg_gcstartpre_I() {
420 // the first time to be informed to start gc
423 // Zero out the remaining memory here because for the GC_CACHE_ADAPT
424 // version, we need to make sure during the gcinit phase the shared heap
425 // is not touched. Otherwise, there would be problem when adapt the cache
427 BAMBOO_CLOSE_CUR_MSP();
428 bamboo_smem_size = 0;
429 bamboo_cur_msp = NULL;
431 bamboo_smem_zero_top = NULL;
435 INLINE void processmsg_gcstartinit_I() {
439 INLINE void processmsg_gcstart_I() {
444 INLINE void processmsg_gcstartcompact_I() {
445 gcblock2fill = msgdata[msgdataindex];
447 gcphase = COMPACTPHASE;
450 INLINE void processmsg_gcstartflush_I() {
451 gcphase = FLUSHPHASE;
454 INLINE void processmsg_gcfinishpre_I() {
455 int data1 = msgdata[msgdataindex];
457 int data2 = msgdata[msgdataindex];
459 int data3 = msgdata[msgdataindex];
461 // received a init phase finish msg
462 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
464 // All cores should do init GC
466 gccorestatus[data1] = 0;
467 gcnumsendobjs[0][data1] = data2;
468 gcnumreceiveobjs[0][data1] = data3;
471 INLINE void processmsg_gcfinishinit_I() {
472 int data1 = msgdata[msgdataindex];
474 // received a init phase finish msg
475 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
477 // All cores should do init GC
478 if(data1 < NUMCORESACTIVE) {
479 gccorestatus[data1] = 0;
483 INLINE void processmsg_gcfinishmark_I() {
484 int data1 = msgdata[msgdataindex];
486 int data2 = msgdata[msgdataindex];
488 int data3 = msgdata[msgdataindex];
490 // received a mark phase finish msg
491 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
493 // all cores should do mark
494 if(data1 < NUMCORESACTIVE) {
495 gccorestatus[data1] = 0;
499 entry_index = (gcnumsrobjs_index == 0) ? 1 : 0;
502 entry_index = gcnumsrobjs_index;
504 gcnumsendobjs[entry_index][data1] = data2;
505 gcnumreceiveobjs[entry_index][data1] = data3;
509 INLINE void processmsg_gcfinishcompact_I() {
510 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
512 int cnum = msgdata[msgdataindex];
514 int filledblocks = msgdata[msgdataindex];
516 int heaptop = msgdata[msgdataindex];
518 int data4 = msgdata[msgdataindex];
520 // only gc cores need to do compact
521 if(cnum < NUMCORES4GC) {
522 if(COMPACTPHASE == gcphase) {
523 gcfilledblocks[cnum] = filledblocks;
524 gcloads[cnum] = heaptop;
531 if(gcfindSpareMem_I(&startaddr, &tomove, &dstcore, data4, cnum)) {
532 // cache the msg first
533 if(BAMBOO_CHECK_SEND_MODE()) {
534 cache_msg_4_I(cnum,GCMOVESTART,dstcore,startaddr,tomove);
536 send_msg_4_I(cnum,GCMOVESTART,dstcore,startaddr,tomove);
540 gccorestatus[cnum] = 0;
545 INLINE void processmsg_gcfinishflush_I() {
546 int data1 = msgdata[msgdataindex];
548 // received a flush phase finish msg
549 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
551 // all cores should do flush
552 if(data1 < NUMCORESACTIVE) {
553 gccorestatus[data1] = 0;
557 INLINE void processmsg_gcfinish_I() {
558 // received a GC finish msg
559 gcphase = FINISHPHASE;
560 gcprocessing = false;
563 INLINE void processmsg_gcmarkconfirm_I() {
564 BAMBOO_ASSERT(((BAMBOO_NUM_OF_CORE!=STARTUPCORE)&&(BAMBOO_NUM_OF_CORE<=NUMCORESACTIVE-1)));
565 gcbusystatus = gc_moreItems2_I();
566 // send response msg, cahce the msg first
567 if(BAMBOO_CHECK_SEND_MODE()) {
568 cache_msg_5_I(STARTUPCORE,GCMARKREPORT,BAMBOO_NUM_OF_CORE,gcbusystatus,gcself_numsendobjs,gcself_numreceiveobjs);
570 send_msg_5_I(STARTUPCORE,GCMARKREPORT,BAMBOO_NUM_OF_CORE,gcbusystatus,gcself_numsendobjs,gcself_numreceiveobjs);
574 INLINE void processmsg_gcmarkreport_I() {
575 int data1 = msgdata[msgdataindex];
577 int data2 = msgdata[msgdataindex];
579 int data3 = msgdata[msgdataindex];
581 int data4 = msgdata[msgdataindex];
583 // received a marked phase finish confirm response msg
584 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
586 BAMBOO_ASSERT(waitconfirm);
590 entry_index = (gcnumsrobjs_index == 0) ? 1 : 0;
591 gccorestatus[data1] = data2;
592 gcnumsendobjs[entry_index][data1] = data3;
593 gcnumreceiveobjs[entry_index][data1] = data4;
597 INLINE void processmsg_gcmarkedobj_I() {
598 int data1 = msgdata[msgdataindex];
600 BAMBOO_ASSERT(ISSHAREDOBJ(data1));
602 // received a markedObj msg
603 if(((struct ___Object___ *)data1)->marked == INIT) {
604 // this is the first time that this object is discovered,
605 // set the flag as DISCOVERED
606 ((struct ___Object___ *)data1)->marked = DISCOVERED;
609 gcself_numreceiveobjs++;
613 INLINE void processmsg_gcmovestart_I() {
615 gcdstcore = msgdata[msgdataindex];
617 gcmovestartaddr = msgdata[msgdataindex];
619 gcblock2fill = msgdata[msgdataindex];
623 INLINE void processmsg_gclobjinfo_I(unsigned int data1) {
625 int data2 = msgdata[msgdataindex];
627 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE <= NUMCORES4GC - 1);
629 // store the mark result info
631 gcloads[cnum] = msgdata[msgdataindex];
633 int data4 = msgdata[msgdataindex];
635 if(gcheaptop < data4) {
638 // large obj info here
639 for(int k = 4; k < data1; k+=2) {
640 int lobj = msgdata[msgdataindex];
642 int length = msgdata[msgdataindex];
644 gc_lobjenqueue_I(lobj, length, cnum);
650 INLINE 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 INLINE void processmsg_gcstartpref_I() {
672 gcphase = PREFINISHPHASE;
675 INLINE void processmsg_gcfinishpref_I() {
676 int data1 = msgdata[msgdataindex];
678 // received a flush phase finish msg
679 BAMBOO_ASSERT(BAMBOO_NUM_OF_CORE == STARTUPCORE);
681 // all cores should do flush
682 if(data1 < NUMCORESACTIVE) {
683 gccorestatus[data1] = 0;
686 #endif // GC_CACHE_ADAPT
687 #endif // #ifdef MULTICORE_GC
689 // receive object transferred from other cores
690 // or the terminate message from other cores
691 // Should be invoked in critical sections!!
692 // NOTICE: following format is for threadsimulate version only
693 // RAW version please see previous description
694 // format: type + object
695 // type: -1--stall msg
697 // return value: 0--received an object
698 // 1--received nothing
699 // 2--received a Stall Msg
700 // 3--received a lock Msg
701 // RAW version: -1 -- received nothing
702 // otherwise -- received msg type
703 int receiveObject_I() {
704 PROFILE_INTERRUPT_START();
706 // get the incoming msgs
708 if((msgdataindex == msgdatalast) && (!msgdatafull)) {
711 if(BAMBOO_CHECK_SEND_MODE()) {
712 // during send, don't process the msg now
716 // processing received msgs
718 MSG_REMAINSIZE_I(&size);
721 // have new coming msg
722 if((BAMBOO_MSG_AVAIL() != 0) && !msgdatafull) {
729 //we only ever read the first word
730 unsigned int realtype = msgdata[msgdataindex];
731 unsigned int msglength = checkMsgLength_I(realtype);
733 #if (defined(TASK)||defined(MULTICORE_GC))
734 unsigned int type = realtype & 0xff;
736 unsigned int type = realtype;
739 if(msglength <= size) {
740 // have some whole msg
746 // receive a object transfer msg
747 processmsg_transobj_I(msglength);
752 // receive a stall msg
753 processmsg_transtall_I();
758 // GC version have no lock msgs
761 // receive lock request msg, handle it right now
762 processmsg_lockrequest_I();
766 // receive lock grount msg
767 processmsg_lockgrount_I();
771 // receive lock deny msg
772 processmsg_lockdeny_I();
776 processmsg_lockrelease_I();
782 case PROFILEOUTPUT: {
783 // receive an output profile data request msg
784 processmsg_profileoutput_I();
787 case PROFILEFINISH: {
788 // receive a profile output finish msg
789 processmsg_profilefinish_I();
794 // GC version has no lock msgs
797 // receive a redirect lock request msg, handle it right now
798 processmsg_redirectlock_I();
802 case REDIRECTGROUNT: {
803 // receive a lock grant msg with redirect info
804 processmsg_redirectgrount_I();
809 // receive a lock deny msg with redirect info
810 processmsg_redirectdeny_I();
814 case REDIRECTRELEASE: {
815 // receive a lock release msg with redirect info
816 processmsg_redirectrelease_I();
818 } // case REDIRECTRELEASE
822 case STATUSCONFIRM: {
823 // receive a status confirm info
824 processmsg_statusconfirm_I();
829 processmsg_statusreport_I();
834 // receive a terminate msg
835 processmsg_terminate_I();
840 processmsg_memrequest_I();
845 processmsg_memresponse_I();
852 processmsg_gcstartpre_I();
857 processmsg_gcstartinit_I();
862 // receive a start GC msg
863 processmsg_gcstart_I();
867 case GCSTARTCOMPACT: {
868 // a compact phase start msg
869 processmsg_gcstartcompact_I();
874 // received a flush phase start msg
875 processmsg_gcstartflush_I();
880 processmsg_gcfinishpre_I();
885 processmsg_gcfinishinit_I();
890 processmsg_gcfinishmark_I();
894 case GCFINISHCOMPACT: {
895 // received a compact phase finish msg
896 processmsg_gcfinishcompact_I();
900 case GCFINISHFLUSH: {
901 processmsg_gcfinishflush_I();
906 processmsg_gcfinish_I();
910 case GCMARKCONFIRM: {
911 // received a marked phase finish confirm request msg
912 // all cores should do mark
913 processmsg_gcmarkconfirm_I();
918 processmsg_gcmarkreport_I();
923 processmsg_gcmarkedobj_I();
928 // received a start moving objs msg
929 processmsg_gcmovestart_I();
933 case GCLOBJREQUEST: {
934 // received a large objs info request msg
935 transferMarkResults_I();
940 // received a large objs info response msg
941 processmsg_gclobjinfo_I(msglength);
947 // received a gcprofiles msg
948 processmsg_gcprofiles_I();
953 #ifdef GC_CACHE_ADAPT
955 // received a gcstartpref msg
956 processmsg_gcstartpref_I();
961 // received a gcfinishpref msg
962 processmsg_gcfinishpref_I();
972 if((msgdataindex != msgdatalast) || (msgdatafull)) {
973 // still have available msg
977 // have new coming msg
978 if(BAMBOO_MSG_AVAIL() != 0) {
982 PROFILE_INTERRUPT_END();