Protecting function with #if (and removing debug print)
[charm.git] / src / conv-ccs / middle-ccs.C
1 #include "converse.h"
2
3 #if CMK_BLUEGENE_CHARM
4 #include "bgconverse.h"
5 #endif
6 #include "ccs-server.h"
7
8 extern "C" void CcsHandleRequest(CcsImplHeader *hdr,const char *reqData);
9
10 extern "C" void req_fw_handler(char *msg)
11 {
12   int offset = CmiReservedHeaderSize + sizeof(CcsImplHeader);
13   CcsImplHeader *hdr = (CcsImplHeader *)(msg+CmiReservedHeaderSize);
14   int destPE = (int)ChMessageInt(hdr->pe);
15   if (CmiMyPe() == 0 && destPE == -1) {
16     /* Broadcast message to all other processors */
17     int len=CmiReservedHeaderSize+sizeof(CcsImplHeader)+ChMessageInt(hdr->len);
18     CmiSyncBroadcast(len, msg);
19   }
20   else if (destPE < -1) {
21     /* Multicast the message to your children */
22     int len=CmiReservedHeaderSize+sizeof(CcsImplHeader)+ChMessageInt(hdr->len)-destPE*sizeof(ChMessageInt_t);
23     int index, child, i;
24     int *pes = (int*)(msg+CmiReservedHeaderSize+sizeof(CcsImplHeader));
25     ChMessageInt_t *pes_nbo = (ChMessageInt_t *)pes;
26     offset -= destPE * sizeof(ChMessageInt_t);
27     if (ChMessageInt(pes_nbo[0]) == CmiMyPe()) {
28       for (index=0; index<-destPE; ++index) pes[index] = ChMessageInt(pes_nbo[index]);
29     }
30     for (index=0; index<-destPE; ++index) {
31       if (pes[index] == CmiMyPe()) break;
32     }
33     child = (index << 2) + 1;
34     for (i=0; i<4; ++i) {
35       if (child+i < -destPE) {
36         CmiSyncSend(pes[child+i], len, msg);
37       }
38     }
39   }
40   CcsHandleRequest(hdr, msg+offset);
41   CmiFree(msg);
42 }
43
44 extern "C" void CcsSendReply(int replyLen, const void *replyData);
45 /**********************************************
46   "ccs_getinfo"-- takes no data
47     Return the number of parallel nodes, and
48       the number of processors per node as an array
49       of 4-byte big-endian ints.
50 */
51
52 void ccs_getinfo(char *msg)
53 {
54   int nNode=CmiNumNodes();
55   int len=(1+nNode)*sizeof(ChMessageInt_t);
56   ChMessageInt_t *table=(ChMessageInt_t *)malloc(len);
57   int n;
58   table[0]=ChMessageInt_new(nNode);
59   for (n=0;n<nNode;n++)
60     table[1+n]=ChMessageInt_new(CmiNodeSize(n));
61   CcsSendReply(len,(const char *)table);
62   free(table);
63   CmiFree(msg);
64 }
65
66 //////////////////////////////////////////////////////////////////// middle-debug.C
67
68 extern "C" {
69
70 CpvDeclare(void *, debugQueue);
71 CpvDeclare(int, freezeModeFlag);
72
73 /*
74  Start the freeze-- call will not return until unfrozen
75  via a CCS request.
76  */
77 void CpdFreeze(void)
78 {
79   CpdNotify(CPD_FREEZE,getpid());
80   if (CpvAccess(freezeModeFlag)) return; /*Already frozen*/
81   CpvAccess(freezeModeFlag) = 1;
82 #if ! CMK_BLUEGENE_CHARM
83   CpdFreezeModeScheduler();
84 #endif
85 }
86
87 void CpdUnFreeze(void)
88 {
89   CpvAccess(freezeModeFlag) = 0;
90 }
91
92 int CpdIsFrozen(void) {
93   return CpvAccess(freezeModeFlag);
94 }
95
96 }
97
98 #if CMK_BLUEGENE_CHARM
99 #include "blue_impl.h"
100 void BgProcessMessageFreezeMode(threadInfo *t, char *msg) {
101 //  CmiPrintf("BgProcessMessageFreezeMode\n");
102 #if CMK_CCS_AVAILABLE
103   void *debugQ=CpvAccess(debugQueue);
104   CmiAssert(msg!=NULL);
105   int processImmediately = CpdIsDebugMessage(msg);
106   if (processImmediately) BgProcessMessageDefault(t, msg);
107   while (!CpvAccess(freezeModeFlag) && !CdsFifo_Empty(debugQ)) {
108     BgProcessMessageDefault(t, (char*)CdsFifo_Dequeue(debugQ));
109   }
110   if (!processImmediately) {
111     if (!CpvAccess(freezeModeFlag)) BgProcessMessageDefault(t, msg); 
112     else CdsFifo_Enqueue(debugQ, msg);
113   }
114 #else
115   BgProcessMessageDefault(t, msg);
116 #endif
117 }
118 #endif